【藍橋杯單片機06】矩陣鍵盤的基本控制
廣東職業技術學院 歐浩源
掌握了獨立按鍵的處理思路之后,也不是那么輕易的能夠學會矩陣鍵盤的,兩者的處理思路有很大的不同,不過,只要把矩陣鍵盤的本質思想搞清楚了,不過是4X4的還是8X8的,都能夠很輕松的處理。
1、矩陣鍵盤的掃描思想
與獨立按鍵不同的是,按鍵的兩個引腳都分別連接的單片機的I/O端口,一個作為行信號,另外一個作為列信號。我們以4X4的矩陣鍵盤為例,試着探討其工作方式和掃描思路。
在上面的矩陣鍵盤中,要識別出黃色按鍵的按下狀態,應該怎么做呢?
對與矩陣鍵盤,我們只能逐行掃描,然后讀取列的狀態信號。如果R3行輸出低電平,那么黃色按鍵如果有按下動作的話,那讀取C2列信號也應該為低電平,而該行上其他沒有按下動作的按鍵的列信號則為高電平。因此,我們可以得到矩陣鍵盤的基本掃描步驟:
<1> R1輸出點電平,R2、R3、R4輸出高電平,逐個讀取判斷列信號,如果都為高電平則R1行上沒有按鍵按下。
<2> R2輸出點電平,R1、R3、R4輸出高電平,逐個讀取判斷列信號。
<3> R3輸出點電平,R1、R2、R4輸出高電平,發現C2列信號為低電平,那么可以判斷得R3行的C2列的按鍵有按下動作。
<4> R4輸出點電平,R1、R3、R4輸出高電平,逐個讀取判斷列信號。
如此循環往復,掃描的按鍵的狀態。
我們知道有按鍵按下動作,那么又怎么知道是哪一個按鍵按下呢?這時,我們最好定義一個鍵值全局變量,給矩陣行列上的每一個的按鍵編一個唯一的號碼。當掃描的某一行某一列的按鍵動作后,把對應的編號復制給鍵值變量,這樣我們判斷這個鍵值,就知道是那個按鍵有觸發動作了。
說得再多,不如一練,看題。
2、單元訓練題目
3、實現源碼參考
#include "reg52.h" sfr P4 = 0xC0; sbit HC138_A = P2^5; sbit HC138_B = P2^6; sbit HC138_C = P2^7; sbit R1 = P3^0; sbit R2 = P3^1; sbit R3 = P3^2; sbit R4 = P3^3; sbit C1 = P4^4; sbit C2 = P4^2; sbit C3 = P3^5; sbit C4 = P3^4; unsigned char keyNum = 0x10; unsigned char code SMG_NoDot[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f}; void Delay(unsigned char t) { while(t--); } void Init74HC138(unsigned char n) { switch(n) { case 4: HC138_A = 0; HC138_B = 0; HC138_C = 1; break; case 5: HC138_A = 1; HC138_B = 0; HC138_C = 1; break; case 6: HC138_A = 0; HC138_B = 1; HC138_C = 1; break; case 7: HC138_A = 1; HC138_B = 1; HC138_C = 1; break; case 8: HC138_A = 0; HC138_B = 0; HC138_C = 0; break; } } void ShowKeyNum(unsigned char value) { Init74HC138(6); P0 = 0x01; Init74HC138(7); P0 = value; } void ScanKeys() { keyNum = 16; R1 = 0; R2 = R3 = R4 = 1; C1 = C2 = C3 = C4 = 1; if(C1 == 0) { while(C1 == 0); keyNum = 0; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C2 == 0) { while(C2 == 0); keyNum = 1; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C3 == 0) { while(C3 == 0); keyNum = 2; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C4 == 0) { while(C4 == 0); keyNum = 3; ShowKeyNum(SMG_NoDot[keyNum]); } R2 = 0; R1 = R3 = R4 = 1; C1 = C2 = C3 = C4 = 1; if(C1 == 0) { while(C1 == 0); keyNum = 4; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C2 == 0) { while(C2 == 0); keyNum = 5; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C3 == 0) { while(C3 == 0); keyNum = 6; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C4 == 0) { while(C4 == 0); keyNum = 7; ShowKeyNum(SMG_NoDot[keyNum]); } R3 = 0; R2 = R1 = R4 = 1; C1 = C2 = C3 = C4 = 1; if(C1 == 0) { while(C1 == 0); keyNum = 8; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C2 == 0) { while(C2 == 0); keyNum = 9; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C3 == 0) { while(C3 == 0); keyNum = 10; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C4 == 0) { while(C4 == 0); keyNum = 11; ShowKeyNum(SMG_NoDot[keyNum]); } R4 = 0; R2 = R3 = R1 = 1; C1 = C2 = C3 = C4 = 1; if(C1 == 0) { while(C1 == 0); keyNum = 12; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C2 == 0) { while(C2 == 0); keyNum = 13; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C3 == 0) { while(C3 == 0); keyNum = 14; ShowKeyNum(SMG_NoDot[keyNum]); } else if(C4 == 0) { while(C4 == 0); keyNum = 15; ShowKeyNum(SMG_NoDot[keyNum]); } } void main() { while(1) { ScanKeys(); } }