根據矩陣鍵盤的原理圖可知,當沒有按鍵按下時,P1=0xf0;然后依次將P1^0~P1^3單獨置低電平,其他置高,再掃描各列的狀態,來判斷是哪個按鍵按下,比如,將P1^0輸出低電平,其他的引腳都輸出高電平,即P1=0xfe,那么當第1行有按鍵按下時P1的相應值為,
1X1(01111110=0x7e) 1X2(10111110=0xbe) 1x3(11011110=0xde) 1X4(11101110=0xee)
將P1^1輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
2X1(01111101=0x7d) 2X2(10111101=0xbd) 2x3(11011101=0xdd) 2X4(11101101=0xed)
將P1^2輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
3X1(01111011=0x7b) 3X2(10111011=0xbb) 3x3(11011011=0xdb) 3X4(11101011=0xeb)
將P1^3輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,
4X1(01110111=0x77) 4X2(10110111=0xb7) 4x3(11010111=0xd7) 4X4(11100111=0xe7)
下面通過一個來測試上面結果,
/* 程序中用到了置位,如果檢測第一行時置位為0xfe,是為了初始化一下P1口,初始化后 */ #include <reg52.h> unsigned int Val; void Delay(unsigned int t); void main(void) { while (1) { if(P1 != 0xf0)//當沒有按鍵按下時,P0=0xf0; { Delay(1500); //去抖 if(P1 != 0xf0)//表示按鍵還在按下,判斷是哪個按鍵 { P1 = 0xfe; //置位為fe,檢測第一行 1111 1110 //根據矩陣鍵盤原理圖,當非第一行有按鍵按下時P1一直保持為0xfe if(P1 != 0xfe) //將P1置為0xfe后,經過一個指令周期后如果它還是0xfe說明按下的鍵不在第一行 { Val = P1; Delay(1500); //去抖 while(P1 != 0xfe); //等待按鍵彈起 P0 = Val; } P1 = 0xfd; //置位為fd,檢測第二行 1111 1101 if (P1 != 0xfd) { Val = P1; Delay(1500); while (P1 != 0xfd) P0 = Val; } P1 = 0xfb; //置位為fb,檢測第三行 1111 1011 if (P1 != 0xfb) { Val = P1; Delay(1500); while (P1 != 0xfb) P0 = Val; } P1 = 0xf7; //置位為f7,檢測第四行 1111 0111 if (P1 != 0xf7) { Val = P1; Delay(1500); while (P1 != 0xf7) P0 = Val; } } } } } void Delay(unsigned int t) { while (--t); }