#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define RS PD0
#define EN PD1
#define D4 PD4
#define D5 PD5
#define D6 PD6
#define D7 PD7
int col[2] = {0,64};
volatile uint16_t adc_result = 0;
void lcd_init(void)
{
DDRD |= (1 << RS) | (1 << EN) | (1 << D4) | (1 << D5) | (1 << D6) | (1 << D7);
_delay_ms(20);
send_command(0x33);
send_command(0x32);
send_command(0x28);
send_command(0x0E);
send_command(0x06);
send_command(0x01);
_delay_ms(50);
}
void adc_init(void)
{
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
void send_command(unsigned char command)
{
PORTD = ((PORTD & 0x03) | (command & 0xF0));
PORTD &= ~(1 << RS);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(200);
PORTD = ((PORTD & 0x03) | (command & 0x0F) << 4);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(2);
}
void send_data(unsigned char data)
{
PORTD = ((PORTD & 0x03) | (data & 0xF0));
PORTD |= (1 << RS);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(200);
PORTD = ((PORTD & 0x03) | (data & 0x0F) << 4);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(2);
}
void send_string(char *string)
{
while(*string != '\0')
{
send_data(*string++);
}
}
void set_cursor(uint8_t x,uint8_t y)
{
send_command(0x80 + x + col[y]);
}
float read_temp(uint8_t channel)
{
unsigned int adc_value;
float temp;
adc_value = adc_read(channel);
//temp = adc_value * (5.0 / 1023.0);
temp = (adc_value * 500) / 1024.0;
return temp;
}
uint16_t adc_read(uint8_t channel)
{
ADMUX |= ((ADMUX & 0xF0) | (channel & 0x0F));
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
return ADCW;
}
void send_result(uint16_t result)
{
char buffer[16];
itoa(result,buffer,10);
send_string(buffer);
}
void lcd_clear(void)
{
send_command(0x01);
}
int main(void)
{
uint16_t value;
adc_init();
lcd_init();
set_cursor(0,0);
send_string("thermo");
set_cursor(0,1);
while(1)
{
value = read_temp(0);
send_result(value);
_delay_ms(500);
lcd_clear();
}
return 0;
}