#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//lcd connections
#define lcd_data PORTD
#define lcd_data_dir DDRD
#define lcd_ctrl PORTB
#define lcd_ctrl_dir DDRB
#define RS PB1
#define RW PB3
#define EN PB3
char column_y[2] = {0,64};
volatile uint16_t adc_result = 0;
//lcd initialzation (8 bit mode)
void lcd_init(void)
{
lcd_ctrl_dir |= (1 << RW) | (1 << RS) | (1 << EN);
_delay_ms(50);
send_command(0x01);
_delay_ms(2);
send_command(0x38);
_delay_ms(50);
send_command(0x0E);
_delay_ms(50);
}
//adc initialization
void adc_init(void)
{
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2) | (1 << ADIE);
DIDR0 |= (1 << ADC0D);
sei();
}
//start conversion
void start_conversion(void)
{
ADCSRA |= (1 << ADSC);
}
//enable interrupt
ISR(ADC_vect)
{
uint8_t low = ADCL;
uint16_t tenbit = ADCH << 8 | low;
adc_result = tenbit;
start_conversion();
}
//send command
void send_command(unsigned char command)
{
check_busy();
lcd_data = command;
lcd_ctrl &= ~((1 << RW) | (1 << RS));
peekaboo();
lcd_data = 0;
}
//send data
void send_data(unsigned char data)
{
check_busy();
lcd_data = data;
lcd_ctrl &= ~(1 << RW);
lcd_ctrl |= (1 << RS);
peekaboo();
lcd_data = 0;
}
//send byte
void send_byte(unsigned char data, int mode)
{
if(mode == 1)
{
lcd_ctrl |= (1 << RS);
}
else
{
lcd_ctrl &= ~(1 << RS);
}
send_data(data);
send_data(data << 4);
_delay_ms(89);
}
//check busy
void check_busy(void)
{
lcd_data_dir = 0;
lcd_ctrl &= ~(1 << RS);
lcd_ctrl |= (1 << RW);
while(lcd_data >= 0x80)
{
peekaboo();
}
lcd_data_dir = 0xFF;
}
//peeking
void peekaboo(void)
{
lcd_ctrl |= (1 << EN);
asm volatile("nop");
asm volatile("nop");
lcd_ctrl &= ~(1 << EN);
}
//send interger
void send_integer(char lenght,int integervalue)
{
char buffer[lenght];
itoa(integervalue,buffer,10);
set_cursor(0,0);
for(int i=0;i<lenght;i++)
{
send_string(" ");
}
send_string(buffer);
}
//set cursor
void set_cursor(uint8_t x,uint8_t y)
{
send_command(0x80 + x + column_y[y]);
}
//send string
void send_string(char *string)
{
while(*string != '\0')
{
send_data(*string++);
}
}
//send adc value
void send_adc(void)
{
char buffer[16];
itoa(adc_result,buffer,10);
set_cursor(0,0);
send_string(buffer);
}
//main function
int main(void)
{
lcd_init();
adc_init();
start_conversion();
while(1)
{
send_adc();
_delay_ms(100);
}
return 0;
}