感覺(jué)比較好的矩陣鍵盤(pán)掃描程序
=================================================================
uchar code key_table[]=
{
0x77,
0x7b,
0x7d,
0xb7,
0xbb,
0xbd,
0xd7,
0xdb,
0xdd,
0xe7,
0xeb,
0xed
};
/*上面的數(shù)組要自己事先計(jì)算好,只要把行和列的值連接在一起就可以得到相應(yīng)按鍵對(duì)應(yīng)的值了*/
unsigned char key_scan(void )
{
unsigned char i, key_code;/*變量的聲明*/
key_port = 0x0f;/*這里的key_port是在前面宏定義的一個(gè)GPIO口,
先將行(或者列)置位*/
if(key_port != 0x0f)/*如果有按鍵按下則GPIO的初值就會(huì)變化,
就會(huì)執(zhí)行下面的語(yǔ)句*/
{
delay(5);/*這里是的延時(shí)實(shí)現(xiàn)的是消抖,這里就不作介紹了*/
if(key_port != 0x0f)/*確定真的有按鍵按下*/
{
key_code = key_port;/*把行(或者列)的值賦給key_code*/
key_port = 0xf0;/*再把列(或者行置位)*/
key_code |= key_port;/*把行和列的值組合起來(lái)并賦值給key_code*/
for(i = 0; i 12; i++)/*因?yàn)槊恳粋€(gè)按鍵按下對(duì)應(yīng)的key_code只有一個(gè),
所以根據(jù)矩陣鍵盤(pán)的按鍵個(gè)數(shù)用相應(yīng)的FOR循環(huán)就可以確定到底是哪一個(gè)按鍵被按下*/
{
if(key_table[i] == key_code)
{
key = i+1;
break;
}
}
}
}
else key = 0;
return key;/*返回的KEY值就是,相應(yīng)位置的按鍵了*/
}
評(píng)論