|
鍵盤掃描采用反轉(zhuǎn)法讀鍵:先從P2口的高4位輸出零電平,從P2口的低4位讀取鍵盤狀態(tài);再?gòu)腜2口的低4位輸出零電平,從P2口的高4位讀取鍵盤狀態(tài),將兩次讀取的結(jié)果組合起來就可以得到當(dāng)前按鍵的特征碼(見程序中TABLE表)。有了這張表就可以編程,將它們轉(zhuǎn)換成順序碼。用當(dāng)前讀得的特征碼來順序查表,用一單元記錄查找次數(shù)。當(dāng)在表中查到有該特征碼時(shí),它的位置(即查找次數(shù))就是對(duì)應(yīng)的順序碼。對(duì)應(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語(yǔ)言的寫法 #include<reg52.h> #include<math.h> #include<stdio.h> #include<bin2hex.h> #include<intrins.h> #include<absacc.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--) //延時(shí) {} 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]) //查到返回返回鍵號(hào) { P1=0xff; return(key); } } }
} h=_crol_(h,1); P1=h; } P1=0xff; return(16); //沒查到返回16 }
main() { while(1) {P0=keyscan(); while(1) ; } } |