
//----------------------- Tlačítka --------------------------------------------
#define F_CPU 16000000		// definice frekvence krystalu
#include <avr/io.h>			// knihovna vstupů a výstupů
#include <avr/interrupt.h>	// knihovna pro přerušení
#include <util/delay.h>		// knihovna pro časování

// hlavičky funkcí------------------------------------------------------------
void tlacitko1 (void);		
void tlacitko2 (void);

// globální proměnné
int hodnota = 0;			// hodnota čítače


int main (void)			
{
	DDRA = 0xff;			// port A a C jako výstupní
	DDRC = 0xff;
	DDRD = 0;				// port D jako vstupní
	PORTC = 0b00000011;		// povolení LED diod

	MCUCR = 0b00000010;		// přerušení na sestupnou hranu na INT0
	GICR = 0b01000000;		// povolení přerušení od INT0
	sei();					// globální povolení přerušení v programu

	while(1)		
	{
	  tlacitko1();			// stisknutí tlačítka SW0 - neošetřeno
	  tlacitko2();			// stisknutí tlačítka SW1 - čekací smyčka

	  PORTA = hodnota;		// zobraz hodnotu na LED
	  _delay_ms(100);		// časová prodleva		
	}

   	return(1);
}

void tlacitko1 (void)		// neošetřené stisknutí
{
	if ((PIND&0b00000001)==0)	// test stisku 1.tlacitka
		hodnota++;				// inkrementace čítače
}

void tlacitko2 (void)		// jednoduché ošetření
{
	if ((PIND&0b00000010)==0)	// test stisku 2.tlacitka
		{
			_delay_ms(60);		// počkej dokud odezní zákmity
			hodnota++;			// inkrementace čítače
		}
}

ISR (INT0_vect)				// řešení tlačítka SW2 přes přerušení
{
	_delay_ms(60);			// ošetření proti zákmitům
	hodnota++;				// přičte hodnotu
	GIFR = 0b00000000;		// vyprázdni registr
	// pokud by registr GIFR nebyl vyprázdněn mohlo by dojít ihned k dalšímu přerušení
	// jelikož je zde příznakový bit, který signalizuje požadavek na přerušení
}

