Uživatel:Richtlen

Z MAM wiki

Přejít na: navigace, hledání

Semetrální projekt: Hrací kostka

Schéma zapojení:

Program pro ATmega 88, simulující hod šestistrannou kostkou

Náhodné zobrazení čísel před padnutím finálního čísla

Kostka využívá 7-segmentový displej

Postupné zpomalování při "losování čísla"

Tlačítko "Cheat" pro více štěstí ve hře. (pravděpodobnost padnutí 6 je 50%)


Schéma zapojení:

Soubor:kostka.jpg


Zdrojový kód:


//ATmega88, frekvence 1MHz

#include<avr/io.h>//knihovna io

#include<util/delay.h>//knihovna pro zpozdeni

#include<stdlib.h>//knihovna pro generovani nahodneho cisla



#define RAND_MAX   0x7FFF//maximalni hodnota generovana funkci pro nahodne cislo

#define segmentovka_PORT PORTD //port pro sedmisegment

#define segmentovka_vystup DDRD//registr pro nastaveni vstupu nebo vystupu



#define tlacitko_start (PINC & 0x01)//pin na portu pro tlacitko start

#define tlacitko_cheat (PINC & 0x02)//pin na portu pro tlacitko cheat



volatile int cislo = 0;//promenna pro cislo zobrazene na sedmisegmentovce



/*pole pro zobrazeni na sedmisegmetovce, pokud by byla atmega napojena primo na 

nejaky bcd dekoder pro sedmisegmentovku, mohlo by se na port posilat primo 

cislo 1 - 6, takto jsem zde dal pole, a index 0 - 5 odpovida cislum 1 - 6 na sedmisegmentovce

(napo. pole_segment[0] zobrazi 1, pole_segment[1] zobrazi 2 atd.)*/

volatile unsigned char pole_segment[7] = {0xF9, 0x24, 0x30, 0x19, 0x92, 0x82, 0x00}; 

volatile unsigned char cas = 0, cheat = 0;//promenna cas pro zobrazeni zpomalujicich hodnot

  


//hlavni program

int main(void)
{
CLKPR=0x80;
CLKPR=0x03;


segmentovka_vystup = 0xFF;//nastaveni portu pro sedmisegmentovku jako vystupni

segmentovka_PORT = 0x00;//jelikoz sedmisegmentovka je se spolecnou anodou,rozsviti vsechny segmenty

//test sedmisegmentovky, po sekunde se zobrazuji postupne cisla od 1 do 6 a pak zustanou svitit vsechny segmenty

for(int i = 0; i < 7; i++) 

{
	segmentovka_PORT = pole_segment[i];

	_delay_ms(1000);

}



//nekonecna smycka

while(1)

{
if(tlacitko_start == 0)//stisknuto tlacitko cheat

	{

	cheat = 1;	//priznak tlacitka cheat

	_delay_ms(10); //jednoduche osetreni zakmitu pri stisku tlacitka

	}

	if(tlacitko_start == 0)//stisknuto tlacitko start

	{

		_delay_ms(10);//jednoduche osetreni zakmitu pri stisku tlacitka

		switch(cheat)//vetveni - normalni mod nebo stisk tlacitka cheat

		{

		case 0: //normalni mod

					cas = 0;//promena pro zpomalujici se cislice



				for(int i = 0; i < 20; i++)//dvacetkrat se rychle zmeni cislo na segmentovce a pak se zastavi

				{

					cislo = rand() / (RAND_MAX / 6) + 1; //generovani nahodneho cisla od 1 do 6, funkce se nachazi v knihovne stdlib.h

					segmentovka_PORT = pole_segment[cislo - 1]; //nastaveni PORTU sedmisegmentovky

					cas++;//cas se postupne zvetsuje a cisla na sedmisegmentovce se zpomaluji


for(int i = 0; i < cas; i++) _delay_ms(5);//tento zapis zabira daleko min pameti nez kdybych napsal _delay_ms(cas), promenna ve funkci _delay_ms zabira hodne pameti
				}


break;
	case 1: //mod cheat
			cas = 0;

			//toto je stejne jako v pripade case 0, aby bylo zachovano meneni cisel az po zastaveni

				for(int i = 0; i < 20; i++)

				{
					cislo = rand() / (RAND_MAX / 6) + 1; 

					segmentovka_PORT = pole_segment[cislo - 1];

					cas++;

					for(int i = 0; i < cas; i++)	_delay_ms(5);

				}
//zde je 50% pravdepodobnost ze padne 6, nahodne cislo je generovano pouze jako 1 a 2

					cislo = rand() / (RAND_MAX / 2) + 1; 

					if(cislo == 2) cislo = 6; //pokud se nahodne vygeneruje 2 tak se zobrazi 6, pokud se vygeneruje 1 dochazi pak dale ke generovani cisla od 1 do 5

					else cislo = rand() / (RAND_MAX / 5) + 1; //generuje od 1 do 5

					segmentovka_PORT = pole_segment[cislo - 1];

		break;

		}
	cheat = 0;//nulovani priznaku stisku tlacitka cheat
	}

}

}

Vytvořili: Daniel Fajmon , Lenka Richterová, Petr Javorský

Osobní nástroje