一、 4×4 矩陣按鍵 (Matrix Keypad) 運作原理
在實作電子密碼鎖、計算機或多功能控制介面時,若 16 個按鍵各自獨立連接 Arduino,會消耗大量 GPIO 資源。4×4 矩陣按鍵 透過「行與列(Rows & Columns)」交錯排列,只需 8 根引腳 就能控制 16 個按鈕。
雙重迴路掃描機制
硬體架構: 16 個按鍵分布於 4 行(R1~R4)與 4 列(C1~C4)的交叉點上。
軟體掃描原理:
將 列(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 程式學習爆款套件組(包含豐富驅動專案模組)
⚡ 腳位對接說明 (Pin Mapping)
三、 完整程式碼實作:雙重迴路掃描按鍵檢測
此程式無需下載額外的第三方函式庫,採用原生程式邏輯進行雙層 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:按下按鍵後,序列埠監視器顯示出亂碼或完全沒反應?
解答:
請檢查 Serial Monitor 視窗右下角的波特率是否設定為
9600 baud。請核對配線圖,確保 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函式庫與時間顯示實作


