Задать вопрос
@1536464773

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

У меня есть плата esp32-s3-devkic-1 и дисплей LCD 1602A ver 5.5. Хотел вывести простую фразу на первую строку дисплея, но у меня никак не выходит. Я посмотрел принцип передачи данных на дисплей (команды и символы), написал код, который на мой взгляд выглядит логичным, но он не работает. Я пишу код и прошиваю плату используя VScode через расширение esp-idf. Я проверял микроконтроллер на работоспособность и все работает, но код для вывода информации на дисплей не работает. Я допускаю, что , возможно, я не правильно соединил пины платы и дисплея, но должно быть верно. Я допускаю ,также, что это может где-то отходить контакт, но я тоже постарался сделать все максимально прочно, поэтому сейчас я склоняюсь к неправильности кода. В прикрепленной фотографии структура проекта и содержимое файла CMakeLists.txt .

67d07b740238b909031223.png

Код файла hello_world_main.cpp

#include "driver/gpio.h"
#include "esp_rom_sys.h"

#define RS GPIO_NUM_13
#define RW GPIO_NUM_14
#define E GPIO_NUM_15
#define D0 GPIO_NUM_1
#define D1 GPIO_NUM_2
#define D2 GPIO_NUM_3
#define D3 GPIO_NUM_4
#define D4 GPIO_NUM_5
#define D5 GPIO_NUM_6
#define D6 GPIO_NUM_7
#define D7 GPIO_NUM_12

void lcd_send_command(uint8_t command)
{

    gpio_set_level(RS, 0);
    gpio_set_level(RW, 0);

    gpio_set_level(D0, (command >> 7) & 0b00000001);
    gpio_set_level(D1, (command >> 6) & 0b00000001);
    gpio_set_level(D2, (command >> 5) & 0b00000001);
    gpio_set_level(D3, (command >> 4) & 0b00000001);
    gpio_set_level(D4, (command >> 3) & 0b00000001);
    gpio_set_level(D5, (command >> 2) & 0b00000001);
    gpio_set_level(D6, (command >> 1) & 0b00000001);
    gpio_set_level(D7, command & 0b00000001);

    gpio_set_level(E, 1);
    esp_rom_delay_us(1);
    gpio_set_level(E, 0);
    esp_rom_delay_us(37);
}

void lcd_send_symbol(uint8_t command)
{

    gpio_set_level(RS, 1);
    gpio_set_level(RW, 0);

    gpio_set_level(D0, (command >> 7) & 0b00000001);
    gpio_set_level(D1, (command >> 6) & 0b00000001);
    gpio_set_level(D2, (command >> 5) & 0b00000001);
    gpio_set_level(D3, (command >> 4) & 0b00000001);
    gpio_set_level(D4, (command >> 3) & 0b00000001);
    gpio_set_level(D5, (command >> 2) & 0b00000001);
    gpio_set_level(D6, (command >> 1) & 0b00000001);
    gpio_set_level(D7, command & 0b00000001);

    gpio_set_level(E, 1);
    esp_rom_delay_us(1);
    gpio_set_level(E, 0);
    esp_rom_delay_us(37);
}

void lcd_init_gpio()
{
    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = (1ULL << RS) | (1ULL << RW) | (1ULL << E) | (1ULL << D0) | (1ULL << D1) | (1ULL << D2) | (1ULL << D3) | (1ULL << D4) | (1ULL << D5) | (1ULL << D6) | (1ULL << D7);
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
    gpio_config(&io_conf);
}

extern "C" void app_main()
{

    lcd_init_gpio(); // инициализация дисплея
    esp_rom_delay_us(50000);

    lcd_send_command(0b00111000); // перевод в 8ми бит режим
    esp_rom_delay_us(37);

    lcd_send_command(0b00001100); // включение дисплея
    esp_rom_delay_us(37);

    lcd_send_command(0b00000001); // очистка дисплея
    esp_rom_delay_us(2000);

    lcd_send_command(0b00000110); // автоинкремент адреса, сдвиг курсора вправо
    esp_rom_delay_us(37);

    lcd_send_command(0b00000010); // возврат курсора в начало
    esp_rom_delay_us(37);

    lcd_send_symbol(0b01110100); // t
    lcd_send_symbol(0b01101000); // h
    lcd_send_symbol(0b01100101); // e
    lcd_send_symbol(0b00100000); // space
    lcd_send_symbol(0b01110111); // w
    lcd_send_symbol(0b01101111); // o
    lcd_send_symbol(0b01110010); // r
    lcd_send_symbol(0b01101100); // l
    lcd_send_symbol(0b01100100); // d
    lcd_send_symbol(0b00100000); // space
    lcd_send_symbol(0b00100001); //!
}
  • Вопрос задан
  • 235 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
  • Бруноям
    Разработчик на C++
    5 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
@VT100
Embedded hardware & software.
Приведите, до кучи, и схему. Понятно, что подключено не через I2C адаптер, а напрямую. А что, например, с выводом контрастности (обычно - № 3)? Если индикатор с расширенным температурным диапазоном, то туда надо подавать напряжение примерно минус 2 В.

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

По коду - чтение из дисплея не производтся, значит выдачи 5 В на ESP нет. А на запись данных - дисплей имеет "TTL уровни", хорошо сопрягающиеся с CMOS микросхемами при питаниии 3,3 В.
Ответ написан
Комментировать
@SanchYESS
Я бы для начала попробовал все задержки сделать типа 100 мс, мб провода длинные, фронты могут растягиваться длиннее самих таймингов (предполагая, что всё правильно подключено). Так можно хотя бы понять, проблема в таймингах или где-то ещё.

Если и медленно не заведётся, проверил бы подключение, всё ли идёт куда надо.

Ну и воткнул бы для теста светодиоды (осцил/лог. анализатор для зажиточных) на линии, проверить, что выход вообще есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Казань
от 75 000 до 120 000 ₽
Яндекс Москва
от 180 000 до 350 000 ₽
Альфа-Банк Москва
от 200 000 до 350 000 ₽