?? keyscan.c
字號:
#include <reg52.h>
//#include <at89x52.h>
//unsigned char code BCD[]={0x3f,0x06,0x5b,0x4f, //此處是將0-F轉換成相應的BCD碼
// 0x66,0x6d,0x7d,0x07,
// 0x7f,0x6f,0x77,0x7c,
// 0x39,0x5e,0x79,0x71};
//unsigned char code KEY[]={0x00,0x00,0x01,0x02,0x03,//此處是為使程序通用,當鍵值不是按
// 0x04,0x05,0x06,0x07,//這個排列時,把此表更改即可
// 0x08,0x09,0x0a,0x0b,//最前面的那個0x00是為了查表方便,
// 0x0c,0x0d,0x0e,0x0f};//因為鍵值是從1開始的
sfr key_port=0x90; //定義P1口為鍵盤掃描口
bit key_ok=0; //有鍵按下的標志
/*************延時子程序*************
****調用一次用時18微秒,t每加1,用時增加6微秒*/
void delay(unsigned char t)
{
while(t--);
}
unsigned char r_left(unsigned char x)//循環左移一位
{
x<<=1;
x++;
return(x);
}
/*************粗判有無鍵按下**********
****有鍵按下則將key_ok置1************/
void scan_full(void)
{
unsigned char temp;
key_port=0xf0; //低半字節為行線,高半字節為列線
temp=P1;
if(temp!=0xf0)
key_ok=1;
else key_ok=0;
}
/************鍵盤掃描程序*************************
****功能:返回鍵值,當無鍵按下時,返回0*************/
unsigned char key_scan(void)
{
unsigned char temp,count=0x01,key_value;//按鍵返回值
unsigned char x_scan=0xfe,y_scan=0xef;//行、列掃描碼
unsigned char i,j,y; //行數和列數
while(1)
{
scan_full(); //粗判是否有鍵按下
if(key_ok==1)
{
key_ok=0;
delay(200); //延時去抖動
scan_full(); //再次粗判是否有鍵按下
if(key_ok==1)
{
for(i=0;i<4;i++) //掃描4行
{
key_port=x_scan;
for(j=0;j<4;j++) //每行4列
{
temp=key_port;
temp=temp&0xf0;
y=y_scan&0xf0;
if(temp==y)
{
while(key_ok!=0)//等待按鍵松開
{
scan_full();
}
key_value=count;
return(key_value);//找到鍵值,馬上返回
}
else
{
count++;
y_scan=r_left(y_scan);
}
}
y_scan=0xef; //掃描完一列,重新對列掃描量賦初值
x_scan=r_left(x_scan);//行掃描碼左移一位,掃描下一行
}
}
}
return(key_value);//沒鍵按下,返回0
}
}
//unsigned char key(void)
//{
// unsigned char x;
// unsigned char y;
// x=key_scan();
// return(x);
//y=KEY[x];
//return y;
//}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -