#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/delay.h>
#include <avr\interrupt.h>
#include <avr\signal.h>


#define RS PB5
#define EN PB4
#define LCDPort PORTB
#define LCDOut DDRB
#define ADC_VREF_TYPE 0x00

unsigned char t0[] = "Volt";

ISR(ADC_vect)
{
	unsigned int ADCdata;
	unsigned char e;
	unsigned long volt;
	volt = ADCL;
	volt += ((int)ADCH<<8);
	volt = (volt*1000)/1024;
	lcd_com(0xC3);
	lcd_dat((volt/1000)%10 +0x30);
	lcd_dat((volt/100)%10 +0x30);
	lcd_dat((volt/10)%10 +0x30);
	lcd_dat((volt)%10 +0x30);
	_delay_ms(100);
	ADCSRA |= (1<<ADSC);
}

void lcd(unsigned char p)
{	LCDPort &= 0x30; 
	LCDPort |= (p>>4);
	_delay_ms(1);
	LCDPort &= ~_BV(EN);
	_delay_ms(4);
	LCDPort |= _BV(EN);
	_delay_ms(1);
	LCDPort &= 0x30;
	LCDPort |= (p&0x0F);
	_delay_ms(1);
	LCDPort &= ~_BV(EN);
	_delay_ms(4);

}


void lcd_com(unsigned char p)
{	LCDPort &= ~_BV(RS);
	LCDPort |= _BV(EN);
	lcd(p);
}

void lcd_dat(unsigned char p)
{	LCDPort |= _BV(RS) | _BV(EN);
	lcd(p);
}

void lcd_init(void)
{	lcd_com(0x33); _delay_ms(10);
	lcd_com(0x32);
	lcd_com(0x28);
	lcd_com(0x01);
	lcd_com(0x06);
	lcd_com(0x0C);
	lcd_com(0x80);
}


int main(void)
{	unsigned char a, e;
	unsigned int ADCdata;
	unsigned long volt;
	DDRB = 0xFF;
	PORTC = 0xF8;
	lcd_init();
	for (lcd_com(0x85), a=0; a<6; a++)
		{
	   	 lcd_dat(t0[a]);
		}
	ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR);
	ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
	sei();
	ADMUX |=(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);
	ADCSRA |= (1<<ADSC);
	while(1);
	
}