TVZ2022 / Mbed 2 deprecated whack-a-mole-Andrija-Markovic

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 #include "mbed.h"
00003 
00004 // 3 digitalna in-a za botune
00005 InterruptIn tipka1(D2);
00006 InterruptIn tipka2(PC_3);
00007 InterruptIn tipka3(PC_2);
00008 
00009 // za generiranje nasumicnog broja
00010 AnalogIn analog (A1);
00011 
00012 // print u tera term
00013 Serial pc(USBTX, USBRX);
00014 
00015 // za pomoć pri programiranju
00016 DigitalOut led1(LED1);
00017 InterruptIn tester(PC_13);  // B1
00018 
00019 // PWM za buzzer
00020 PwmOut buzzer(PB_3);
00021 
00022 // debounce timer za tipkala
00023 Timer debounce;             
00024 
00025 // 7 seg display bus i fja
00026 BusOut Seg1(D5,D6,D7,D8,D9,D10,D11,D12);
00027 char SegConvert(char SegValue);
00028 
00029 
00030 // varijable
00031 int r = 4;              // nasumican broj 1-4
00032 int t = 4;
00033 int rp = 4;             // varijabla za tipkalo 1-3
00034 int igra_li_se = 1;
00035 int c = 0;              // counter pogodaka
00036 int kraj = 0;
00037 
00038 
00039 // interrupti za botune
00040 void zaustavi_igru(void); // tester
00041 void t1(void);
00042 void t2(void);
00043 void t3(void);
00044 
00045 
00046 // funkcije
00047 void start_sekvenca(){ // start fja
00048     // 7 seg spin
00049     int s;                      
00050     for (s = 0; s < 4; s++){
00051         Seg1=SegConvert(10);
00052         
00053         wait(0.05);
00054         Seg1=SegConvert(11);
00055         wait(0.05);
00056         Seg1=SegConvert(12);
00057         wait(0.05);
00058         Seg1=SegConvert(13);
00059         wait(0.05);
00060         Seg1=SegConvert(14);
00061         wait(0.05);
00062         Seg1=SegConvert(15);
00063         wait(0.05);
00064     }
00065     Seg1=SegConvert(10);
00066     wait(0.05);
00067     Seg1=SegConvert(99);
00068     wait(0.2);
00069     
00070     Seg1=SegConvert(98);
00071     wait(0.1);
00072     Seg1=SegConvert(99);
00073     wait(0.1);
00074     Seg1=SegConvert(98);
00075     wait(0.1);
00076     Seg1=SegConvert(99);
00077     wait(0.1);
00078     
00079     Seg1=SegConvert(99);
00080     wait(0.5);
00081     
00082     // buzzer countdown
00083     buzzer.period(1/(349.2));
00084     buzzer = 0.5;
00085     wait(0.5);
00086     buzzer = 0;
00087     wait(0.5);
00088     buzzer.period(1/(349.2));
00089     buzzer = 0.5;
00090     wait(0.5);
00091     buzzer = 0;
00092     wait(0.5);
00093     buzzer.period(1/(349.2));
00094     buzzer = 0.5;
00095     wait(0.5);
00096     buzzer = 0;
00097     wait(0.5);
00098     buzzer.period(1/(698.5));
00099     buzzer = 0.5;
00100     wait(1);
00101     buzzer = 0;
00102 }
00103 
00104 void end_sekvenca(){
00105     buzzer.period(1/(698.5));
00106     buzzer = 0.5;
00107     wait(0.5);
00108     buzzer.period(1/(659.3));
00109     buzzer = 0.5;
00110     wait(0.5);
00111     buzzer.period(1/(622.2));
00112     buzzer = 0.5;
00113     wait(0.5);
00114     buzzer.period(1/(587.3));
00115     buzzer = 0.5;
00116     wait(0.5);
00117     buzzer.period(1/(554.4));
00118     buzzer = 0.5;
00119     wait(1.5);
00120     buzzer = 0;
00121 }
00122 
00123 // generira nasaumičan broj
00124 unsigned int nasumican (void){
00125     unsigned int rd = 0;
00126     unsigned int dugi = 0;
00127     for (rd = 0; rd <= 32; rd += 2){
00128         dugi += ((analog.read_u16() ) << rd);
00129     }
00130     return dugi;
00131 }
00132 
00133 
00134 // ticker za odbrojavanje vremena između generiranja krtica
00135 Ticker nova_krtica;
00136 
00137 // generira nove krtice i uspoređuje
00138 void krtica(){      
00139     
00140     if(r == t){
00141         c++;
00142         if(t != 4){
00143             buzzer.period(1/(587.3));
00144             buzzer = 0.5;
00145             wait(0.05);
00146             buzzer = 0;
00147         }
00148         igra_li_se = 1;
00149     }
00150   
00151     else if(r != t){
00152         igra_li_se = 0;
00153         Seg1=SegConvert(99);
00154     }
00155 
00156     rp = r;
00157     
00158     r = nasumican() % 4 + 1;
00159     
00160     if(r == rp){
00161         r++;
00162     }
00163     if(r > 4){
00164         r = 1;
00165     }
00166     
00167     switch(r){
00168            case 1 : Seg1=SegConvert(10);break;
00169            case 2 : Seg1=SegConvert(16);break;
00170            case 3 : Seg1=SegConvert(13);break;
00171            case 4 : Seg1=SegConvert(99);t=4;break; // t je 4, ako se stisne tipkalo ispadaš
00172     }
00173     
00174 }
00175 
00176 
00177 // main
00178 int main() {
00179     
00180     pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r");
00181     pc.printf("\n\r\n\r-----------\n\r\n\r NOVA IGRA\n\r\n\r-----------\n\r");
00182     pc.printf("\n\r\n\r\n\r\n\r\n\r\n\r\n\r");
00183     
00184     start_sekvenca();
00185     
00186     debounce.start();
00187     
00188     tipka1.mode(PullUp);
00189     tipka2.mode(PullUp);
00190     tipka3.mode(PullUp);
00191     
00192     nova_krtica.attach(&krtica,0.7);
00193     
00194     while(1) {
00195         tester.rise(&zaustavi_igru);
00196         tipka1.rise(&t1);
00197         tipka2.rise(&t2);
00198         tipka3.rise(&t3);
00199         if(igra_li_se == 1){
00200             // pc.printf("tipka %i     segment%i\n\r", t, r);
00201         }
00202         else if(igra_li_se == 0){
00203             Seg1=SegConvert(99);
00204             nova_krtica.detach();
00205             if(kraj==0){
00206                 end_sekvenca();
00207                 kraj++;
00208             }
00209             led1 = !led1;
00210             t = 0;
00211             pc.printf("\n\r!!! GAME OVER !!!\n\r\n\rPOGODILI STE %i PUTA! WOW!\n\r\n\r??? IGRAJ OPET ???\n\r\n\r", (c-1));
00212             wait(10);
00213         }
00214         
00215     }
00216 }
00217 
00218 
00219 //prekidi
00220 
00221 // prekid za B1 u svrhe testiranja
00222 void zaustavi_igru(void){
00223     if(debounce.read_ms()>100){
00224     led1 = !led1;
00225 //    igra_li_se = 0;
00226     debounce.reset();
00227     }
00228 }
00229 
00230 //tipka1
00231 void t1(void){
00232     if(debounce.read_ms()>100){
00233     
00234     t = 1;
00235     led1 = !led1;
00236     Seg1=SegConvert(99);
00237     
00238     debounce.reset();
00239     }
00240 }
00241 
00242 //tipka2
00243 void t2(void){
00244     if(debounce.read_ms()>100){
00245     
00246     t = 2;
00247     led1 = !led1;
00248     Seg1=SegConvert(99);
00249     
00250     debounce.reset();
00251     }
00252 }
00253 
00254 //tipka3
00255 void t3(void){
00256     if(debounce.read_ms()>100){
00257     
00258     t = 3;
00259     led1 = !led1;
00260     Seg1=SegConvert(99);
00261     
00262     debounce.reset();
00263     }
00264 }
00265 
00266 
00267 // 7 seg konverter
00268 char SegConvert(char SegValue) {        // A 10 (D5), G 16 (D11), D 13 (D8)
00269  char SegByte=0x00;
00270  switch (SegValue) { //DPGFEDCBA
00271  case 0 : SegByte = 0x3F;break; // 00111111 binary
00272  case 1 : SegByte = 0x06;break; // 00000110 binary
00273  case 2 : SegByte = 0x5B;break; // 01011011 binary
00274  case 3 : SegByte = 0x4F;break; // 01001111 binary
00275  case 4 : SegByte = 0x66;break; // 01100110 binary
00276  case 5 : SegByte = 0x6D;break; // 01101101 binary
00277  case 6 : SegByte = 0x7D;break; // 01111101 binary
00278  case 7 : SegByte = 0x07;break; // 00000111 binary
00279  case 8 : SegByte = 0x7F;break; // 01111111 binary
00280  case 9 : SegByte = 0x6F;break; // 01101111 binary
00281  
00282  case 10: SegByte = 0x01;break; // 00000001 A
00283  case 11: SegByte = 0x02;break; // 00000010 B
00284  case 12: SegByte = 0x04;break; // 00000100 C
00285  case 13: SegByte = 0x08;break; // 00001000 D
00286  case 14: SegByte = 0x10;break; // 00010000 E
00287  case 15: SegByte = 0x20;break; // 00100000 F
00288  case 16: SegByte = 0x40;break; // 01000000 G
00289  case 98: SegByte = 0x49;break; // 01001001 AGD
00290  case 99: SegByte = 0x00;break; // 00000000 /
00291  }
00292  return SegByte;
00293 }