#define F_CPU 4000000UL

#include <util/delay.h>
#include <avr/io.h>
#include <util/twi.h>


#define LRS PB5
#define LRW PB6
#define LE 	PB7

#define RTC_ADDR_W 0b01100100
#define RTC_ADDR_R 0b01100101


	  
void send_data(char i,char rs)			//LCD-re kiküldi az adott parancsot
	{

	
	if (rs==1) PORTB=(1<<LRS)|(1<<LE); else PORTB=(1<<LE);
	asm("NOP");
	PORTA=i;
	
	asm("NOP");
	PORTB&=(~(1<<LE));
	asm("NOP");
	PORTB=(1<<LE);
	asm("NOP");
	


	}

void asci(char c)
{
switch (c)
{
case 'A': send_data(0x41,1); break;
case 'B': send_data( 0x42,1); break;
case 'C': send_data( 0x43,1); break;
case 'D': send_data( 0x44,1); break;
case 'E': send_data( 0x45,1); break;
case 'F': send_data( 0x46,1); break;
case 'G': send_data( 0x47,1); break;
case 'H': send_data( 0x48,1); break;
case 'I': send_data( 0x49,1); break;
case 'J': send_data( 0x4A,1); break;
case 'K': send_data( 0x4B,1); break;
case 'L': send_data( 0x4C,1); break;
case 'M': send_data( 0x4D,1); break;
case 'N': send_data( 0x4E,1); break;
case 'O': send_data( 0x4F,1); break;
case 'P': send_data( 0x50,1); break;
case 'Q': send_data( 0x51,1); break;
case 'R': send_data( 0x52,1); break;
case 'S': send_data( 0x53,1); break;
case 'T': send_data( 0x54,1); break;
case 'U': send_data( 0x55,1); break;
case 'V': send_data( 0x56,1); break;
case 'W': send_data( 0x57,1); break;
case 'X': send_data( 0x58,1); break;
case 'Y': send_data( 0x59,1); break;
case 'Z': send_data( 0x5A,1); break;



case 'a': send_data( 0x61,1); break;
case 'b': send_data( 0x62,1); break;
case 'c': send_data( 0x63,1); break;
case 'd': send_data( 0x64,1); break;
case 'e': send_data( 0x65,1); break;
case 'f': send_data( 0x66,1); break;
case 'g': send_data( 0x67,1); break;
case 'h': send_data( 0x68,1); break;
case 'i': send_data( 0x69,1); break;
case 'j': send_data( 0x6A,1); break;
case 'k': send_data( 0x6B,1); break;
case 'l': send_data( 0x6C,1); break;
case 'm': send_data( 0x6D,1); break;
case 'n': send_data( 0x6E,1); break;
case 'o': send_data( 0x6F,1); break;
case 'p': send_data( 0x70,1); break;
case 'q': send_data( 0x71,1); break;
case 'r': send_data( 0x72,1); break;
case 's': send_data( 0x73,1); break;
case 't': send_data( 0x74,1); break;
case 'u': send_data( 0x75,1); break;
case 'v': send_data( 0x76,1); break;
case 'w': send_data( 0x77,1); break;
case 'x': send_data( 0x78,1); break;
case 'y': send_data( 0x79,1); break;
case 'z': send_data( 0x7A,1); break;

case '0': send_data( 0x30,1); break;
case '1': send_data( 0x31,1); break;
case '2': send_data( 0x32,1); break;
case '3': send_data( 0x33,1); break;
case '4': send_data( 0x34,1); break;
case '5': send_data( 0x35,1); break;
case '6': send_data( 0x36,1); break;
case '7': send_data( 0x37,1); break;
case '8': send_data( 0x38,1); break;
case '9': send_data( 0x39,1); break;
case ':': send_data( 0x3A,1); break;
case '_': send_data( 0x5F,1); break;
case ' ': send_data( 0x20,1); break;



}



}


  



int sendI2Cdata()
{

TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWSTA);	//küldjön start bitet kezdjen adást

while ((TWCR & (1<<TWINT))==0) 			//várjon amíg sikerült elküldeni
		{
		;
		}

if ((TWSR & 0xF8) != TW_START) 
{ asci('s'); return 0;}		//státusz? rendben lejalott



TWDR = RTC_ADDR_W;						//adatregiszterbe írja be a slave címét write ciklusnak
TWCR = (1<<TWINT) | (1<<TWEN);			//adat küldés 


while (!(TWCR & (1<<TWINT)))			//várjon nyugtázásra
		{;}



if ((TWSR & 0xF8) != TW_MT_SLA_ACK) 			//nyugta megérkezett?
{ asci('a'); return 0;}

//-------------------------------------------------------



TWDR = 0b11100000;						//küldendő adat
TWCR = (1<<TWINT) | (1<<TWEN);

while (!(TWCR & (1<<TWINT)))			//nyugtázásra várás
		{;}

if ((TWSR & 0xF8) != TW_MT_SLA_ACK)			//nyugta?
{ asci('d'); return 0;}


TWDR = 0;								//újabb adat
TWCR = (1<<TWINT) | (1<<TWEN);

while (!(TWCR & (1<<TWINT)))			//nyugtára várás
		{;}

if ((TWSR & 0xF8) != TW_MT_SLA_ACK)			//nyugta?
{ asci('d'); return 0;}



//-------------------------------------------------------



TWCR=(1<<TWINT) | (1<<TWEN) | (1<<TWSTO);  		//küldjön stop bitet

asci('o');
}


void init()
{

           DDRA =0xff;		    //PORT A kimenet
		   PORTA=0;

			DDRB=0b11100000;
			PORTB=0b00100000;			//LCD vezérlés


			TWBR=64;    // I2C frekvenciája 27.7 kHz-re van állkítva
			TWSR=0;		

}





int main() 
{

			init();
			

           while(1) 
			{
		   send_data(1,0);
		   _delay_ms(100); //kijelző törlése
		   send_data(0b00000010,0);
		   _delay_ms(100); //kijelző alaphelyzetbe állítása
		   send_data(0b00001111,0); //kijelző és kurzol bekapcsolása
		   _delay_ms(100);
		   send_data(0b00111000,0);
		   _delay_ms(100); //8vit,2soros,7bites üzemmód
	
			asci('j');
			_delay_ms(100);



			sendI2Cdata();

			
			_delay_ms(5000);

		   }
           return 0;
}
