Acest proiect reprezintă o replică a jocului “Whack the Weasel”, in care jucătorul trebuie să lovească în cap, veveriță fictivă când aceasta iese din scorbură. Din diverse motive nu am putut să realizez plăcuța cu diverse găuri și/sau să folosesc fel de fel de motorașe, am simulat gaurile cu LED-uri stinse, bâta cu butoane și faptul că nevăstuica apare din scorbură cu aprinderea LED-ului.
Schema este destul de simplă, butoanele se conectează prin pinii de tip A la placa de bază, în timp ce LED-urile așteaptă mesaje pe pinii de tip C.
Inițial toate LED-urile sunt deschise, până când jucătorul apasă pe cel mai din stânga buton (butonul 0). Jocul începe apoi, la fiecare pas, acesta trebuind să apese pe LED-ul aprins corespunzător. La fiecare pas va fi un singur LED aprins pentru o cuantă de timp iar jucătorul va pierde jocul direct doar dacă nu va apăsa pe butonul corespunzător LED-ului, în timp util, moment în care jocul va reîncepe.
Programul reprezintă defapt un controller ce se ocupă cu medierea timpului în care LED-urile sunt aprinse și apăsarea de butoane.
La începutul programului se inițializează port-urile comunicație.
/* PORT A - IN */ DDRA = 0x00; /* PORT C - OUT */ DDRC = 0xFF; /* Pull-Up on PORT A */ PORTA = 0xFF;
În codul de mai jos se găsește logica aplicației, unde se aprinde un LED și se așteaptă apăsarea unui buton, după care se testează corectitudinea apăsării. În caz ca apăsarea a fost corectă se va decrementa timpul în care LED-ul e aprins.
PORTC=OFF; turn_on_led(BIT0); current_led = 0; while(1){ button = wait_for_button_press(current_led); if(button == -2){ /* Game Over */ break; } /* The button was pressed correctly */ if(button != -1) { if(button != current_led){ /* Game over */ break; } else { /* The button has been correctly matched */ time_q = time_q_size; if(++how_many_suc == 3){ how_many_suc = 0; if(time_q_size > 100000){ if(current_led == 3 || current_led == 6 || current_led == 7) time_q_size -= 200000; else time_q_size -= 100000; } else if(time_q_size > 10000) time_q_size -= 10000; else time_q_size -= 100; } current_led = select_next_led(); } } }
Proiectul a fost unul foarte distractiv întrucât pentru mine a fost primul proiect ce implică lipit plăcuțe și programare “low-level”.