Proiectul implementeaza jocul Snake. Este facut pentru amuzament.
SCHEMA GENERALA
Microprocesorul va primi comenzi de la butoane. In functie de butonul activat, se vor seta pinii care controleaza matricea de leduri. Rezultatul este aprinderea ledurilor pe matrice. Nu este necesara apasarea butoanelor pentru ca microprocesorul sa comande matricea. In cazul in care nu se apasa nici un buton, atunci se va calcula noua pozitie fara modificare directie snake.
Lista de componente:
1. Matrice leduri 8x8, monocromatica (modelul TOM-2088BH) 2. 8 rezistente (330 Ohm) 3. 2 butoane (cu 4 pini) 4. fire cablu UTP 5. Placuta etapa I
MATRICEA DE LEDURI
SCHEMA
Pentru scrierea si compilarea codului am folosit AVR Studio. Modul de functionare este urmatorul: snake-ul se deplaseaza in continuu, in directia curenta. Daca se apasa unul din cele doua butoane, atunci directia se va modifica.
Implementare: Nu utilizez intreruperi ci folosesc un delay (de o milisecunda). Pentru deplasarea continua a snake-ului incrementez un counter. Cand acesta atinge o valoare prestabilita (TIMEOUT), atunci se produce deplasarea si counterul se duce la 0. Pentru controlul cu butoane, la fiecare milisecunda, verific pinii la care sunt legate butoanele. Daca unul din acesti pini indica apasare de buton, atunci produc modificare de directie, deplasare si resetare counter. Astfel, dupa apasare de butoane, se vor astepta TIMEOUT iteratii. Cand un buton este apasat setez o variabila, specifica acestui buton. Daca aceasta variabila este setata, atunci la urmatoarea iteratie (urmatoarea milisecunda) butonul nu va mai fi vazut ca apasat.
Functii:
1. setare_butoane: * seteaza portul B ca intrare * activeaza rezistentele de pull-up 2. setare_matrice: * setare porturile A si C ca iesiri 3. desenare_pixel(x,y): * pinul liniei 'x' este setat pe 1 * pinul coloanei 'y' este setat pe 0 4. stergere_pixel() * toti pinii liniilor sunt trecuti pe 0 * toti pinii coloanelor sunt trecuti pe 1 5. verifica_butoane() * verifica pinul butoanelor si intoarce valoarea pinului 6. gaseste_liber() * intoarce un loc liber de pe matrice * este folosita pentru calcularea noii pozitii a "mancarii" snake-ului 7. verifica_coliziune() * se ia pozitia capului si se cauta pozitia asta in restul snake-ului * in caz ca se regaseste, functia returneaza 1 8. deplasare_snake(buton) * in functie de directia curenta si de butonul apasat, se seteaza capul snake-ului
OBSERVATIE: pentru generarea noii pozitii a “mancarii” simulez numere aleatoare. Valoarea counter-ului este salvata intr-o variabila “next_rand” in momentul cand s-a apasat un buton si inainte de resetarea counter-ului. “next_rand” il folosesc in “gaseste_liber”.
Proiectul functioneaza cum am dorit, cu o mica exceptie. Pe o linie a matricei, cu cat sunt mai multe leduri aprinse, cu atat stralucirea acestora se diminueaza.
Jocul este interactiv si bine implementat. Trebuie, totusi, gasita o solutie pentru o stralucire cat mai omogena a ledurilor. Probabil, solutia este sa sa comande o linie cu mai multi pini.
Codul sursa: