Clasicul joculet de memorie “Simon says”
Conectarea butoanelor la ATmega16 se face la pinii PC0, PC1, PC2, PC3, PC4, PC5
Conectarea ledurilor la ATmega16 se face la pinii PA0, PA1, PA2, PA3, PA4, PA5
Simulare joc:
Placuta de baza:
Placuta de test cu piesele necesare:
Forma finala a proiectului:
In fisierul simon_says.c exista urmatoarele functii:
Prezentare pseudocod a unor functii mentionate mai sus:
1)Functia de aprindere a unui led:
void LED_on(char led) → led - va indica ledu-ul ce trebuie sa fie aprins {
PORTA = led; del(1); -> realizeaza intarzierea astefl incat aprinderea led-ului sa fie vizibila PORTA = OFF; -> realizeaza stingerea led-ului
}
2)Functia de verificarea pentru a vedea ce buton a fost apasat:
int pressButton() {
int pressed = 0; int button = -1; while(pressed == 0) -> asteapta cat timp nu s-a apasat un buton { ---------------- Verificare stare buton 0 -------------- if((PINC & BIT0) ==0) { PORTA = BIT0; while(((PINC & BIT0) ==0)); -> se asteapta pana la eliberarea butonului PORTA = OFF; pressed = 1; button = 0; break; } ---------------------------------------------------------- >>>> Se procedeaza analog pentru celelalte butoane (1-5) <<<< } return button; -> returneaza ce buton a fost apasat
}
3) Pasii de urmat in functia main:
int main() {
... Declaratii variabile ... // setam pinii portului A ca pini de iesire DDRA = 0xFF; // setam pinii portului C ca pini de intrare DDRC = 0x00; // activam rezistenta de pull-up pe portul C PORTC = 0xFF; while(1){ // activam rezistenta de pull-up pe portul C PORTC = 0xFF; // se genereaza aprinderea inca unui led aleator random = get_rand(); // se retine numarul ledului aprins in vectorul ce retine secventa la care s-a ajuns model[cont] = random; cont = cont + 1; // daca cineva ajunge la finalul jocului toate ledurile se aprind de 3 ori pentru a semnala acest lucru if (cont == DIM) { all_LEDs_on(); del(1); all_LEDs_on(); del(1); all_LEDs_on(); del(1); break; } // se reda secventa curenta for(i=0;i<cont;i++) { switch(model[i]) { case 0: led = BIT0; break; ... Analog pentru case 1 - case 5 ... } LED_on(led); del(1); } ... Resetari variabile (crt = 0, done = 0, correct = 1) ... // cat timp nu s-a tastat toata secventa si secventa tastata e corecta while(done == 0 && correct == 1) { button = pressButton(); // se asteapta apasarea unui buton del(1); if(button != -1) // s-a apasat corect un buton { if(button != model[crt]) // nu s-a apasat butonul care urma in secventa { // se aprind toate led-urile o data sa se semnaleze ca jocul a fost pierdut all_LEDs_on(); del(1); correct = 0; cont = 0; break; } } crt++; if(crt >= cont) done = 1; // s-a introdus toata secventa } } return 0;
}
La finalul proiectului s-a obtinut un joc functional “Simon says”
De la un anumit nivel jocul devine destul de greu.
Este mai bine sa existe un spatiu putin mai mare pe placuta intre butoane, respectiv becuri, astfel fiind mai usor de manevrat jocul
Mi s-a parut foarte util sa lucrez la acest proiect pentru ca astfel am inteles cum anume se poate crea de la 0 o aplicatie si cum se face legatura intre partea software si partea hardware.