#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t adc_result = 0;
#define RS PD0
#define EN PD1
#define D4 PD2
#define D5 PD3
#define D6 PD4
#define D7 PD5
uint8_t column_y[2] = {0,64};
void lcd_init(void);
void send_command(unsigned char command);
void send_data(unsigned char data);
void send_string(char *string);
void set_cursor(uint8_t x,uint8_t y);
void adc_init(void);
void start_conversion(void);
void send_adc(uint8_t result);
int main(void)
{
lcd_init();
adc_init();
start_conversion();
while(1)
{
send_adc(adc_result);
}
return 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(0x0C);
send_command(0x06);
send_command(0x01);
_delay_ms(2);
}
void send_command(unsigned char command)
{
PORTD = ((PORTD & 0x03) | ((command & 0xF0) >> 2));
PORTD &= ~(1 << RS);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(200);
PORTD = ((PORTD & 0x03) | ((command & 0x0F) << 2));
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(2);
}
void send_data(unsigned char data)
{
PORTD = ((PORTD & 0x03) | ((data & 0xF0) >> 2));
PORTD |= (1 << RS);
PORTD |= (1 << EN);
_delay_ms(1);
PORTD &= ~(1 << EN);
_delay_ms(200);
PORTD = ((PORTD & 0x03) | ((data & 0x0F) << 2));
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 + column_y[y]);
}
void adc_init(void)
{
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADIE);
DIDR0 |= (1 << ADC0D);
sei();
}
void start_conversion(void)
{
ADCSRA |= (1 << ADSC);
}
void send_adc(uint8_t result)
{
char buffer[16];
set_cursor(0,0);
itoa(result,buffer,10);
send_string(buffer);
}
ISR(ADC_vect)
{
//uint16_t value = ADCH << 2 | ADCL >> 6;
adc_result = ADC;
start_conversion();
}