byte rowPins[] = {7, 6, 5, 4}; // 連接至 keypad 的列腳位
byte colPins[] = {11, 10, 9, 8}; // 連接至 keypad 的行腳位
const byte BuzzerPin = 3; // 蜂鳴器的腳位
void setup() {
for (int i = 0; i <= 3; i++) { // 設置腳位電氣特性
pinMode(rowPins[i], OUTPUT);
digitalWrite(rowPins[i], HIGH); // 掃描端腳位預設為 HIGH
pinMode(colPins[i], INPUT);
}
pinMode(BuzzerPin, OUTPUT); // 蜂鳴器設置為輸出
}
void loop() {
// 外迴圈
for (int r = 0; r <= 3; r++) { // 掃描端由上往下依序為 0~3
digitalWrite(rowPins[r], LOW); // 指定 "檢測列" 為 LOW
// 內迴圈
for (int c = 0; c <= 3; c++) { // 資料端由左而右檢查
if (digitalRead(colPins[c]) == LOW) { // 若按鍵按下 (狀態為 LOW)
delay(20); // 延遲 20ms 避過開關彈跳時間
// 按鍵對應的聲音
if (r == 0) {
if (c == 0) tone(BuzzerPin, 523, 50); // 1
else if (c == 1) tone(BuzzerPin, 587, 50); // 2
else if (c == 2) tone(BuzzerPin, 659, 50); // 3
else if (c == 3) tone(BuzzerPin, 698, 50); // A
} else if (r == 1) {
if (c == 0) tone(BuzzerPin, 784, 50); // 4
else if (c == 1) tone(BuzzerPin, 880, 50); // 5
else if (c == 2) tone(BuzzerPin, 988, 50); // 6
else if (c == 3) tone(BuzzerPin, 1047, 50); // B
}
// 等待按鍵放開
while (digitalRead(colPins[c]) == LOW) delay(1);
delay(20); // 延遲 20ms 避過開關彈跳時間
}
}
digitalWrite(rowPins[r], HIGH); // 恢復 "檢測列" 為 HIGH
}
}