int keyPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
int tones[] = {262, 294, 330, 349, 392, 440, 494, 523};
int keyNum = 8;
#define BUZZER_PIN 10
#define LED_PIN 13
// 一位共阳数码管引脚定义
#define a A0
#define b A1
#define c A2
#define d A3
#define e A4
#define f A5
#define g 11
// 共阴极段码表(代码里取反适配共阳)
byte numCode[9] = {
B1111110, // 0
B0110000, // 1
B1101101, // 2
B1111001, // 3
B0110011, // 4
B1011011, // 5
B1011111, // 6
B1110000, // 7
B1111111 // 8
};
// 适配共阳极的显示函数
void displayNum(int n){
if(n < 0 || n > 8) n = 0;
byte code = numCode[n];
digitalWrite(a, !bitRead(code,6));
digitalWrite(b, !bitRead(code,5));
digitalWrite(c, !bitRead(code,4));
digitalWrite(d, !bitRead(code,3));
digitalWrite(e, !bitRead(code,2));
digitalWrite(f, !bitRead(code,1));
digitalWrite(g, !bitRead(code,0));
}
void setup() {
// 原有按键初始化不变
for (int i = 0; i < keyNum; i++) {
pinMode(keyPins[i], INPUT_PULLUP);
}
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
Serial.begin(9600);
// 数码管段脚设输出
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
displayNum(0); // 上电显示0
Serial.println("八音电子琴启动完成");
}
void loop() {
for (int i = 0; i < keyNum; i++) {
if (digitalRead(keyPins[i]) == LOW) {
tone(BUZZER_PIN, tones[i]);
digitalWrite(LED_PIN, HIGH);
displayNum(i+1); // 按下显示对应数字
Serial.print("按键:");
Serial.println(i+1);
delay(20);
while (digitalRead(keyPins[i]) == LOW) {
delay(10);
}
noTone(BUZZER_PIN);
digitalWrite(LED_PIN, LOW);
displayNum(0); // 松开回到0
}
}
delay(10);
}