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.