C51行列键盘扫描程序

来源:互联网 发布:thinkphp商城项目源码 编辑:程序博客网 时间:2024/04/30 13:54

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位 - 列)
* 软件特点:简洁高效,无须延时消抖,避免连发