"); //-->
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位 - 列)
* 软件特点:简洁高效,无须延时消抖,避免连发
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。