访问手机版页面
你的位置:老古开发网 > 51单片机 > 51单片机键盘按键 > 正文  
干货!8051单片机的反转法扫描键盘
内容导读:

键盘扫描采用反转法读键:先从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)

;

}

}

标签:单片机,
来源:网络整理 作者:工程师2 时间:2018/5/28 10:43:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐