#include <avr/io.h>
#include <util/delay.h>
#define LCD_RS (1 << PD0)
#define LCD_EN (1 << PD1)
#define LCD_D4 (1 << PD4)
#define LCD_D5 (1 << PD5)
#define LCD_D6 (1 << PD6)
#define LCD_D7 (1 << PD7)
#define VREF 5.0
void LCD_command(unsigned char cmd) {
PORTD = (PORTD & 0x0F) | (cmd & 0xF0);
PORTD &= ~LCD_RS;
PORTD |= LCD_EN;
_delay_us(1);
PORTD &= ~LCD_EN;
PORTD = (PORTD & 0x0F) | ((cmd << 4) & 0xF0);
PORTD |= LCD_EN;
_delay_us(1);
PORTD &= ~LCD_EN;
_delay_ms(2);
}
void LCD_data(unsigned char data) {
PORTD = (PORTD & 0x0F) | (data & 0xF0);
PORTD |= LCD_RS;
PORTD |= LCD_EN;
_delay_us(1);
PORTD &= ~LCD_EN;
PORTD = (PORTD & 0x0F) | ((data << 4) & 0xF0);
PORTD |= LCD_EN;
_delay_us(1);
PORTD &= ~LCD_EN;
_delay_ms(1);
}
void LCD_init() {
DDRD |= (LCD_RS | LCD_EN | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7);
_delay_ms(15);
LCD_command(0x02);
_delay_ms(1);
LCD_command(0x28);
_delay_ms(1);
LCD_command(0x0C);
_delay_ms(1);
LCD_command(0x06);
_delay_ms(1);
LCD_command(0x01);
_delay_ms(2);
}
void LCD_clear() {
LCD_command(0x01);
_delay_ms(2);
}
void LCD_home() {
LCD_command(0x02);
_delay_ms(2);
}
void LCD_gotoxy(unsigned char x, unsigned char y) {
unsigned char row_offsets[] = {0x00, 0x40, 0x14, 0x54};
LCD_command(0x80 | (x + row_offsets[y]));
_delay_ms(1);
}
void ADC_init() {
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t ADC_read(uint8_t channel) {
ADMUX = (ADMUX & 0xF8) | (channel & 0x07);
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return ADC;
}
void LCD_display_voltaj(float voltaj) {
LCD_clear();
LCD_home();
LCD_data('V');
LCD_data('o');
LCD_data('l');
LCD_data('t');
LCD_data('a');
LCD_data('j');
LCD_data(':');
LCD_gotoxy(0, 1);
int int_part = (int)voltaj;
int decimal_part = (int)((voltaj - int_part) * 1000);
LCD_data(int_part + '0');
LCD_data('.');
LCD_data((decimal_part / 100) + '0');
LCD_data(((decimal_part / 10) % 10) + '0');
LCD_data('V');
}
int main() {
LCD_init();
ADC_init();
uint16_t adc_value;
float voltaj;
while (1) {
adc_value = ADC_read(0);
voltaj = (float)adc_value * VREF / 1023.0;
LCD_display_voltaj(voltaj);
_delay_ms(500);
}
return 0;
}