与平时的矩阵键盘扫描方法基本相似,扫描按键识别的过程如下。 1)、判断键盘中是否有按键按下。将I/O口输出0xf0,然后读I/O口状态。只要读回值不等于0xf0,则说明有键按下并且保存读回值(实际编程时,还要考虑按键的消抖)。如读回值等于0xf0,则表示无键按下。
2)、判断闭合键所在位置。在确认有键按下后,即可进入确定具体哪个键按下的过程。其思路是:将I/O口输出0x0f,然后读I/O口状态并且保存读会值,将两次的读回值相或就得到闭合按键的位置。
所谓“反转扫描”是根据扫描按键时,按键所在I/O口输出值由0xf0转为0x0f而得名。
[P][CODE]uchar flag;
uchar keycode[16]={ 0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77, };//矩阵键盘按键码
unsigned char key_done() //按键反转法扫描
{ unsigned char row,col,i,k=16; flag=0; P4DIR=0xf0; P4OUT=0x0f; if((P4IN&0x0f)!= 0x0f) { delay1ms(5); if((P4IN&0x0f)!= 0x0f) { col=P4IN&0x0f; P4DIR=0x0f; P4OUT=0xf0; row=P4IN&0xf0; for(i=0; i<16; i++) { if((row|col)==keycode[I]) { k=i; flag=1; break; } } } P4DIR=0xf0; P4OUT=0x0f; while((P4IN&0x0f)!=0x0f); } return k;
}
[/CODE]
[/P][P][/P][P]注意:矩阵键盘行线、列线均要接上拉电阻。[/P][P]原理图:[FACE=宋体][SIZE=10px] [/FACE][/SIZE]
[upload=2085,0]4x4.png[/upload][/P] |