#include "display_functions.h" #include #define LCD_ADDRESS 0x27 // Адрес дисплея на шине I2C #define LCD_WIDTH 16 // Ширина дисплея в символах #define LCD_HEIGHT 2 // Высота дисплея в строках void lcd_send_command(uint8_t command) { Wire.beginTransmission(LCD_ADDRESS); i2c_send_byte(0x80); // Co = 0, Rs = 0 (управляющий байт) i2c_send_byte(command); Wire.endTransmission(); } void lcd_send_data(uint8_t data) { Wire.beginTransmission(LCD_ADDRESS); i2c_send_byte(0xC0); // Co = 0, Rs = 1 (байт данных) i2c_send_byte(data); Wire.endTransmission(); } void lcd_send_string(const char *str) { while (*str) { lcd_send_data(*str); str++; } } void lcd_clear() { lcd_send_command(0x01); // Очистка дисплея _delay_ms(2); // Небольшая пауза для завершения очистки } void lcd_init() { Wire.begin(); lcd_send_command(0x38); // Установка интерфейса: 8 бит данных, 2 строки, 5x8 точек lcd_send_command(0x08); // Отключение дисплея, курсора и мигания курсора lcd_send_command(0x01); // Очистка дисплея _delay_ms(2); // Небольшая пауза для завершения очистки lcd_send_command(0x06); // Установка направления текста: курсор увеличивается, сдвиг дисплея lcd_send_command(0x0C); // Включение дисплея без курсора и мигания курсора } void lcd_print_char(char c) { lcd_send_data(c); } void lcd_print_string(const char *str) { lcd_send_string(str); } void lcd_update(const DisplayData *displayData, const TextCounter *textCounter) { lcd_clear(); // Очистка дисплея перед выводом новой информации // Вывод данных на первую строку lcd_send_command(0x80); // Установка курсора на начало первой строки lcd_send_string(displayData->topLine); // Вывод данных на вторую строку lcd_send_command(0xC0); // Установка курсора на начало второй строки char buffer[17]; snprintf(buffer, sizeof(buffer), "%d.%d.%d", displayData->value1, displayData->value2, displayData->value3); lcd_send_string(buffer); }