這個程序是我在寫一個計算器的程序的時候想出來的,總感覺常用的鍵盤掃描程序用起來很麻煩,總是要一行一行的進行掃描,看起來也很繁瑣,于是自己想了一個矩陣鍵盤的掃描程序,原理很簡單的!
這個程序的基本思路是兩條相交直線只有一個交點的原理,說白了就是先檢測行,再檢測列,或者倒過來也可以。
這個鍵盤掃描子程序是一個有返回值的無參函數,需要之前計算好一個數組就OK了!
下面是子函數的實現,我在這里只用一個3*4的矩陣鍵盤為例,原理都是一樣的!
=================================================================
uchar code key_table[]= { 0x77, 0x7b, 0x7d, 0xb7, 0xbb, 0xbd, 0xd7, 0xdb, 0xdd, 0xe7, 0xeb, 0xed }; /*上面的數組要自己事先計算好,只要把行和列的值連接在一起就可以得到相應按鍵對應的值了*/ unsigned char key_scan(void ) { unsigned char i, key_code; /*變量的聲明*/ key_port = 0x0f; /*這里的key_port是在前面宏定義的一個GPIO口,先將行(或者列)置位*/ if(key_port != 0x0f) /*如果有按鍵按下則GPIO的初值就會變化,就會執行下面的語句*/ { delay(5); /*這里是的延時實現的是消抖,這里就不作介紹了*/ if(key_port != 0x0f) /*確定真的有按鍵按下*/ { key_code = key_port; /*把行(或者列)的值賦給key_code*/ key_port = 0xf0; /*再把列(或者行置位)*/ key_code |= key_port; /*把行和列的值組合起來并賦值給key_code*/ for(i = 0; i < 12; i++) /*因為每一個按鍵按下對應的key_code只有一個,所以根據矩陣鍵盤的按鍵個數用相應的FOR循環就可以確定到底是哪一個按鍵被按下*/ { if(key_table[i] == key_code) { key = i+1; break; } } } } else key = 0; return key; /*返回的KEY值就是,相應位置的按鍵了*/ } ========================================================= 程序到這里結束了,如果有什么建議或者不明白的地方可以給我留言^_^!