Description
When my device is turned on for the first time after being turned off for a long time, the screen shifts horizontally.
What MCU/Processor/Board and compiler are you using?
Waveshare ESP32-S3-Touch-LCD-2.1 480x480.
ESP IDF v5.2.1 on VS Code.
LVGL 9.3.
The LCD has an ST7701 driver. I used the ST7701 initialize commands shared by the Waveshare company.
LCD: ESP32-S3-Touch-LCD-2.1 | WaveShare Documentation Platform
As seen in the photo, when turned on for the first time after a long break, the screen shifts horizontally each time.
When I turn the power off and on again, it fixes itself as shown in the photo.
void lvgl_flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map)
{
esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) lv_display_get_user_data(display);
int offsetx1 = area->x1;
int offsetx2 = area->x2;
int offsety1 = area->y1;
int offsety2 = area->y2;
// pass the draw buffer to the driver
esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, px_map);
lv_disp_flush_ready(display);
}
void LVGL_Init(void)
{
ESP_LOGI(LVGL_TAG, "Initialize LVGL library");
ESP_LOGI(LVGL_TAG, "LVGL Version: %d.%d.%d", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);
lv_init();
disp = lv_display_create(EXAMPLE_LCD_H_RES, EXAMPLE_LCD_V_RES);
ESP_LOGI(LVGL_TAG, "Use frame buffers as LVGL draw buffers");
ESP_ERROR_CHECK(esp_lcd_rgb_panel_get_frame_buffer(panel_handle, 2, &buf1, &buf2));
// initialize LVGL draw buffers
lv_display_set_buffers(disp, buf1, buf2, (EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES) * sizeof(lv_color_t), LV_DISPLAY_RENDER_MODE_DIRECT);
lv_display_set_flush_cb(disp, example_lvgl_flush_cb);
lv_display_set_user_data(disp, panel_handle);
ESP_LOGI(LVGL_TAG, "Install LVGL tick timer");
const esp_timer_create_args_t lvgl_tick_timer_args = {
.callback = &example_increase_lvgl_tick,
.name = "lvgl_tick"
};
ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000));
}
void app_main(void)
{
setenv("TZ", "<+03>-3", 1);
tzset();
Wireless_Init();
MQTT_init();
Driver_Init();
LCD_Init();
Touch_Init();
LVGL_Init();
ui_init();
while (1)
{
// raise the task priority of LVGL and/or reduce the handler period can improve the performance
vTaskDelay(pdMS_TO_TICKS(10));
// The task running lv_timer_handler should have lower priority than that running `lv_tick_inc`
lv_timer_handler();
}
}
void LCD_Init(void)
{
/********************* LCD *********************/
ST7701S_reset();
ST7701S_CS_EN();
vTaskDelay(pdMS_TO_TICKS(100));
ST7701S_handle st7701s = ST7701S_newObject(LCD_MOSI, LCD_SCLK, LCD_CS, SPI2_HOST, SPI_METHOD);
ST7701S_screen_init(st7701s, 1);
/********************* RGB LCD panel driver *********************/
ESP_LOGI(LCD_TAG, "Install RGB LCD panel driver");
esp_lcd_rgb_panel_config_t panel_config = {
.data_width = 16, // RGB565 in parallel mode, thus 16bit in width
.psram_trans_align = 64,
.num_fbs = EXAMPLE_LCD_NUM_FB,
.clk_src = LCD_CLK_SRC_DEFAULT,
.disp_gpio_num = EXAMPLE_PIN_NUM_DISP_EN,
.pclk_gpio_num = EXAMPLE_PIN_NUM_PCLK,
.vsync_gpio_num = EXAMPLE_PIN_NUM_VSYNC,
.hsync_gpio_num = EXAMPLE_PIN_NUM_HSYNC,
.de_gpio_num = EXAMPLE_PIN_NUM_DE,
.data_gpio_nums = {
EXAMPLE_PIN_NUM_DATA0,
EXAMPLE_PIN_NUM_DATA1,
EXAMPLE_PIN_NUM_DATA2,
EXAMPLE_PIN_NUM_DATA3,
EXAMPLE_PIN_NUM_DATA4,
EXAMPLE_PIN_NUM_DATA5,
EXAMPLE_PIN_NUM_DATA6,
EXAMPLE_PIN_NUM_DATA7,
EXAMPLE_PIN_NUM_DATA8,
EXAMPLE_PIN_NUM_DATA9,
EXAMPLE_PIN_NUM_DATA10,
EXAMPLE_PIN_NUM_DATA11,
EXAMPLE_PIN_NUM_DATA12,
EXAMPLE_PIN_NUM_DATA13,
EXAMPLE_PIN_NUM_DATA14,
EXAMPLE_PIN_NUM_DATA15,
},
.timings = {
.pclk_hz = EXAMPLE_LCD_PIXEL_CLOCK_HZ,
.h_res = EXAMPLE_LCD_H_RES,
.v_res = EXAMPLE_LCD_V_RES,
.hsync_back_porch = 10,
.hsync_front_porch = 50,
.hsync_pulse_width = 8,
.vsync_back_porch = 8,
.vsync_front_porch = 8,
.vsync_pulse_width = 3,
.flags.pclk_active_neg = false,
},
.flags.fb_in_psram = true, // allocate frame buffer in PSRAM
};
ESP_ERROR_CHECK(esp_lcd_new_rgb_panel(&panel_config, &panel_handle));
ESP_LOGI(LCD_TAG, "Register event callbacks");
esp_lcd_rgb_panel_event_callbacks_t cbs = {
.on_vsync = example_on_vsync_event,
};
ESP_ERROR_CHECK(esp_lcd_rgb_panel_register_event_callbacks(panel_handle, &cbs, &disp));
ESP_LOGI(LCD_TAG, "Initialize RGB LCD panel");
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));
ST7701S_CS_Dis();
Backlight_Init();
}
void ST7701S_screen_init(ST7701S_handle St7701S_handle, unsigned char type)
{
if (type == 1){
// 2.1inch
SPI_WriteComm(0xFF);
SPI_WriteData(0x77);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x10);
SPI_WriteComm(0xC0);
SPI_WriteData(0x3B);//Scan line
SPI_WriteData(0x00);
SPI_WriteComm(0xC1);
SPI_WriteData(0x0B); //VBP
SPI_WriteData(0x02);
SPI_WriteComm(0xC2);
SPI_WriteData(0x07);
SPI_WriteData(0x02);
SPI_WriteComm(0xCC);
SPI_WriteData(0x10);
SPI_WriteComm(0xCD);//RGB format
SPI_WriteData(0x08);
SPI_WriteComm(0xB0); // IPS
SPI_WriteData(0x00); // 255
SPI_WriteData(0x11); // 251
SPI_WriteData(0x16); // 247 down
SPI_WriteData(0x0e); // 239
SPI_WriteData(0x11); // 231
SPI_WriteData(0x06); // 203
SPI_WriteData(0x05); // 175
SPI_WriteData(0x09); // 147
SPI_WriteData(0x08); // 108
SPI_WriteData(0x21); // 80
SPI_WriteData(0x06); // 52
SPI_WriteData(0x13); // 24
SPI_WriteData(0x10); // 16
SPI_WriteData(0x29); // 8 down
SPI_WriteData(0x31); // 4
SPI_WriteData(0x18); // 0
SPI_WriteComm(0xB1);// IPS
SPI_WriteData(0x00);// 255
SPI_WriteData(0x11);// 251
SPI_WriteData(0x16);// 247 down
SPI_WriteData(0x0e);// 239
SPI_WriteData(0x11);// 231
SPI_WriteData(0x07);// 203
SPI_WriteData(0x05);// 175
SPI_WriteData(0x09);// 147
SPI_WriteData(0x09);// 108
SPI_WriteData(0x21);// 80
SPI_WriteData(0x05);// 52
SPI_WriteData(0x13);// 24
SPI_WriteData(0x11);// 16
SPI_WriteData(0x2a);// 8 down
SPI_WriteData(0x31);// 4
SPI_WriteData(0x18);// 0
SPI_WriteComm(0xFF);
SPI_WriteData(0x77);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x11);
SPI_WriteComm(0xB0); //VOP 3.5375+ *x 0.0125
SPI_WriteData(0x6d); //5D
SPI_WriteComm(0xB1); //VCOM amplitude setting
SPI_WriteData(0x37); //
SPI_WriteComm(0xB2); //VGH Voltage setting
SPI_WriteData(0x81); //12V
SPI_WriteComm(0xB3);
SPI_WriteData(0x80);
SPI_WriteComm(0xB5); //VGL Voltage setting
SPI_WriteData(0x43); //-8.3V
SPI_WriteComm(0xB7);
SPI_WriteData(0x85);
SPI_WriteComm(0xB8);
SPI_WriteData(0x20);
SPI_WriteComm(0xC1);
SPI_WriteData(0x78);
SPI_WriteComm(0xC2);
SPI_WriteData(0x78);
SPI_WriteComm(0xD0);
SPI_WriteData(0x88);
SPI_WriteComm(0xE0);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x02);
SPI_WriteComm(0xE1);
SPI_WriteData(0x03);
SPI_WriteData(0xA0);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x04);
SPI_WriteData(0xA0);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x20);
SPI_WriteData(0x20);
SPI_WriteComm(0xE2);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteComm(0xE3);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x11);
SPI_WriteData(0x00);
SPI_WriteComm(0xE4);
SPI_WriteData(0x22);
SPI_WriteData(0x00);
SPI_WriteComm(0xE5);
SPI_WriteData(0x05);
SPI_WriteData(0xEC);
SPI_WriteData(0xA0);
SPI_WriteData(0xA0);
SPI_WriteData(0x07);
SPI_WriteData(0xEE);
SPI_WriteData(0xA0);
SPI_WriteData(0xA0);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteComm(0xE6);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x11);
SPI_WriteData(0x00);
SPI_WriteComm(0xE7);
SPI_WriteData(0x22);
SPI_WriteData(0x00);
SPI_WriteComm(0xE8);
SPI_WriteData(0x06);
SPI_WriteData(0xED);
SPI_WriteData(0xA0);
SPI_WriteData(0xA0);
SPI_WriteData(0x08);
SPI_WriteData(0xEF);
SPI_WriteData(0xA0);
SPI_WriteData(0xA0);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteComm(0xEB);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x40);
SPI_WriteData(0x40);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteComm(0xED);
SPI_WriteData(0xFF);
SPI_WriteData(0xFF);
SPI_WriteData(0xFF);
SPI_WriteData(0xBA);
SPI_WriteData(0x0A);
SPI_WriteData(0xBF);
SPI_WriteData(0x45);
SPI_WriteData(0xFF);
SPI_WriteData(0xFF);
SPI_WriteData(0x54);
SPI_WriteData(0xFB);
SPI_WriteData(0xA0);
SPI_WriteData(0xAB);
SPI_WriteData(0xFF);
SPI_WriteData(0xFF);
SPI_WriteData(0xFF);
SPI_WriteComm(0xEF);
SPI_WriteData(0x10);
SPI_WriteData(0x0D);
SPI_WriteData(0x04);
SPI_WriteData(0x08);
SPI_WriteData(0x3F);
SPI_WriteData(0x1F);
SPI_WriteComm(0xFF);
SPI_WriteData(0x77);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x13);
SPI_WriteComm(0xEF);
SPI_WriteData(0x08);
SPI_WriteComm(0xFF);
SPI_WriteData(0x77);
SPI_WriteData(0x01);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteData(0x00);
SPI_WriteComm(0x36);
SPI_WriteData(0x00);
SPI_WriteComm(0x3A);
SPI_WriteData(0x66);
SPI_WriteComm(0x11);
Delay(480);
SPI_WriteComm(0x20); //
Delay (120);
SPI_WriteComm(0x29);
}
}

