Задать вопрос
@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); //!
}
  • Вопрос задан
  • 38 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@VT100
Embedded hardware & software.
Приведите, до кучи, и схему. Понятно, что подключено не через I2C адаптер, а напрямую. А что, например, с выводом контрастности (обычно - № 3)? Если индикатор с расширенным температурным диапазоном, то туда надо подавать напряжение примерно минус 2 В.

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

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

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

Похожие вопросы