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