|
|
13接可变电阻接峰鸣器
3456789分别接常开开关接地
int soundport=13;
//13接峰鸣器
int hl=1;
//初始为中间调
int soundkey[]={3,4,5,6,7,8,9};
//CDEFGAB七个键位接的口
void setup() {
//Serial.begin(9600);
pinMode(soundport,OUTPUT);
for(int i=0;i<=6;i++){
pinMode(soundkey[i],INPUT);
digitalWrite(soundkey[i],HIGH);
//使用内置的上拉口
}
}
int yfl[]={262,293,329,349,392,440,494};
int yf[]={523,586,658,697,783,879,987};
int yfh[]={1045,1171,1316,1393,1563,1755,1971};
//三个段的tone的参数,可以改用一个二维数组,此时下面的ps()也要改
void ps(int fre){
if(hl==0){
tone(soundport,yfl[fre]);
}else if(hl==1){
tone(soundport,yf[fre]);
}else if(hl==2){
tone(soundport,yfh[fre]);
}
}
void loop() {
boolean anykeypress=false;
//anykeypress为标记flag变量,记录是否有键按下
for(int i=0;i<=6;i++){
if (digitalRead(soundkey[i])==0){
ps(soundkey[i]-3);
anykeypress=true;
}
}
//扫描soundkey[]中的所有端口,如有按下(低电平),则发音
if (!(anykeypress)){
noTone(soundport);
}
//如果当前没有键按下,则关闭峰鸣器
}
做了个测试,loop里仅有 ps(1);ps(2);,按道理有的琴应该发一个和声,但是这里就完全不是那样,难道是要根据523和586计算出一个值来让tone发声么?如果同时按多个键呢?(手头没有电子琴,不记得应该是咋样的了。) |
|