ARDUINO, 感測器 Sensor, 進階篇

【Arduino進階教學課程】 第七篇:4X4矩陣按鍵

實驗說明:

4×4矩陣按鍵原理:這裡會啟用Arduino內部的上拉電阻,將所有按鍵設 定為高電位的狀態,當其中一個按鍵被按下Arduino將會收到低電位訊號(Low active)。

程式設計想法:

  • 將行Row(行)設定為Output,columns(列)設為 input 並將Pin 並都設定為High。
  • 每一列都去掃描,偵測每一行是否有按鍵按下狀態變成低電位。

材料:

  • Arduino Uno R3
  • USB 傳輸線
  • 4×4矩陣鍵盤
  • 杜邦線

 

👍爆款推薦:程式學習套件組 

購買網址:shop.mirotek.com.tw

 

程式:

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); //將目前掃描的列復位為高電位
    }
  }
}

結果:

下載程序完成後,打開序列埠監控視窗,字元輸出是否與定義的相同呢?