Как вывести текст на дисплей LCD 1602A с использованием языка C++?

У меня есть плата esp32-s3-devkic-1 и LCD дисплей 1602A версии 5.5. Я пытаюсь вывести простую фразу на первую строку дисплея, но у меня это никак не удается. Я ознакомился с принципом передачи данных на дисплей (команды и символы) и написал, на мой взгляд, логичный код, однако он не работает. Я пишу код и прошиваю плату, используя VScode с расширением esp-idf. Я проверял работоспособность микроконтроллера — все функционирует, но код для отображения информации на дисплее не срабатывает. Я допускаю, что возможна ошибка в соединении пинов между платой и дисплеем, хотя, на мой взгляд, они подключены правильно. Также может быть, что контакт где-то отошел, но я старался сделать соединения максимально надежными. Поэтому сейчас я склоняюсь к мысли, что проблема может быть в коде. Приложена фотография структуры проекта и содержимого файла CMakeLists.txt.
  • 11 марта 2025 г. 18:25
Ответы на вопрос 2
Для работы с LCD-дисплеем 1602A с использованием ESP32 и языка C++ в среде ESP-IDF, вам необходимо сначала убедиться, что все соединения между ESP32 и LCD-дисплеем выполнены правильно. Обычно для дисплея 1602A используются следующие пины:

- RS (регистрация выбора) — выбранный пин микроконтроллера.
- RW (режим чтения/записи) — GND (принимаемый только запись).
- E (enable) — выбранный пин микроконтроллера.
- D0-D3 (4-битный режим) — пины, используемые для передачи данных.
- D4-D7 — не используются в 4-битном режиме.

Также вам нужно подключить питание VCC и GND.

Теперь, если соединения верны, вы можете использовать библиотеку LiquidCrystal (или аналогичную) для работы с LCD-дисплеем в вашем проекте. Вот пример кода, который можно использовать для вывода текста на дисплей:

1. Убедитесь, что библиотека для управления LCD-дисплеем добавлена в проект. Если вы используете ESP-IDF, вы можете найти подобные библиотеки, такие как `lcd`, `LiquidCrystal_I2C` и другие.

2. Вот пример кода для вывода текста на дисплей:

```cpp
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_system.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

// Задайте ваши пины
#define RS 21  // Pin for RS
#define E  22  // Pin for E
#define D4 23  // Pin D4
#define D5 19  // Pin D5
#define D6 18  // Pin D6
#define D7 5   // Pin D7

void setup() {
    // Инициализация GPIO
    gpio_set_direction(RS, GPIO_MODE_OUTPUT);
    gpio_set_direction(E, GPIO_MODE_OUTPUT);
    gpio_set_direction(D4, GPIO_MODE_OUTPUT);
    gpio_set_direction(D5, GPIO_MODE_OUTPUT);
    gpio_set_direction(D6, GPIO_MODE_OUTPUT);
    gpio_set_direction(D7, GPIO_MODE_OUTPUT);
    
    // Инициализация дисплея
    init_lcd();  // Ваша функция инициализации LCD
}

void init_lcd() {
    // Предположим, что вы работаете в 4-битном режиме
    // Установите необходимые команды инициализации
    send_command(0x28); // 4-битный режим, 2 строки
    send_command(0x0C); // Включить дисплей, курсор выключен
    send_command(0x01); // Очистить дисплей
    send_command(0x06); // Инкрементировать адрес, не перемещать
    send_command(0x80); // Установить адрес на первый символ первой строки
}

void send_command(uint8_t cmd) {
    gpio_set_level(RS, 0); // Установка в режим команды
    gpio_set_level(D4, (cmd >> 4) & 0x01);
    gpio_set_level(D5, (cmd >> 5) & 0x01);
    gpio_set_level(D6, (cmd >> 6) & 0x01);
    gpio_set_level(D7, (cmd >> 7) & 0x01);
    pulse_enable();

    gpio_set_level(D4, cmd & 0x01);
    gpio_set_level(D5, (cmd >> 1) & 0x01);
    gpio_set_level(D6, (cmd >> 2) & 0x01);
    gpio_set_level(D7, (cmd >> 3) & 0x01);
    pulse_enable();
}

void pulse_enable() {
    gpio_set_level(E, 1);
    vTaskDelay(1 / portTICK_PERIOD_MS);
    gpio_set_level(E, 0);
    vTaskDelay(1 / portTICK_PERIOD_MS);
}

extern "C" void app_main() {
    setup();
    send_string("Hello, World!"); // Ваша функция отправки строки
}

void send_string(const char* str) {
    gpio_set_level(RS, 1); // Установка в режим данных
    while (*str) {
        send_character(*str++);
    }
}

void send_character(char data) {
    gpio_set_level(D4, (data >> 4) & 0x01);
    gpio_set_level(D5, (data >> 5) & 0x01);
    gpio_set_level(D6, (data >> 6) &
Приведите, до кучи, и схему. Понятно, что подключено не через I2C адаптер, а напрямую. А что, например, с выводом контрастности (обычно - № 3)? Если индикатор с расширенным температурным диапазоном, то туда надо подавать напряжение примерно минус 2 В. 

У этого дисплея уровни 5-вольтовые уровни напряжения

По коду - чтение из дисплея не производтся, значит выдачи 5 В на ESP нет. А на запись данных - дисплей имеет "TTL уровни", хорошо сопрягающиеся с CMOS микросхемами при питаниии 3,3 В.
Похожие вопросы