一.簡介
4x4矩陣按鍵是單片機外部設備中所使用的排布類似於矩陣的按鍵組。顯然矩陣按鍵的使用要比獨立按鍵要複雜一些,編程也要複雜一些,但可以單片機IO資源。4x4矩陣按鍵即分爲4組列線,4組行線,並將行線所接的單片機的I/O口作爲輸出端,而列線所接的I/O口則作爲輸入。
二.硬件連接圖
51單片機的P1口用作按鍵I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位;把列線P1.0-P1.3設置爲輸入線,行線P1.4-P.17設置爲輸出線。4根行線和4根列線形成16個相交點。如圖:
三.控制程序
1.矩陣按鍵程序掃描步驟
-
檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態,若P1.0-P1.3爲全“1”,則無鍵閉合,否則有鍵閉合。
-
去除按鍵抖動。當檢測到有鍵按下後,延時一段時間再做下一步的檢測判斷。
-
若有鍵被按下,應識別出是哪一個鍵閉合。方法是先獲取矩陣按鍵的列狀態,即P1的低四位狀態,對應爲0111,1011,1101,1110;再獲取行狀態,即P1的高四位狀態。
-
最後,將由此得到閉合鍵的行值和列值組成8位數,可通過對應的編碼表將閉合鍵的行值和列值轉換成所定義的鍵值。
2.掃描程序
void key() //按鍵程序
{
static uchar key_new = 0, key_l;
key_can = 20; //按鍵值還原
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //確認是按鍵按下
key_new = 0;
key_l = (P1 | 0xf0); //矩陣鍵盤的列狀態
P1 = key_l; //掃描矩陣鍵盤的行狀態
switch(P1)
{
case 0xee: key_can = 1; break; //得到按鍵值
case 0xde: key_can = 4; break; //得到按鍵值
case 0xbe: key_can = 7; break; //得到按鍵值
case 0x7e: key_can = 10; break; //得到按鍵值
case 0xed: key_can = 2; break; //得到按鍵值
case 0xdd: key_can = 5; break; //得到按鍵值
case 0xbd: key_can = 8; break; //得到按鍵值
case 0x7d: key_can = 0; break; //得到按鍵值
case 0xeb: key_can = 3; break; //得到按鍵值
case 0xdb: key_can = 6; break; //得到按鍵值
case 0xbb: key_can = 9; break; //得到按鍵值
case 0x7b: key_can = 11; break; //得到按鍵值
case 0xe7: key_can = 15; break; //得到按鍵值
case 0xd7: key_can = 14; break; //得到按鍵值
case 0xb7: key_can = 13; break; //得到按鍵值
case 0x77: key_can = 12; break; //得到按鍵值
}
}
}
else
{
key_new = 1;
}
}