實驗說明:
4×4矩陣按鍵原理:這裡會啟用Arduino內部的上拉電阻,將所有按鍵設 定為高電位的狀態,當其中一個按鍵被按下Arduino將會收到低電位訊號(Low active)。
程式設計想法:
- 將行Row(行)設定為Output,columns(列)設為 input 並將Pin 並都設定為High。
- 每一列都去掃描,偵測每一行是否有按鍵按下狀態變成低電位。
材料:
- Arduino Uno R3
- USB 傳輸線
- 4×4矩陣鍵盤
- 杜邦線
程式:
const byte colPins[4] = {5, 4, 3, 2}; // 設定行的腳位
const byte rowPins[4] = {9, 8, 7, 6}; // 設定列的腳位
const char keymap[4][4] = { // 設定按鍵的行與列對應的值
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte i, j;
byte scanVal; // 掃描到的按鍵值
void setup(){
Serial.begin(9600);
for (i = 0; i <= 3; i++) { //初始化所有腳位
pinMode(rowPins[i], INPUT);
pinMode(colPins[i], OUTPUT);
digitalWrite(colPins[i], HIGH);
digitalWrite(rowPins[i], HIGH);
}
}
void loop() {
for (i = 0; i <= 3; i++) { //第一層for迴圈
for (j = 0; j <= 3; j++) { //第二層for迴圈
digitalWrite(colPins[j], LOW); //掃描第一columns(列)並設為LOW
scanVal = digitalRead(rowPins[i]); //讀取Row行的PIN
if (scanVal == LOW) { // 偵測到low腳位
Serial.println(keymap[i][j]); // 印出按鍵代表的字元
delay(200); // 掃描按鍵的間隔時間
digitalWrite(colPins[j], HIGH); //將目前掃描的列復位為高電位
break; // 跳出迴圈
}
digitalWrite(colPins[j], HIGH); //將目前掃描的列復位為高電位
}
}
}
結果:
下載程序完成後,打開序列埠監控視窗,字元輸出是否與定義的相同呢?