#include <avr/io.h>
#include <avr/iom16.h>


#define RS PC0
#define EN PC2
#define Time 10

void pause_(unsigned int a)
{	unsigned int cn;
	for (cn=a; cn > 0; cn--);
}

void lcd_com(unsigned char p)
{	PORTC &= ~_BV(RS);
	PORTC |= _BV(EN);
	PORTD &= 0x0F; PORTD |= (p & 0xF0);
	pause_(Time);
	PORTC &= ~_BV(EN);
	pause_(Time);
	PORTC |= _BV(EN);
	pause_(Time);
	PORTD &= 0x0F; PORTD |= (p<<4);
	pause_(Time);
	PORTC &= ~_BV(EN);
	pause_(5*Time);
}

void lcd_dat(unsigned char p)
{	PORTC |= _BV(RS) | _BV(EN);
	PORTD &= 0x0F; PORTD |= (p & 0xF0);
	pause_(Time);
	PORTC |= _BV(EN);
	pause_(Time);
	PORTD &= 0x0F; PORTD |= (p<<4);
	pause_(Time);
	PORTC &= ~_BV(EN);
	PORTC &= ~_BV(RS);
	pause_(5*Time);
}

void lcd_init(void)
{	lcd_com(0x33); pause_(500*Time);
	lcd_com(0x33);
	lcd_com(0x32); lcd_com(0x28);
	lcd_com(0x01);
	lcd_com(0x28); 
	lcd_com(0x06);
	lcd_com(0x0D);
	lcd_com(0x82);
}

int main(void)
{	PORTB = DDRD = 0xFF;
	PORTC = 0xF8; DDRC = 0x07;
	lcd_init();
	lcd_dat('H'); lcd_dat('e'); lcd_dat('l');
	lcd_dat('l'); lcd_dat('o'); 
	lcd_com(0xC3);
	lcd_dat('W'); lcd_dat('o');
	lcd_dat('r'); lcd_dat('l'); lcd_dat('d');
	while(0)
	{
	}
}
