Utilizatorul interactioneaza cu microcontroller-ul prin butoane(da comenzi si introduce incercari de combinatii) si prin display (LCD de dimensiune 16×2). - Exista 3 butoane de comanda :
- Exista 6 butoane pentru selectia culorilor.
Modulele software sunt interfata de lucru cu lcd-ul si jocul .In cadrul jocului exista 3 functii principale : de selectie a nivelului jocului,de generare combinatie random , de asteptare a inputului utilizatorului , generare raspuns si afisare istoric.
Pe cele doua placi de extensie exista:
In introducere am motivat de ce este necesar un istoric al ultimelor combinatii introduse.De asemenea este nevoie de navigare printre acestea deoarece LCD-ul utilizat nu are decat doua linii pe care le-am folosit in felul urmator: prima linie afiseaza ultima combinatie introdusa , respectiv orice combinatie si rezultat anterior daca se navigheaza cu butoanele UP/DOWN , iar a doua linie este folosita pentru a afisa numarul de incercari ramase si inputul curent.Pentru a retine istoricul am folosit o structura definita astfel :
/*Structura care retine in istoric incercarile anterioare*/ typedef struct { uint8_t c[4]; // codurile celor 4 culori din combinatie uint8_t no1; // numarul de culori ghicite pe pozitia corecta uint8_t no2; // numarul de culori ghicite pe pozitia incorecta } TGuess;
.
Functii auxiliare :
void playGame(){ //Alege o combinatie random care trebuie ghicita randomGuess(); //Seteaza numarul de incercari in functie de nivelul ales la o constanta predefinita switch(nivel){ case 1: noTrys = BEGGINER; case 2: noTrys = EASY; case 3: noTrys = DIFFICULT; } for ( i = 0 ; i < noTrys ; i++){ //pentru fiecare incercare permisa LINE1 = actualizare_linie_1 // linie ce contine ultima incercare LINE1 = actualizare_linie_2 //linie ce contine numai numarul de incercari ramase LCD_print_guesses(); //reafiseaza for ( j = 0 ; j < 4 ; j++) { //pentru fiecare culoare din cele 4 ghicite while(1){ //se asteapta pana la introducerea unei culori if (este apasat butonul UP){ if ( historyIndex > 0){ // daca nu este prima comanda deja afisata in istoric historyIndex--; fillLine1(guess,historyIndex); // actualizeaza LCD_print_guesses(); //reafiseaza } } if (este apasat butonul DOWN){ // daca nu este ultima comanda deja afisata in istoric if ( historyIndex < i-1){ historyIndex++; fillLine1(guess,historyIndex);// actualizeaza LCD_print_guesses();//reafiseaza } } if (este apasat butonul ALB){ LINIA2[j+2] = 'A'; //adauga la incercarea curenta si culoarea nou introdusa guess[i].c[j] = 'A'; //adauga in istoric culoarea nou introdusa LCD_print_guesses(); //reafiseaza break; } if (este apasat butonul NEGRU){...} if (este apasat butonul ROSU){...} if (este apasat butonul GALBEN){...} if (este apasat butonul VERDE){...} if (este apasat butonul BLEU){...} } }//end for fiecare culoare din incercare if (verifyGuess()){ //a ghicit->sfarsit joc LCD_print("SUCCESS!"); return; } } //se ajunge aici in caz de insucces LCD_print2("GAME OVER!",toGuess); }
Implementarea software a fost testata pe simulare(simulare.zip) si realizeaza toate functionalitatile specificate la alegerea temei de proiect.
In implementarea hardware am intampinat multe probleme din cauza lipsei de experienta si aceasta etapa a fost finalizata ultima. Din acest punct ce vedere am avut sansa sa am un proiect la care a fost posibil sa fac o simulare si sa testez programul pe aceasta ,proiectul fiind mai complicat software decat hardware.Fisierul cu simularea este inclus in arhiva cu sursele.
O nemultumire este estetica placutei din cauza firelor de legatura , dar am fost nevoita sa le folosesc deoarece utilizez multi din pinii microcontrollerului si spatiul a fost o problema.