Acest proiect consta in realizarea jocului copilariei noastre, Hangman (spanzuratoarea) folosind un display LCD pentru afisare si un keypad de 16 caractere, ambele atasate la porturile microcontroller-ului Atmega16. Scopul urmarit in realizarea acestui proiect este legat atat de partea de divertisment pe care o implica, fiind unul dintre jocurile preferate ale copiilor de pretutindeni, precum si de natura educativa a acestuia prin testarea cunostintelor generale si a capacitatilor cognitive(intuitie si inteligenta) ale participantilor la joc. Implementarea acestui proiect este una simplista incercand sa evidentieze modul de folosire a display-urilor LCD si a keypad-urilor pentru realizarea unor jocuri ce folosesc diverse meniuri si necesita participarea activa a utilizatorilor prin furnizarea unor optiuni.
Toata lumea cunoaste jocul spanzuratoarea: trebuie sa ghicesti un cuvant sau mai multe prin incercari succesive de litere. In mod clasic se joaca pe o foaie de hartie in doi, dar se poate juca si impotriva unui sistem automatizat, folosind dictionare din mai multe categorii. Dupa fiecare incercare, litera selectata se inlocuieste automat in interiorul cuvantului, sau in caz de esec se pierde una din sansele de castig. In cazul imprementarii realizate, daca gresesti de mai mult de dublul numarului de litere ale cuvantului joculetul “te spanzura” >:).
Componentele utilizate pentru implementarea proiectului sunt urmatoarele:
Componentele hardware utilizate sunt urmatoarele:
Proiectul a fost realizat si compilat folosind WinAVR. Functionalitatea acestuia este urmatoarea:
Modulele principale ale programului sunt urmatoarele:
void LCD_init(); // Initializare modul LCD.Trebuie apelata inainte de a se face orice operatie cu LCD-ul void LCD_writeInstruction(unsigned char _instruction); // Trimite o instructiune catre lcd (vezi datasheet) void LCD_writeData(unsigned char _data); // Trimite date catre LCD pentru afisare void LCD_write(unsigned char _byte); // trimite un bute catre LCD la modul general (nu conteaza daca e instructiune sau date) void LCD_waitNotBusy(); // Asteptam pana cand lcd-ul devine disponibil pt o noua comanda void LCD_waitInstructions(unsigned char _instructions); // Asteapta un numar de cicli de ceas. void LCD_print(char* _msg); // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere) void LCD_print2(char* _msg1, char* _msg2); // Afisare pe 2 lini pe LCD void LCD_printDecimal2u(unsigned int _n); // Afisare numar in baza 10 pe LCD void LCD_printHexa(unsigned int _n); // Afisare numar in baza 16 pe LCD
int get_column(); // Obtinere coloana buton apasat int get_row(); // Obtinere rand buton apasat char read_letter(); // Citire litera in functie de butoanele apasate int read_number(); // Citire cifra in functie de butoanele apasate
Rezultatele obtinute costau in implementarea atat a partii hardware cat si a celei software conform specificatiilor. Drept exemplificare pot fi vizualizate imaginile urmatoare:
Implementarea acestui joculet a fost destul de simplista si nu am intampinat dificultati nici la realizarea partii hardware, nici la impelmentarea sofware-ului care sa ruleze pe aceasta. Mi-ar fi placut totusi sa realizez o versiune complexa a acestui joc care sa permita mai multe optiuni si posibilitati de joc, insa acest lucru trebuia anticipat si aplicat in primul rand in alocarea timpului pentru acest proiect.