#include <Tone.h>
// 接 74HC595 的第 12 支接腳
int latchPin = 9;
// 接 74HC595 的第 11 支接腳
int clockPin = 8;
// 接 74HC595 的第 14 支接腳
int dataPin = 10;
const int buzzer = 7;
const int sym = 6;
const int btn = 5;
const int Rbtn = 4;
Tone freq1;
Tone freq2;
void setup() {
Serial.begin(250000);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(btn,INPUT);
pinMode(Rbtn,INPUT);
freq1.begin(buzzer);
freq2.begin(sym);
}
const int toneTable[]={
131,
147,
165,
175,
196,
220,
247,
0,
264,
294,
330,
349,
392,
440,
494,
0,
524,
588,
660,
698,
784,
880,
932
};
char toneName[]="cdefgabNCDEFGAB";
char MainTone[]="NNNNNNNNNNNNNNNCCCCbbbbaaaagggNggaaeeddeeeeeeeNeeggaaaaDDDDbbbbCCCCbbggaaaaaaaaCCCCbbbbaaaagggNggaaeeddeeeNeeggaNaaaNaaCCCCDDDDbbbbbbbbbbbNaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDEEbbggaaaNaaCCDDNDDDENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDCCEEGGAAAAAAAA";
char SymTone[]="NNNNNNNNNNNNNNNffNNffNNffNNffNNCCNNCCNNCCNNCCNNffNNffNNggNNggNNaNaaggaaDDCCbbfNffNNffNNffNNffNNCCNNCCNNCCNNCCNNDNDNNNDNDNNNEEDDEENNENEENNNNNNNNaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfffFNeebbEEbbffFFggGGaNagaaCCaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfNfFNeebbEEbbffFFggGGaaNNaaaa";
int getTone(char symbol,int pos) {
int toneNo = 0;
for ( int ii=0; ii<15; ii++ ) {
if ( toneName[ii]==symbol ) {
toneNo = ii;
break;
}
}
return toneNo+pos;
}
uint8_t L[] = {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8_t R[] = {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
byte sevenNumber [] = {
254,//0
48,//1
109,//2
121,//3
51,//4
91,//5
95,//6
114,//7
255,//8
123,//9
0,//NULL
};
int number;
int SevenCounter = 0;
int MusicCounter = 0;
int PlayCounter = 0;
int TempleCounter = 0;
int BtnCounter = -50;
int numberTen;
int numberZero;
const int Musicdelay = 100;
int MaintoneNo, SymtoneNo;
bool trigger = false;
bool Rtrigger = false;
uint16_t Ldis = 0;
uint16_t Rdis = 0;
void loop()
{
int score = 0;
for(int i=0;i<sizeof(L)*Musicdelay;i++){
if(PlayCounter == sizeof(L)) PlayCounter = 0;
if(PlayCounter == 0) score = 0;
if(MusicCounter < Musicdelay){
MusicCounter++;
}
else if(MusicCounter == Musicdelay){
Ldis = Ldis << 1;
Rdis = Rdis << 1;
Ldis += L[PlayCounter];
Rdis += R[PlayCounter];
number = score;
if(SevenCounter <10){
numberTen =10;
numberZero = score/100;
}
else if(SevenCounter <40){
numberTen = (number-100*(score/100))/10;
numberZero = number-10*(score/10);
}
else if(SevenCounter == 40){
SevenCounter = -1;
}
SevenCounter++;
MaintoneNo = getTone(MainTone[PlayCounter],8);
SymtoneNo = getTone(SymTone[PlayCounter],0);
freq1.play(toneTable[MaintoneNo]);
freq2.play(toneTable[SymtoneNo]);
// 送資料前要先把 latchPin 拉成低電位
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberZero]));
shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberTen]));
shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Rdis));
shiftOut(dataPin, clockPin, LSBFIRST, highByte(Rdis));
shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Ldis));
shiftOut(dataPin, clockPin, LSBFIRST, highByte(Ldis));
// 送出第一位元組給最近的 74HC595
// 送完資料後要把 latchPin 拉回成高電位
digitalWrite(latchPin, HIGH);
MusicCounter = 1;
PlayCounter++;
}
int switchStatus = digitalRead(btn);
int RswitchStatus = digitalRead(Rbtn);
if(TempleCounter == sizeof(L)) TempleCounter = 0;
if(BtnCounter<Musicdelay){
if(switchStatus==1){
trigger = true;
}
else {
trigger = trigger;
}
if(RswitchStatus==1){
Rtrigger = true;
}
else {
Rtrigger = Rtrigger;
}
BtnCounter++;
}
else if(BtnCounter == Musicdelay){
if(Ldis/32768==1){
if(trigger) score++;
else score--;
}
else{
score = score;
}
if(Rdis/32768==1){
if(Rtrigger) score++;
else score--;
}
else{
score = score;
}
if(score < 0) score = 0;
TempleCounter++;
BtnCounter = 1;
trigger = false;
Rtrigger = false;
}
delay(1);
}
}
Comments
Please log in or sign up to comment.