#include <avr/io.h>				// definice periferii procesoru
#include <util/delay.h>			//knihovna funkce cekani
#define F_CPU 6000000UL  		//krystal 6 MHz

//============================================= >> FUNKCE SKENOVANI RADKU <<

void Touch_init(void)   	//podprogram zjistujici radek, ktery byl stisknut
{  
	ACSR |= ( 1 << ACIS1 )|( 1 << ACIS0 );	//ACIS1 a ACIS0=11 reskce na nastupnou hranu
	ACSR &= ~ ( 1 << ACD );					//ADC=0 pripojení napajeni komparatoru 
	SFIOR &= ~ ( 1 << ACME );	//ACME=0, zakazani multiplexovani komparatoru, pripojeni na AIN1		
	ACSR &= ~ ( 1 << ACBG );	//ACBG=0, vypnuti vnitrni reference 1,23V, pripojeni na AIN0	
	_delay_ms	( 1 );

	PORTA |= ( 1 << PORTA3 )|( 1 << PORTA4 )|( 1 << PORTA5 )|( 1 << PORTA6 )|( 1 << PORTA7 );
			//aktivace vsech sloupcu, aby bylo mozno detekovat dotyk

	ACSR |= ( 1 << ACIE ); 		//ACIE=1 povoleni preruseni komparatorem

	WDTCR &= ~ ( 1 << WDE );  	//Watchdog vypnut

	//--------------------------------------------- >> NASTAVENI A/D PREVODNIKU <<  
	   
    ADCSRA &= ~ (1<<ADEN);  	//zakazuje A/D prevodnik (ADEN), nutno pro multiplexovani

}//void Touch_init(void)

//============================================= >> FUNKCE SKENOVANI RADKU <<

unsigned int F_radek(void)   	//podprogram zjistujici radek, ktery byl stisknut
{  	
	for(unsigned char i=0;i<3;i++)	//postupna adresace jednotlivych radku
		{
		ADMUX = i;				//vyber kanalu prevodniku PA0 az PA2
 		_delay_ms	( 5 );		//cekani nez se vybere
		if((ACSR & 32)==0)		//pri stisku tlacitka se ACSR=0
			{
			return i+1;			//navratova hodnota = cislo radku 1 az 3
			break;				//ukonceni cyklu pri detekci stisknuteho radku
			}
		}//for(unsigned char i=0;i<3;i++)
}

//============================================= >> FUNKCE SKENOVANI CELEHO SCREENU <<

unsigned int F_stlaceno (void)
{
	volatile unsigned char stlaceno=0;	//nulovani promenne stlaceno
	unsigned char sloupec=0;

	SFIOR |= ( 1 << ACME );	//povoleni multiplexovani komparatoru
	ACSR |= ( 1 << ACBG ); 	//zapnuti vnitrni reference 1,23V
	_delay_ms	( 1 );		//cekani na nabeh vnitrni reference
					
	for(sloupec=1;sloupec<6;sloupec++)		//for cyklus adresujici postupne vsech 5 sloupcu touch screenu
		{
		PORTA = 0;			//nulovani celeho portu A
		if (sloupec==1)			//testovani prvniho sloupece
			{
			PORTA |= ( 1 << PORTA3 );	//nastaveni pinu PA3 na logickou 1 (adresace 1 sloupce)
			if (F_radek()>0) 			//testovani, jestli je stisknut nejaky radek v tomto sloupci
				{
				stlaceno=F_radek();	//pokud ano, zapise se do promenne stlaceno cislo plosky (1 az 3)
				break;				//ukonci se for cyklus, aby se neprochazely dalsi sloupce
				}
			}
		
		PORTA = 0;
		if (sloupec==2)
			{
			PORTA |= ( 1 << PORTA4 );
			if (F_radek()>0) 
				{
				stlaceno=3+F_radek();
				break;
				}
			}

		PORTA = 0;
		if (sloupec==3)
			{
			PORTA |= ( 1 << PORTA5 );
			if (F_radek()>0) 
				{
				stlaceno=6+F_radek();
				break;
				}
			}
		
		PORTA = 0;
		if (sloupec==4)
			{
			PORTA |= ( 1 << PORTA6 );
			if (F_radek()>0) 
				{
				stlaceno=9+F_radek();
				break;
				}
			}
		
		PORTA = 0;
		if (sloupec==5)
			{
			PORTA |= ( 1 << PORTA7 );
			if (F_radek()>0) 
				{
				stlaceno=12+F_radek();
				break;
				}
			}		
	
	}

	SFIOR &= ~ ( 1 << ACME );	//zakazani multiplexovani komparatoru, - pripojeni na AIN1		
	ACSR &= ~ ( 1 << ACBG );	//vytpnuti vnitrni reference 1,23V, + pripojeni na AIN0	
			
	PORTA |= ( 1 << PORTA3 )|( 1 << PORTA4 )|( 1 << PORTA5 )|( 1 << PORTA6 )|( 1 << PORTA7 );
		//aktivace vsech sloupcu, aby bylo mozno detekovat dotyk

	return stlaceno;		//navratova hodnota funkce (cislo stlacene plosky)
}//unsigned int F_stlaceno (void)
