打印

键盘扫描采用反转法读键

[复制链接]
1832|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xnwxq|  楼主 | 2009-8-23 18:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
键盘扫描采用反转法读键:先从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<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--)               //延时
     {}
     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)
  ;
}
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我们都是风雨中的孩子,手牵着手才不会跌倒

162

主题

294

帖子

1

粉丝