書名: 單片機C語言程序設計實訓100例作者名: 彭偉編著本章字數: 688字更新時間: 2018-12-27 05:12:06
3.17 數碼管顯示4×4鍵盤矩陣按鍵
本例在識別鍵盤矩陣按鍵時,使用了不同的掃描程序代碼,程序運行時數碼管會顯示相應按鍵的鍵值0~F。
本例電路如圖3-14所示。
程序設計調試與實訓:
讀者要注意本例中P1端口低4位連接的是列線,高4位連接的是行線。
本例中鍵盤矩陣按鍵掃描思想與上一案例類似,但使用的代碼有較大變化,而且沒有再使用查表法得到按鍵序號,代碼細節讀者可以自行剖析。

圖3-14 數碼管顯示4×4鍵盤矩陣按鍵電路
讀者可在上一案例的鍵盤布局下重新修改本例掃描代碼,實現按鍵識別功能。
另外,在本例及上一案例關于鍵盤矩陣單按鍵掃描的基礎上,讀者可修改代碼,實現對多按鍵的判斷(同時有2~3個按鍵按下)。在測試時,如果希望按鍵按下后不釋放,然后再繼續按第2個或第3個按鍵,這時不能用鼠標單擊按鍵,而應單擊按鍵旁邊的上下箭頭。
源程序代碼:
//----------------------------------------------------------------- // 名稱: 數碼管顯示4×4 鍵盤矩陣按鍵序號 //----------------------------------------------------------------- // 說明: 按下任意一按鍵時,數碼管會顯示它在鍵盤矩陣上的序號0~ F, // 掃描程序首先判斷按鍵發生在哪一列,然后根據所發生的行附加 // 不同的值,從而得到鍵盤按鍵序號。 //----------------------------------------------------------------- #include <reg51.h> #define uchar unsigned char #define uint unsigned int //0~9,A~F的數碼管段碼,最后一個是黑屏 uchar code DSY_CODE[]= { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00 }; sbit BEEP = P3^7; //上次按鍵和當前按鍵序號,該矩陣中序號范圍為0~15,16表示無按鍵 uchar Pre_KeyNo = 16, KeyNo = 16 ; //----------------------------------------------------------------- // 延時 //----------------------------------------------------------------- void DelayMS(uint ms) { uchar t; while(ms--) for(t = 0; t < 120; t++); } //----------------------------------------------------------------- // 鍵盤矩陣掃描 //----------------------------------------------------------------- void Keys_Scan() { uchar Tmp; //高4位置1,放入4行 P1 = 0x0F; DelayMS(1); //按鍵后00001111將變成0000XXXX,X中有1個為0,3個仍為1 //下面的異或操作會把3個1變成0,唯一的0變成1 Tmp = P1 ^ 0x0F; //判斷按鍵發生于0~3列中的哪一列 switch (Tmp) { case 1: KeyNo = 0; break; case 2: KeyNo = 1; break; case 4: KeyNo = 2; break; case 8: KeyNo = 3; break; default: KeyNo = 16; //無鍵按下 } //低4位置0,放入4列 P1 = 0xF0; DelayMS(1); //按鍵后11110000將變成XXXX0000,X中有1個為0,3個仍為1 //下面的表達式會將高4位移到低4位,并將其中唯一的0變為1,其余為0 Tmp = P1 >> 4 ^ 0x0F; //對0~3行分別附加起始值0,4,8,12 switch (Tmp) { case 1: KeyNo += 0; break; case 2: KeyNo += 4; break; case 4: KeyNo += 8; break; case 8: KeyNo += 12; } } //----------------------------------------------------------------- // 蜂鳴器 //----------------------------------------------------------------- void Beep() { uchar i; for (i = 0; i < 100; i++) { DelayMS(1); BEEP = ~BEEP; } BEEP = 1; } //----------------------------------------------------------------- // 主程序 //----------------------------------------------------------------- void main() { P0 = 0x00; while(1) { P1 = 0xF0; if(P1 != 0xF0) Keys_Scan(); //掃描鍵盤獲取按鍵序號KeyNo if (Pre_KeyNo != KeyNo) { P0 = ~DSY_CODE[KeyNo]; //顯示(用~作共陰共陽轉換) Beep(); Pre_KeyNo = KeyNo; } DelayMS(100); } }