Basic Tutorial for Arduino, 感測器 Sensor, 進階篇

【Arduino進階教學】4×4 矩陣按鍵模組:雙重迴路掃描原理、配線圖與程式碼實作

一、 4×4 矩陣按鍵 (Matrix Keypad) 運作原理

在實作電子密碼鎖、計算機或多功能控制介面時,若 16 個按鍵各自獨立連接 Arduino,會消耗大量 GPIO 資源。4×4 矩陣按鍵 透過「行與列(Rows & Columns)」交錯排列,只需 8 根引腳 就能控制 16 個按鈕。

雙重迴路掃描機制

  1. 硬體架構: 16 個按鍵分布於 4 行(R1~R4)與 4 列(C1~C4)的交叉點上。

  2. 軟體掃描原理:

    • 列(Column)腳位設為輸出 (OUTPUT),並預設給予高電位(HIGH)。

    • 行(Row)腳位設為輸入 (INPUT),並開啟內建拉高電位(HIGH)。

    • 透過雙層 for 迴路輪流將每一列設為低電位(LOW),同時讀取行腳位。當按鍵被按下時,該交叉點會形成通路使行腳位變為低電位(LOW),即可精準定位當前按下的鍵值。

二、 實驗所需材料與電路配線圖 (Hardware Setup)

請依照配線圖將 4×4 矩陣按鍵模組上的 8 根引腳(R1~R4、C1~C4)連接至 Arduino Uno。

🛒 準備材料

  • Arduino Uno 開發板 x 1

  • 4×4 矩陣按鍵模組 x 1

  • 杜邦線 8 根

🛍️ 準備好你的硬體工具了嗎? 推薦選購:米羅科技 – Arduino 程式學習爆款套件組(包含豐富驅動專案模組)

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

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

⚡ 腳位對接說明 (Pin Mapping)

矩陣按鍵腳位標示腳位功能說明Arduino Uno 引腳
R1第 1 行 (Row 1)D9
R2第 2 行 (Row 2)D8
R3第 3 行 (Row 3)D7
R4第 4 行 (Row 4)D6
C1第 1 列 (Column 1)D5
C2第 2 列 (Column 2)D4
C3第 3 列 (Column 3)D3
C4第 4 列 (Column 4)D2

三、 完整程式碼實作:雙重迴路掃描按鍵檢測

此程式無需下載額外的第三方函式庫,採用原生程式邏輯進行雙層 for 迴路掃描檢測。

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

結果:

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

四、 常見問題與除錯 (FAQ)

Q1:按下按鍵後,序列埠監視器顯示出亂碼或完全沒反應?

  • 解答:

    1. 請檢查 Serial Monitor 視窗右下角的波特率是否設定為 9600 baud

    2. 請核對配線圖,確保 R1~R4 連接至 Pin 9~6,C1~C4 連接至 Pin 5~2。

Q2:按一次按鍵卻印出很多個重複字元?

  • 解答: 這是機械按鍵的按鍵彈跳現象。程式中的 delay(200); 提供了消抖與防止連點的間隔,若仍會連點可適度增大延遲時間。

Q3:如果按鍵輸出的字元位置對不上(例如按 ‘1’ 卻印出 ‘A’)?

  • 解答: 代表 Column 與 Row 的杜邦線順序插反或接錯,請依據配線圖將 Pin 2~5(列)與 Pin 6~9(行)重新檢查排順。

🔗 延伸閱讀與推薦課程

📟 進階顯示模組控制:【Arduino進階教學】LCD 1602 I2C 顯示模組:4線快速接線、位址檢測與程式碼範例

👈 上一篇:【Arduino進階教學】DS1302 RTC時鐘模組原理與接線:RtcDS1302函式庫與時間顯示實作

👉 下一篇:【Arduino進階教學課程】 雙軸搖桿模組(Joystick):X/Y軸類比讀取與 Z 軸按鈕實作

📘 總索引:Arduino 新手學習必讀經典 – 快速索引頁面