Загрузил(а) файлы в ''

This commit is contained in:
Андрей Деркачев 2023-07-29 13:50:30 +00:00
parent be7bedb8c7
commit 97f38c92d5
5 changed files with 177 additions and 0 deletions

64
display_functions.c Normal file
View File

@ -0,0 +1,64 @@
#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);
}

24
display_functions.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef DISPLAY_FUNCTIONS_H
#define DISPLAY_FUNCTIONS_H
#include "i2c_functions.h"
#include <stdint.h>
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

24
i2c_functions.c Normal file
View File

@ -0,0 +1,24 @@
#include "i2c_functions.h"
#include <util/delay.h>
// Здесь можно вставить код инициализации 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
}

12
i2c_functions.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef I2C_FUNCTIONS_H
#define I2C_FUNCTIONS_H
#include <stdint.h>
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

53
main.c Normal file
View File

@ -0,0 +1,53 @@
#include <avr/io.h>
#include <util/delay.h>
#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;
}