×
单片机 > 单片机程序设计 > 详情

8051单片机的反转法扫描键盘

发布时间:2020-05-28 发布时间:
|

键盘扫描采用反转法读键:先从P2口的高4位输出零电平,从P2口的低4位读取键盘状态;再从P2口的低4位输出零电平,从P2口的高4位读取键盘状态,将两次读取的结果组合起来就可以得到当前按键的特征码(见程序中TABLE表)。有了这张表就可以编程,将它们转换成顺序码。用当前读得的特征码来顺序查表,用一单元记录查找次数。当在表中查到有该特征码时,它的位置(即查找次数)就是对应的顺序码。对应的键盘查键程序如下:


KEY: MOV P2,#0FH ;用反转法查键 
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) 


}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些