一、原理
可以看到矩阵键盘的每一列都与P33P34P42P44相连,并且每行都与P30P31P32P33相连。
所以只需要先清零之后,再用按键扫描之后就可以实现矩阵键盘的控制
二、编程
unsigned char Key_Read(void)
{
unsigned int Key_New;
unsigned char Key_Value;
P44=0;P42=1;P35=1;P34=1;
Key_New =P3 & 0X0F;
P44=1;P42=0;P35=1;P34=1;
Key_New =(Key_New<<4)|(P3 & 0X0F);
P44=1;P42=1;P35=0;P34=1;
Key_New =(Key_New<<4)|(P3 & 0X0F);
P44=1;P42=1;P35=1;P34=0;
Key_New =(Key_New<<4)|(P3 & 0X0F);
switch(~Key_New)
{
case 0x8000:Key_Value=4;break;
case 0x4000:Key_Value=5;break;
case 0x2000:Key_Value=6;break;
case 0x1000:Key_Value=7;break;
case 0x0800:Key_Value=8;break;
case 0x0400:Key_Value=9;break;
case 0x0200:Key_Value=10;break;
case 0x0100:Key_Value=11;break;
case 0x0080:Key_Value=12;break;
case 0x0040:Key_Value=13;break;
case 0x0020:Key_Value=14;break;
case 0x0010:Key_Value=15;break;
case 0x0008:Key_Value=16;break;
case 0x0004:Key_Value=17;break;
case 0x0002:Key_Value=18;break;
case 0x0001:Key_Value=19;break;
default:Key_Value=0;
}
return Key_Value;
}
例如我们需要扫描按键并得出对应的数显示在数码管上
定义16位标志位(因为有四行四列需要扫描4*4次)
每次扫描完之后将P3的值赋给Value,再左移4位再次扫描
扫描到对应按键按下后,将对应值赋值给value
就完成了矩阵键盘的扫描
后续主函数中定义矩阵按键处理和显示处理函数
主函数中放置关闭外设初始化函数,定时器1初始化函数,打开中断,while循环中放置矩阵按键处理和显示处理函数,最后在中断中放入数码管显示函数。
主要来讲讲矩阵按键处理和显示处理函数
按键处理函数中有三个标志位(主要来确定是否有下降沿)
分别是Q(Key_Value),Q非(Key_Old),Q_down(Key_Down)
在函数中我们要确定是否有下降沿跳变(按键是否按下)
就需要把扫描得到值赋给Q,再让Q和Q非异或之后与Q
这样就实现了
再把Q非的值赋给Q
把得到的Q_down(即扫描的到的数据)赋值给显示标志位
其次是显示
利用sprintf把显示标志位转换成字符串
再转换成十六进制数组
利用中断显示就完成了