#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/delay.h>

#define RS PB5
#define EN PB4
#define LCDPort PORTB
#define LCDOut DDRB
#define ADC_VREF_TYPE 0x00

unsigned char t0[] = "Volt";


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;
	unsigned long volt1, volt2, res;
	float  VL1, VL2, ksv;
	DDRB = 0xFF;
	PORTC = 0xF8;
	lcd_init();
	for (lcd_com(0x80), a=0; a<6; a++)
		{
	   	 lcd_dat(t0[a]);
		}
	ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR);
	ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
	while(1)
	{

		ADCH = 0x00;
		ADCL = 0x00;
		ADMUX &= 0xF1;
		ADMUX |=(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0);
		ADCSRA |= (1<<ADSC);
		while (ADCSRA&0x40);
		volt1 = ADCL;
		volt1 += ((int)ADCH<<8);
//		vl1 = volt1;
		_delay_ms(1);
		ADCH = 0x00;
		ADCL = 0x00;
		ADMUX &=0xF3;
		ADMUX |=(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0);
		ADCSRA |= (1<<ADSC);
		while (ADCSRA&0x40);
		volt2 = ADCL;
		volt2 += ((int)ADCH<<8);
//		vl2 = volt2;
		ksv = (int)(((volt1+volt2)/(volt1-volt2))*1000.0);
		res = (int)(ksv);
		lcd_com(0x89);
		lcd_dat((res/10000)%10 +0x30);
		lcd_dat((res/1000)%10 +0x30);
		lcd_dat('.');
		lcd_dat((res/100)%10 +0x30);
		lcd_dat((res/10)%10 +0x30);
		lcd_dat((res)%10 +0x30);
		for (a=6000; a>0; a--);

	}
	
}