diff --git a/display_functions.c b/display_functions.c new file mode 100644 index 0000000..76b8f9d --- /dev/null +++ b/display_functions.c @@ -0,0 +1,64 @@ +#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); +} diff --git a/display_functions.h b/display_functions.h new file mode 100644 index 0000000..0d25b61 --- /dev/null +++ b/display_functions.h @@ -0,0 +1,24 @@ +#ifndef DISPLAY_FUNCTIONS_H +#define DISPLAY_FUNCTIONS_H + +#include "i2c_functions.h" +#include + +struct DisplayData { + char topLine[64]; + int value1; + int value2; + int value3; +}; + +struct TextCounter { + unsigned long startTime; + int incrementValue; +}; + +void lcd_init(); +void lcd_print_char(char c); +void lcd_print_string(const char *str); +void lcd_update(const DisplayData *displayData, const TextCounter *textCounter); + +#endif diff --git a/i2c_functions.c b/i2c_functions.c new file mode 100644 index 0000000..5ccac3f --- /dev/null +++ b/i2c_functions.c @@ -0,0 +1,24 @@ +#include "i2c_functions.h" +#include + +// Здесь можно вставить код инициализации I2C, если требуется + +void i2c_delay() { + _delay_us(2); +} + +void i2c_start() { + // Реализация отправки стартового условия I2C +} + +void i2c_stop() { + // Реализация отправки стопового условия I2C +} + +void i2c_send_byte(uint8_t data) { + // Реализация отправки одного байта данных по I2C +} + +void i2c_send_bytes(const uint8_t *data, uint8_t length) { + // Реализация отправки массива данных (длиной length) по I2C +} diff --git a/i2c_functions.h b/i2c_functions.h new file mode 100644 index 0000000..555e732 --- /dev/null +++ b/i2c_functions.h @@ -0,0 +1,12 @@ +#ifndef I2C_FUNCTIONS_H +#define I2C_FUNCTIONS_H + +#include + +void i2c_delay(); +void i2c_start(); +void i2c_stop(); +void i2c_send_byte(uint8_t data); +void i2c_send_bytes(const uint8_t *data, uint8_t length); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..1fa31e8 --- /dev/null +++ b/main.c @@ -0,0 +1,53 @@ +#include +#include +#include "display_functions.h" + +// Основной код вашего проекта + +int main() { + // Настройка портов и другие инициализации + + lcd_init(); // Инициализация дисплея + + // Ваш код в функции setup() + + while (1) { + unsigned long currentTime = millis(); // Текущее время + // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue + if (currentTime - textCounter.startTime >= 500) { + textCounter.incrementValue++; // Увеличиваем incrementValue на 1 + textCounter.startTime = currentTime; // Обновляем время + } + + DisplayData displayData; + strncpy(displayData.topLine, "we are responsible for those who have been tame ", sizeof(displayData.topLine) - 1); + displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; + displayData.value1 = 500; + displayData.value2 = 800; + displayData.value3 = 855; + // Буферы для заполнения данных + char buffer1[17]; + char buffer2[17]; + // Заполнение буфера 1 + fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); + // Заполнение буфера 2 + fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); + // Создание массива для вывода на дисплей + char displayArray[32]; + strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray + strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 + + // Вывод данных на экран + lcd.setCursor(0, 0); + lcd.print(displayArray); + lcd.setCursor(0, 1); + lcd.print(displayArray + 16); // Вывод второй половины displayArray + + // Ваш код в функции loop() может быть здесь или в другом месте + + // Обновление данных на дисплее + lcd_update(&displayData, &textCounter); + } + + return 0; +}