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