跟独立按键一样,矩阵键盘也可以用三行按键法编程,不仅可以大大减少代码量,还可以提升编程速度。
首先要进行和列扫描,读取键值,原理与上一篇博客的状态机法相同,先给高四位赋值为0,再给低四位赋值为0,来判断按键所在的行和列。
以下为读取键值的函数源码:
unsigned char KBD_KeyIO_ThreeLine()
{
unsigned char key_io = 0xff;
P3=0xf0;P4=0xff; //行扫描
if(P44==0) key_io=0x70;
if(P42==0) key_io=0xb0;
if(P35==0) key_io=0xd0;
if(P34==0) key_io=0xe0;
P3=0x0f;P4=0x00; //列扫描
if(P33==0) key_io=key_io | 0x07;
if(P32==0) key_io=key_io | 0x0b;
if(P31==0)key_io=key_io | 0x0d;
if(P30==0) key_io=key_io | 0x0e;
return key_io;
}
解释:
例如 :S7按下,那么P30,P44为0,其他的位都是1,所以P44_P42_P35_P34_P33_P32_P31_P30为0111 1110,也可以表示为0x7f,其它的按键同理。那么分别进行行扫描和列扫描,在进行行扫描的时候对key_io赋值,列扫描的时候进行 | 操作,就可以得到最后的字节数据,并返回该值。
三行按键法:
三行按键法原理比较难懂,大家也没有必要硬抠,能记住就好了。矩阵键盘的三行按键法与独立按键的写法极其相似:
unsigned char Trg;
unsigned char Cont;
void KBD_Read_ThreeLine()
{
unsigned char ReadData = KBD_KeyIO_ThreeLine() ^ 0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
}
在执行操作函数里我们是通过Trg的值来判断按下的是哪一个键。
键值查找表:
S7 0x81 |
S11 0x41 |
S15 0x21 |
S19 0x11 |
S6 0x82 |
S10 0x42 |
S14 0x22 |
S18 0x12 |
S5 0x84 |
S9 0x44 |
S13 0x24 |
S17 0x14i |
S4 0x88 |
S8 0x48 |
S12 0x28 |
S16 0x18 |
在函数中判断键值的话,就可以直接使用if语句进行判断,例如:if(Trg==0x81),判断的就是S7是否按下。
最后是一个简单的程序示例:
unsigned char cnt_kbd;
unsigned char kbd_number;
void KBD_Process(void)
{
if(cnt_kbd>=10)
{
cnt_kbd=0;
KBD_Read_ThreeLine(); //每10ms执行一次读取键值函数
if(Trg==0x88) //S4按下
{
kbd_number++; //这里可以通过对按键的判断执行任何操作,我这里是每当S4按下时让 kbd_number这个变量+1
}
}
}
void Timer2_ISR(void) interrupt 12
{
cnt_kbd++;
}