Table of Contents

Simon Says - Game

Introducere

1. Descriere generala

Clasicul joculet de memorie “Simon says”

2. Reguli

3. Scopul

4. Utilitate

Hardware Design

Piese folosite

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:

Software Design

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;

}

Rezultat

La finalul proiectului s-a obtinut un joc functional “Simon says”

Concluzii

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.

Download

voiculescu_rafaela_331ca_proiect_pm.zip

Bibliografie

http://elf.cs.pub.ro/pm/wiki/

http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf