經典矩陣按鍵掃描:
unsigned char Check_key(void)
{
unsigned char row,col,temp1,temp2,keyvalue;
temp1 = 0x01;
for(row=0;row<4;row++) // 行掃
{
P0 = 0xF0; // 先將P0.4~P0.7置高
P0 = ~temp1; // 使P0.1~P0.3中有一位為0
temp1 *= 2; // temp1左移一位
if((P0 & 0xF0) < 0xF0) // 當按鍵按下時,(P0 & 0xF0) 高四位不在是F,可能為7或B或D或E。
{ // 這時可以確定按下的是(row+1)行
temp2 = 0x80;
for(col=0;col<4;col++) // 列掃
{
if((P0 & temp2)==0x00) // 當(P0 & temp2)等于0x00時,可以確定按下的位置是(col+1)列
{
keyvalue = row*4+col; // 得到所按下按鍵的鍵值
return keyvalue; // 把得到的鍵值作為返回值
}
temp2 /= 2; // temp2右移一位
}
}
}
return 16; // 因為定義數碼管段選表中,16對應的是全滅,故無按鍵按下時返回16
} |