新闻  |   论坛  |   博客  |   在线研讨会
C51行列键盘扫描程序
szyth | 2008-08-15 10:49:10    阅读:7559   发布文章

C51行列键盘扫描程序

#i nclude "reg51.h"

void main()

{

unsigned char key;

while(1)

{

   key=kbscan();   //键盘扫描函数

  delay10ms();  //健消除抖动的延时函数

 

}

}

void delay10ms()

{

    unsigned char i;

   for(i=0xff;i>0;i--);

}

 

unsigned char kbscan()

{

  unsigned char sccode,recode;

 P1=0xf0;  //发全“0”行扫描,列线输入

if(P1&0xf0)!=0xf0)  //有键按下

   delay10ms();   //延时去抖动

   if((P1&0xf0)!=0xf0)

{

   sccode =0xf0;    //逐行扫描初值

 while((sccodeZ&0x10)!=0)

  {

    P1=sccode;     //输出行扫描码

   if((P1&0XF0)!=0XF0)  //本行有键按下

{

  ecode=(P1&0xf0)|0xf0;

  return((~sccode)+(~recode);  //返回特征码

}

 else

  sccode=(sccode<<1)|0x01;  //行扫描码左移一位

 }

}

}

  return 0;  //无键按下,返回0

}

#i nclude <reg51.h>
#define byte unsigned char
#define kbd_port p1
byte code key[16]={0xeb,0xd7,0xdb,0xdd, //0 1 2 3
0xb7,0xbb,0xbd,0x77, //4 5 6 7
0x7b,0x7d,0xe7,0xed, //8 9 - +
0xee,0xde,0xbe,0x7e}; //= * / c
byte k_input(void)
{
static bit k_status; /*键盘状态flag(静态局部变量) */
byte i,k;
kbd_port=0x0f;
k=kbd_port;
kbd_port=0xff;
kbd_port=k|0xf0;
k=kbd_port;
kbd_port=0xff;
if(k!=0xff)
{
for(i=0;i<16;i++)
{
if(k==key && k_status==0)
{
k_status=1;
return(i);
}
}
}
else
k_status=0;
return(0xff);

* 功  能:4×4键盘扫描程序
* 返  回:键序号(0~f),0xff表示没有字符输入
*
* 硬件连接:p1口(高4位 - 行;低4位 - 列)
* 软件特点:简洁高效,无须延时消抖,避免连发

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客