;----------------------------------------------------------------------------------------
P1口外接4×4按鍵, 常用的讀出鍵值的方法有“查表法”和“反轉(zhuǎn)法”。
查表法的程序最為簡短,但是稍多占用一點存儲空間;反轉(zhuǎn)法的程序執(zhí)行速度最快,只是要求接口是雙向的。
下面分別給出了使用查表法和反轉(zhuǎn)法讀取鍵值的程序。
;----------------------------------------------------------------------------------------
#include
#include
#define uint unsigned int
#define uchar unsigned char
/**************************************************************
* 名稱:Key_Tab()
* 功能:P1外接4×4按鍵, 按照查表法讀出鍵值
* 返回:按鍵值0~15/如無鍵按下, 返回16
***************************************************************/
uchar Key_Tab(void)
{
uchar code K_Tab[4][4] = {
0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
uchar temp1 = 0xfe, temp2, i, j;
for(i = 0; i < 4; i++) { //掃描低四位
P1 = temp1; //輸出一行0
temp2 = P1; //馬上就讀入
if((temp2 & 0xf0) != 0xf0) { //如果有鍵按下
for(j = 0; j < 4; j++) //就掃描高四位
if(temp2 == K_Tab[i][j]) //查表
return i * 4 + j; //查到了就返回按鍵的數(shù)值
}
else temp1 = _crol_(temp1, 1);
}
return 16; //沒有查到,返回按鍵松開的代碼
} //呵呵,實質(zhì)性的語句不過9行,就是這么簡練!
;----------------------------------------------------------------------------------------
/**************************************************************
* 名稱:KeyRvs()
* 功能:P1外接4×4按鍵, 按照反轉(zhuǎn)法讀出鍵值
* 輸出:按鍵值0~15/如無鍵按下, 返回16
***************************************************************/
uchar KeyRvs(void)
{
uchar temH, temL, key;
P1 = 0xf0; temH = P1;//低四位先輸出0;讀入,高四位含有按鍵信息
P1 = 0x0f; temL = P1;//然后反轉(zhuǎn)輸出0;讀入,低四位含有按鍵信息
//-----------------------------------------------------
//兩次讀入的時間間隔,必須盡量的小,以盡量避免按鍵狀態(tài)發(fā)生變化
//有些人給出的程序,就沒有注重這些,有些程序甚至還有間隔幾個毫秒的!
//要知道,按鍵是會抖動的,夜長夢多,真不知道讀出些什么!
//呵呵,做而論道給出的這個程序,讀鍵的準(zhǔn)確性最高。
//-----------------------------------------------------
switch(temH) {
case 0xe0: key = 0; break;
case 0xd0: key = 1; break;
case 0xb0: key = 2; break;
case 0x70: key = 3; break;
default: return 16;//按下的不是上述按鍵,就當(dāng)是沒有按鍵
}
switch(temL) {
case 0x0e: return key;
case 0x0d: return key + 4;
case 0x0b: return key + 8;
case 0x07: return key + 12;
default: return 16;//按下的不是上述按鍵,就當(dāng)是沒有按鍵
}
}//本程序雖然稍多幾行,但是沒有循環(huán),還可以提前返回,所以執(zhí)行的速度最快
;----------------------------------------------------------------------------------------