
//-------------------------- Jednoduchý čítač -----------------------------------------
#define F_CPU 16000000
#include <avr/io.h>				// knihovna vstupů a výstupů
#include <util/delay.h>			// knihovna s časovačem

// hlavičky funkcí---------------------------------------------------------------------
void LED (int hodnota);
void segment (int hodnota);


int main (void)		
{
	DDRA = 0xff;				// nastavení portů A,B,C jako výstupních
	DDRB = 0xff;
	DDRC=0xff;
	PORTC=0b00111101;			// povolení LED a 7 segmentového displeje

	int hodnota = 0;			// hodnota časovače
	
	while(1)		
	{
		piezo();				// generování zvuku
		LED(hodnota);			// výpis hodnoty na LED
		segment(hodnota);		// výpis hodnoty na 7-segmentový displej
		
		hodnota++;				// inkrementace hodnoty
		if (hodnota==10)	 hodnota=0;	// čítač pouze do 9-ti
			
		_delay_ms(400);  		// časová prodleva 1s
		_delay_ms(400); 
		_delay_ms(200);
	}
}

void LED (int hodnota)				
{
	PORTA = hodnota;			// zobrazení hodnoty na LED diodách
}

void segment (int hodnota)		// zobrazení hodnoty na 7-segmentovém displeji
{
	switch (hodnota)
	{
		case 0:PORTB=0b01111110;				// zapis znaku "0"
			break;
		case 1:PORTB=0b00001100;				// zapis znaku "1"
			break;
		case 2:PORTB=0b10110110;				// zapis znaku "2"
			break;
		case 3:PORTB=0b10011110;				// zapis znaku "3"
			break;
		case 4:PORTB=0b11001100;				// zapis znaku "4"
			break;
	    case 5:PORTB=0b11011010;				// zapis znaku "5"
			break;
		case 6:PORTB=0b11111010;				// zapis znaku "6"
			break;
		case 7:PORTB=0b00001110;				// zapis znaku "7"
			break;
		case 8:PORTB=0b11111110;				// zapis znaku "8"
			break;
	    case 9:PORTB=0b11011110;				// zapis znaku "9"
			break;
	}
}

void piezo (void)							// generování zvuku
{
	DDRD = 0xff;							// port D jako výstupní

	for (int i=0;i<5;i++)					// generuje 5 period zvuku
	{
		PORTD = 10000000;					// nastaví výstup
		_delay_ms(1);						// T/2 = 1 ms
		PORTD = 0;							// nuluje výstup
		_delay_ms(1);						// T = 2*1ms = 2 ms => f = 500 Hz
	}
		
}
