蓝桥杯 矩阵键盘的使用

文章目录


前言

矩阵键盘是通过行列扫描检测,相当于坐标确定按键按下的位置。

矩阵键盘相对独立按键来说,占用I/O口较少,4X4键盘共16个位置,占用了8(4+4)个I/O口。独立按键8个I/O口对应8个按键。

使用情况:

当按键使用量少时,使用独立按键,操作更加方便。

当按键使用量较多时,建议使用矩阵键盘,节省I/O。


一、矩阵键盘的原理

图片来源:百度

如图所示,共占用了8条线路(8个I/O口),垂直方向连接按键的4条线路分别为L1、L2、L3、L4;水平方向连接按键的4条线路分别为H1、H2、H3、H4。

将其想象为坐标,L为x方向,H为y方向。当S1按下时,坐标为(1,1);当S8按下时,坐标为(4,2)。

按照上面的理解,矩阵键盘在没有按下的状态为高电平,即为'1',当有按键按下时,状态为'0'。

矩阵键盘按照行列式方法进行扫描,如按列扫描就是先检测x=1的一列上是否有为0的按键,再扫描x=2的一列上是否有为0的按键,x=3的一列上是否有为0的按键,x=4的一列上是否有为0的按键。但是,检测到只是检测到,矩阵键盘的使用需要在检测到之后执行相应的代码。如:若(2,3)按键按下,输出(2,3)。

二、使用步骤

1.准备

矩阵键盘的使用中会存在逻辑运算,何为逻辑运算?就是与或非等运算。

接下来通过实例进行讲解逻辑运算:

设P0=XXXX XXXX(X为未知状态,不知道为0还是为1)

(1)或运算(符号: '|')

P0|0x0f
XXXX XXXX 
0000 1111 
---------
XXXX 1111

通过或运算,可将P0的后4为置1;

(2)与运算(符号: '&')

P0&0x0f
XXXX XXXX 
0000 1111 
---------
0000 XXXX

通过或运算,可将P0的前4为置0;

(3)非运算(符号: '~')设P0=0101 0101

P0=~P0
0101 0101
---------
1010 1010

通过非运算,可将P0的0变为1,1变为0;

2.代码

代码如下(示例):

unsigned char temp;//定义temp变量
	
	P44=0;P42=1;P3=0X7F;//0111 1111 扫描第一列(行)
	temp=P3;						//0111 1111
	temp=temp&0X0F;//0111 1111 & 0000 1111 == 0000 1111
                    //通过逻辑运算将temp的高4位置0
	if(temp!=0X0F)        /检测到有按键按下
	{                        //
		Delayms(5);          //矩阵键盘消抖
		temp=P3;			///重新赋值
		temp=temp&0X0F;      //
		if(temp!=0X0F)       //再次判断
		{
			temp=P3;
			switch(temp)//当temp的低4位中有按键按下时,0111 1111 的低4位就会改变
			{               //通过这种方法检测按键
				case 0X7E: num=1;break;
				case 0X7D: num=2;break;
				case 0X7B: num=3;break;
				case 0X77: num=4;break;
			}
			while(temp!=0x0f)        //当按键没有松手时,重新赋值,再次检测
			{
				temp=P3;
				temp=temp&0X0F;
			}	
		}
	}
	
	P44=1;P42=0;P3=0XBF;//1011 1111     //后面是顺序扫描剩余列,方法相同,数值稍有改变
	temp=P3;						//0111 1110
	temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;						
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XBE: num=5;break;
				case 0XBD: num=6;break;
				case 0XBB: num=7;break;
				case 0XB7: num=8;break;
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0X0F;
			}	
		}
	}
	
	P44=1;P42=1;P3=0XDF;//1101 1111 
	temp=P3;						//0111 1110
	temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;						
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XDE: num=9;break;
				case 0XDD: num=10;break;
				case 0XDB: num=11;break;
				case 0XD7: num=12;break;
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0X0F;
			}	
		}
	}
	
	P44=1;P42=1;P3=0XEF;//1110 1111 
	temp=P3;						//0111 1110
	temp=temp&0X0F;//0111 1110 & 0000 1111 == 0000 1111
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;						
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XEE: num=13;break;
				case 0XED: num=14;break;
				case 0XEB: num=15;break;
				case 0XE7: num=16;break;
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0X0F;
			}	
		}
	}

总结

这就是矩阵键盘的使用及原理,在使用矩阵键盘时,要注意矩阵键盘和独立按键的短接线接在哪个位置。

还有就是,并非所有情况都适用矩阵键盘,矩阵键盘节省I/O口,但是相应的增加了代码量,占用了大量内存。在不需要节省I/O口或内存有限时,应使用独立按键。

——————————————————————————————————————
本文纯原创,如有侵权请联系删除,如有错误,敬请批评指正,谢谢大家。

猜你喜欢

转载自blog.csdn.net/G_Shengn/article/details/112481947