C51行列鍵盤(pán)掃描程序
#i nclude "reg51.h"
void main()
{
unsigned char key;
while(1)
{
key=kbscan(); //鍵盤(pán)掃描函數(shù)
delay10ms(); //健消除抖動(dòng)的延時(shí)函數(shù)
}
}
void delay10ms()
{
unsigned char i;
for(i=0xff;i>0;i--);
}
unsigned char kbscan()
{
unsigned char sccode,recode;
P1=0xf0; //發(fā)全“0”行掃描,列線輸入
if(P1&0xf0)!=0xf0) //有鍵按下
{
delay10ms(); //延時(shí)去抖動(dòng)
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; //無(wú)鍵按下,返回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; /*鍵盤(pán)狀態(tài)flag(靜態(tài)局部變量) */ 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鍵盤(pán)掃描程序 * 返 回:鍵序號(hào)(0~f),0xff表示沒(méi)有字符輸入 * * 硬件連接:p1口(高4位 - 行;低4位 - 列) * 軟件特點(diǎn):簡(jiǎn)潔高效,無(wú)須延時(shí)消抖,避免連發(fā)
|
|