Components and supplies
Pushbutton switch 12mm
SparkFun 7-Segment Serial Display - Red
Arduino UNO
LED (generic)
Resistor 1k ohm
Shift Register- Serial to Parallel
Jumper wires (generic)
Resistor 4.75k ohm
Buzzer
Breadboard (generic)
Project description
Code
Final
arduino
1#include <Tone.h> 2 3// 接 74HC595 的第 12 支接腳 4int latchPin = 9; 5// 接 74HC595 的第 11 支接腳 6int clockPin = 8; 7// 接 74HC595 的第 14 支接腳 8int dataPin = 10; 9const int buzzer = 7; 10const int sym = 6; 11const int btn = 5; 12const int Rbtn = 4; 13Tone freq1; 14Tone freq2; 15 16void setup() { 17 Serial.begin(250000); 18 pinMode(latchPin, OUTPUT); 19 pinMode(clockPin, OUTPUT); 20 pinMode(dataPin, OUTPUT); 21 pinMode(btn,INPUT); 22 pinMode(Rbtn,INPUT); 23 freq1.begin(buzzer); 24 freq2.begin(sym); 25} 26const int toneTable[]={ 27 131, 28 147, 29 165, 30 175, 31 196, 32 220, 33 247, 34 0, 35 264, 36 294, 37 330, 38 349, 39 392, 40 440, 41 494, 42 0, 43 524, 44 588, 45 660, 46 698, 47 784, 48 880, 49 932 50}; 51char toneName[]="cdefgabNCDEFGAB"; 52 53char MainTone[]="NNNNNNNNNNNNNNNCCCCbbbbaaaagggNggaaeeddeeeeeeeNeeggaaaaDDDDbbbbCCCCbbggaaaaaaaaCCCCbbbbaaaagggNggaaeeddeeeNeeggaNaaaNaaCCCCDDDDbbbbbbbbbbbNaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDEEbbggaaaNaaCCDDNDDDENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDCCEEGGAAAAAAAA"; 54 55char SymTone[]="NNNNNNNNNNNNNNNffNNffNNffNNffNNCCNNCCNNCCNNCCNNffNNffNNggNNggNNaNaaggaaDDCCbbfNffNNffNNffNNffNNCCNNCCNNCCNNCCNNDNDNNNDNDNNNEEDDEENNENEENNNNNNNNaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfffFNeebbEEbbffFFggGGaNagaaCCaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfNfFNeebbEEbbffFFggGGaaNNaaaa"; 56 57int getTone(char symbol,int pos) { 58 int toneNo = 0; 59 for ( int ii=0; ii<15; ii++ ) { 60 if ( toneName[ii]==symbol ) { 61 toneNo = ii; 62 break; 63 } 64 } 65 return toneNo+pos; 66} 67 68uint8_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}; 69 70uint8_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}; 71 72byte sevenNumber [] = { 73 254,//0 74 48,//1 75 109,//2 76 121,//3 77 51,//4 78 91,//5 79 95,//6 80 114,//7 81 255,//8 82 123,//9 83 0,//NULL 84}; 85int number; 86int SevenCounter = 0; 87int MusicCounter = 0; 88int PlayCounter = 0; 89int TempleCounter = 0; 90int BtnCounter = -50; 91int numberTen; 92int numberZero; 93const int Musicdelay = 100; 94int MaintoneNo, SymtoneNo; 95bool trigger = false; 96bool Rtrigger = false; 97uint16_t Ldis = 0; 98uint16_t Rdis = 0; 99 100void loop() 101{ 102 int score = 0; 103 104 for(int i=0;i<sizeof(L)*Musicdelay;i++){ 105 if(PlayCounter == sizeof(L)) PlayCounter = 0; 106 if(PlayCounter == 0) score = 0; 107 if(MusicCounter < Musicdelay){ 108 MusicCounter++; 109 } 110 else if(MusicCounter == Musicdelay){ 111 112 Ldis = Ldis << 1; 113 Rdis = Rdis << 1; 114 Ldis += L[PlayCounter]; 115 Rdis += R[PlayCounter]; 116 number = score; 117 if(SevenCounter <10){ 118 numberTen =10; 119 numberZero = score/100; 120 } 121 else if(SevenCounter <40){ 122 numberTen = (number-100*(score/100))/10; 123 numberZero = number-10*(score/10); 124 } 125 else if(SevenCounter == 40){ 126 SevenCounter = -1; 127 } 128 SevenCounter++; 129 MaintoneNo = getTone(MainTone[PlayCounter],8); 130 SymtoneNo = getTone(SymTone[PlayCounter],0); 131 freq1.play(toneTable[MaintoneNo]); 132 freq2.play(toneTable[SymtoneNo]); 133 134 // 送資料前要先把 latchPin 拉成低電位 135 digitalWrite(latchPin, LOW); 136 shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberZero])); 137 shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberTen])); 138 shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Rdis)); 139 shiftOut(dataPin, clockPin, LSBFIRST, highByte(Rdis)); 140 shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Ldis)); 141 shiftOut(dataPin, clockPin, LSBFIRST, highByte(Ldis)); 142 // 送出第一位元組給最近的 74HC595 143 // 送完資料後要把 latchPin 拉回成高電位 144 digitalWrite(latchPin, HIGH); 145 MusicCounter = 1; 146 PlayCounter++; 147 } 148 int switchStatus = digitalRead(btn); 149 int RswitchStatus = digitalRead(Rbtn); 150 151 if(TempleCounter == sizeof(L)) TempleCounter = 0; 152 if(BtnCounter<Musicdelay){ 153 if(switchStatus==1){ 154 trigger = true; 155 } 156 else { 157 trigger = trigger; 158 } 159 if(RswitchStatus==1){ 160 Rtrigger = true; 161 } 162 else { 163 Rtrigger = Rtrigger; 164 } 165 BtnCounter++; 166 } 167 else if(BtnCounter == Musicdelay){ 168 if(Ldis/32768==1){ 169 if(trigger) score++; 170 else score--; 171 } 172 else{ 173 score = score; 174 } 175 if(Rdis/32768==1){ 176 if(Rtrigger) score++; 177 else score--; 178 } 179 else{ 180 score = score; 181 } 182 if(score < 0) score = 0; 183 TempleCounter++; 184 BtnCounter = 1; 185 trigger = false; 186 Rtrigger = false; 187 } 188 delay(1); 189 } 190} 191
Comments
Only logged in users can leave comments
lyu-shao-hsu
0 Followers
•0 Projects
Table of contents
Intro
4
0