#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
// LCD пины
#define LCD_PORT PORTD
#define LCD_DDR DDRD
#define RS PD0
#define E PD1
// Функции LCD
void LCD_Init() {
LCD_DDR |= (1<<RS)|(1<<E)|(1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7);
_delay_ms(50);
LCD_Command(0x33);
LCD_Command(0x32);
LCD_Command(0x28);
LCD_Command(0x0C);
LCD_Command(0x06);
LCD_Command(0x01);
}
void LCD_Command(unsigned char cmd) {
LCD_PORT = (LCD_PORT & 0x0F) | (cmd & 0xF0);
LCD_PORT &= ~(1<<RS);
LCD_PORT |= (1<<E);
_delay_us(1);
LCD_PORT &= ~(1<<E);
_delay_ms(2);
LCD_PORT = (LCD_PORT & 0x0F) | (cmd << 4);
LCD_PORT |= (1<<E);
_delay_us(1);
LCD_PORT &= ~(1<<E);
_delay_ms(2);
}
void LCD_Data(unsigned char data) {
LCD_PORT = (LCD_PORT & 0x0F) | (data & 0xF0);
LCD_PORT |= (1<<RS);
LCD_PORT |= (1<<E);
_delay_us(1);
LCD_PORT &= ~(1<<E);
_delay_ms(2);
LCD_PORT = (LCD_PORT & 0x0F) | (data << 4);
LCD_PORT |= (1<<E);
_delay_us(1);
LCD_PORT &= ~(1<<E);
_delay_ms(2);
}
void LCD_Print(char *str) {
while(*str) LCD_Data(*str++);
}
int main() {
// Инициализация ADC
ADMUX = (1<<REFS0); // AVCC как опорное напряжение
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Включаем ADC, делитель 128
LCD_Init();
LCD_Print("Temp: ");
while(1) {
// Чтение LM35 (PA0/ADC0)
ADCSRA |= (1<<ADSC); // Запуск преобразования
while(ADCSRA & (1<<ADSC)); // Ждем завершения
uint16_t adc_value = ADC;
// Конвертация в температуру (LM35: 10mV = 1°C)
float temperature = (adc_value * 5.0 * 100.0) / 1024.0;
// Отображение
char buffer[10];
sprintf(buffer, "%.1fC", temperature);
LCD_Command(0xC0); // Переход на вторую строку
LCD_Print(" "); // Очистка строки
LCD_Command(0xC0);
LCD_Print(buffer);
_delay_ms(1000); // Обновление каждую секунду
}
}