鍵盤掃描采用反轉(zhuǎn)法讀鍵:先從P2口的高4位輸出零電平,從P2口的低4位讀取鍵盤狀態(tài);再從P2口的低4位輸出零電平,從P2口的高4位讀取鍵盤狀態(tài),將兩次讀取的結(jié)果組合起來就可以得到當(dāng)前按鍵的特征碼(見程序中TABLE表)。有了這張表就可以編程,將它們轉(zhuǎn)換成順序碼。用當(dāng)前讀得的特征碼來順序查表,用一單元記錄查找次數(shù)。當(dāng)在表中查到有該特征碼時,它的位置(即查找次數(shù))就是對應(yīng)的順序碼。對應(yīng)的鍵盤查鍵程序如下:
KEY: MOV P2,#0FH ;用反轉(zhuǎn)法查鍵
MOV A,P2
ANL A,#0FH
MOV B,A
MOV P2,#0F0H
MOV A,P2
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEY1
RET ;無鍵按下
KEY1: MOV B,A ;有鍵按下,存鍵碼
MOV DPTR,#TABLE
MOV R3,#0FFH ;存順序碼單元初始化
KEY2: INC R3
MOV A,R3
MOVC A,@A+DPTR
CJNE A,B,KEY3 ;判鍵碼,求順序碼
MOV A,R3 ;若找到鍵碼,存順序碼
RET
KEY3: CJNE A,#0FFH,KEY2;判是否查完
RET ;已查完,鍵碼未找到,以無按鍵處理
TABLE: DB 77H,7BH,0BBH ;按鍵特征碼表
DB 0DBH,7DH,0BDH
DB 0DDH,7EH,0BEH
DB 0DEH,0B7H,0D7H
DB 0EEH,0EDH,0EBH
DB 0E7H,0C7H,0FFH
用C語言的寫法
#include
#include
#include
#include
#include
#includeCC.h>
#define uchar unsigned char
#define uint unsigned int
keysCAN()
{
uchar i,h=0xfe;
for(i=4,P1=h;i>0;i--) //掃描
{
if((P1&0xf0)!=0xf0) //有鍵按下?
{
uchar a;
for(a=255;a>0;a--) //延時
{}
if((P1&0xf0)!=0xf0) //有鍵按下
{
uchar key,p;
p=P1;
for(key=0;key<16;key++) //查表
{
uchar code keytab[]={0xEE,0xDE,0xBE,0x7E, //鍵碼表
0xED,0xDD,0xBD,0x7D,
0xEB,0xDB,0xBB,0x7B,
0xE7,0xD7,0xB7,0x77};
if(p==keytab[key]) //查到返回返回鍵號
{
P1=0xff;
return(key);
}
}
}
}
h=_crol_(h,1);
P1=h;
}
P1=0xff;
return(16); //沒查到返回16
}
main()
{ while(1)
{P0=keyscan();
while(1)
;
}
}