Joc de memorie:
- nivelele sunt crescatoare ca dificultate
Componente necesare:
Mod de interconectare:
Piesele pentru partea de proiect au fost asamblate pe o placa de test, interconectarea acestora a fost facuta cu ajutorul firelor (dintr-un cablu UTP)
- pasii jocului:
Exemple de cod:
- citirea butoanelor
void citeste_butoane(){ PORTA=0xFF; int i=0,aux=0; if((PINA&(1<<led1))==0){ PORTD|=(1<<led1); rez[led1]=led1; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led1]==0) ver[led1]+=aux; _delay_ms(10); PORTD&=!(1<<led1); } if((PINA&(1<<led2))==0){ PORTD|=(1<<led2); rez[led2]=led2; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led2]==0) ver[led2]+=aux; _delay_ms(10); PORTD&=!(1<<led2); } if((PINA&(1<<led3))==0){ PORTD|=(1<<led3); rez[led3]=led3; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led3]==0) ver[led3]+=aux; _delay_ms(10); PORTD&=!(1<<led3); } if((PINA&(1<<led4))==0){ PORTD|=(1<<led4); rez[led4]=led4; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led4]==0) ver[led4]+=aux; _delay_ms(10); PORTD&=!(1<<led4); } if((PINA&(1<<led5))==0){ PORTD|=(1<<led5); rez[led5]=led5; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led5]==0) ver[led5]+=aux; _delay_ms(10); PORTD&=!(1<<led5); } if((PINA&(1<<led6))==0){ PORTD|=(1<<led6); rez[led6]=led6; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led6]==0) ver[led6]+=aux; _delay_ms(10); PORTD&=!(1<<led6); } if((PINA&(1<<led7))==0){ PORTD|=(1<<led7); rez[led7]=led7; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led7]==0) ver[led7]+=aux; _delay_ms(10); PORTD&=!(1<<led7); } if((PINA&(1<<led8))==0){ PORTD|=(1<<led8); rez[led8]=led8; aux=0; for(i=0;i<N;i++){ if(rez[i]!=0){ aux++; } } if(ver[led8]==0) ver[led8]+=aux; _delay_ms(10); PORTD&=!(1<<led8); } }
- initializare Timer:
void Timer1_init(void){ // Initializare timer 1 compare match A pentru a avea un timer la nivel de 1 secunda, 16MHz OCR1A = 15624; TCCR1A = 0; // prescaler 1024 TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); TIMSK |= _BV(OCIE1A); }
- pentru intreruperile folosite la oprirea input-ului folosesc Timer1 al ATmega16 setat la nivel de 1s
- intarzierile pentru afisarea secventelor de memorat sau a nivelului sunt realizate cu ajutorul functiei _delay_ms() din biblioteca <delay.h>
1. placuta in faza de bootloader
2. inceputul jocului
Jocul este functional si dispune de 8 nivele de joc
Este un joc interactiv ce iti va pune memoria la incercare :D
Proiectul a fost unul interesant, in urma acestuia am invatat atat bazele programarii pentru ATmega16 cat si interfatarea hardware a diferitelor module cu acesta.
Laboratoarele 1 si 2:
http://elf.cs.pub.ro/pm/wiki/lab/lab1 - led-uri, butoane
http://elf.cs.pub.ro/pm/wiki/lab/lab2 - intreruperi, timer
Jocul original: http://en.wikipedia.org/wiki/Simon_%28game%29
Datashet-ul pentru ATmega16