矩陣鍵盤)
一、硬件連接將51單片機(jī)的P1口連接矩陣鍵盤如下圖所示。二、矩陣鍵盤分析思路先掃第一列其他三列不要管。第一列置0其他三列置1。然后判斷行引腳若四個(gè)行引腳均為最開始的電平狀態(tài)高電平無事發(fā)生按鍵當(dāng)然沒按下然后繼續(xù)判斷下一列。反之則不然。三、獲取按鍵基礎(chǔ)寫法/** * brief 矩陣鍵盤讀取按鍵鍵碼 * param 無 * retval KeyNumber 按下按鍵的鍵碼值 * 如果按鍵按下不放程序會(huì)停留在此函數(shù)松手的一瞬間返回按鍵鍵碼沒有按鍵按下時(shí)返回0 */ unsigned char MatrixKey() { unsigned char KeyNumber0; P10xFF; P1_30; //也可以直接將P10XF7 P1_7 - P1_0 為 1111 0111 判斷第1列是否有按鍵按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber1;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber5;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber9;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber13;} P10xFF; P1_20; //P1_7 - P1_0 為 1111 1011 判斷第2列是否有按鍵按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber2;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber6;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber10;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber14;} P10xFF; P1_10; //P1_7 - P1_0 為 1111 1101 判斷第3列是否有按鍵按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber3;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber7;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber11;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber15;} P10xFF; P1_00; //P1_7 - P1_0 為 1111 1110 判斷第4列是否有按鍵按下 if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber4;} if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber8;} if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber12;} if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber16;} return KeyNumber; }四、進(jìn)階寫法/** * brief 矩陣鍵盤掃描讀取按鍵鍵碼 * param 無 * retval 鍵碼 1~16無按鍵返回 0 * note 按下不放會(huì)阻塞在此函數(shù)松手瞬間返回 */ unsigned char MatrixKey(void) { /* 四列的拉低掩碼0xF7 / 0xFB / 0xFD / 0xFE 高 4 位全為 1保證行線是輸入狀態(tài) */ static const unsigned char colMask[4] {0xF7, 0xFB, 0xFD, 0xFE}; unsigned char col; /* 當(dāng)前掃描的列 0~3 */ unsigned char row; /* 命中的行 0~3 */ unsigned char rowBits; /* 行線電平高 4 位有效 */ for (col 0; col 4; col) { P1 colMask[col]; /* 拉低第 col 列 */ Delay(1); /* 等電平穩(wěn)定 */ rowBits P1 0xF0; /* 只取行線屏蔽列線 */ if (rowBits 0xF0) /* 高 4 位全 1本列無鍵 */ continue; Delay(20); /* 消抖 */ rowBits P1 0xF0; if (rowBits 0xF0) /* 抖動(dòng)消失忽略 */ continue; for (row 0; row 4; row) /* 查是哪一行被拉低 */ { if ((rowBits (0x80 row)) 0) break; } while ((P1 0xF0) ! 0xF0) /* 等待松手 */ ; Delay(20); /* 松手消抖 */ return (unsigned char)(row * 4 col 1); /* 立刻返回 */ } return 0; /* 四列都掃過無鍵 */ }