Display_Avr_3/display_functions.c

65 lines
2.6 KiB
C

#include "display_functions.h"
#include <Wire.h>
#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);
}