#include "Display_ST7701.h" spi_device_handle_t SPI_handle = NULL; esp_lcd_panel_handle_t panel_handle = NULL; void ST7701_WriteCommand(uint8_t cmd) { spi_transaction_t spi_tran = { .cmd = 0, .addr = cmd, .length = 0, .rxlength = 0, }; spi_device_transmit(SPI_handle, &spi_tran); } void ST7701_WriteData(uint8_t data) { spi_transaction_t spi_tran = { .cmd = 1, .addr = data, .length = 0, .rxlength = 0, }; spi_device_transmit(SPI_handle, &spi_tran); } void ST7701_CS_EN(){ Set_EXIO(EXIO_PIN3,Low); vTaskDelay(pdMS_TO_TICKS(10)); } void ST7701_CS_Dis(){ Set_EXIO(EXIO_PIN3,High); vTaskDelay(pdMS_TO_TICKS(10)); } void ST7701_Reset(){ Set_EXIO(EXIO_PIN1,Low); vTaskDelay(pdMS_TO_TICKS(10)); Set_EXIO(EXIO_PIN1,High); vTaskDelay(pdMS_TO_TICKS(50)); } void ST7701_Init() { spi_bus_config_t buscfg = { .mosi_io_num = LCD_MOSI_PIN, .miso_io_num = -1, .sclk_io_num = LCD_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 64, // ESP32 S3 max size is 64Kbytes }; spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_device_interface_config_t devcfg = { .command_bits = 1, .address_bits = 8, .mode = SPI_MODE0, .clock_speed_hz = 40000000, .spics_io_num = -1, .queue_size = 1, // Not using queues }; spi_bus_add_device(SPI2_HOST, &devcfg, &SPI_handle); ST7701_CS_EN(); ST7701_WriteCommand(0xFF); ST7701_WriteData(0x77); ST7701_WriteData(0x01); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x10); ST7701_WriteCommand(0xC0); ST7701_WriteData(0x3B);//Scan line ST7701_WriteData(0x00); ST7701_WriteCommand(0xC1); ST7701_WriteData(0x0B); //VBP ST7701_WriteData(0x02); ST7701_WriteCommand(0xC2); ST7701_WriteData(0x07); ST7701_WriteData(0x02); ST7701_WriteCommand(0xCC); ST7701_WriteData(0x10); ST7701_WriteCommand(0xCD);//RGB format ST7701_WriteData(0x08); ST7701_WriteCommand(0xB0); // IPS ST7701_WriteData(0x00); // 255 ST7701_WriteData(0x11); // 251 ST7701_WriteData(0x16); // 247 down ST7701_WriteData(0x0e); // 239 ST7701_WriteData(0x11); // 231 ST7701_WriteData(0x06); // 203 ST7701_WriteData(0x05); // 175 ST7701_WriteData(0x09); // 147 ST7701_WriteData(0x08); // 108 ST7701_WriteData(0x21); // 80 ST7701_WriteData(0x06); // 52 ST7701_WriteData(0x13); // 24 ST7701_WriteData(0x10); // 16 ST7701_WriteData(0x29); // 8 down ST7701_WriteData(0x31); // 4 ST7701_WriteData(0x18); // 0 ST7701_WriteCommand(0xB1);// IPS ST7701_WriteData(0x00);// 255 ST7701_WriteData(0x11);// 251 ST7701_WriteData(0x16);// 247 down ST7701_WriteData(0x0e);// 239 ST7701_WriteData(0x11);// 231 ST7701_WriteData(0x07);// 203 ST7701_WriteData(0x05);// 175 ST7701_WriteData(0x09);// 147 ST7701_WriteData(0x09);// 108 ST7701_WriteData(0x21);// 80 ST7701_WriteData(0x05);// 52 ST7701_WriteData(0x13);// 24 ST7701_WriteData(0x11);// 16 ST7701_WriteData(0x2a);// 8 down ST7701_WriteData(0x31);// 4 ST7701_WriteData(0x18);// 0 ST7701_WriteCommand(0xFF); ST7701_WriteData(0x77); ST7701_WriteData(0x01); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x11); ST7701_WriteCommand(0xB0); //VOP 3.5375+ *x 0.0125 ST7701_WriteData(0x6d); //5D ST7701_WriteCommand(0xB1); //VCOM amplitude setting ST7701_WriteData(0x37); // ST7701_WriteCommand(0xB2); //VGH Voltage setting ST7701_WriteData(0x81); //12V ST7701_WriteCommand(0xB3); ST7701_WriteData(0x80); ST7701_WriteCommand(0xB5); //VGL Voltage setting ST7701_WriteData(0x43); //-8.3V ST7701_WriteCommand(0xB7); ST7701_WriteData(0x85); ST7701_WriteCommand(0xB8); ST7701_WriteData(0x20); ST7701_WriteCommand(0xC1); ST7701_WriteData(0x78); ST7701_WriteCommand(0xC2); ST7701_WriteData(0x78); ST7701_WriteCommand(0xD0); ST7701_WriteData(0x88); ST7701_WriteCommand(0xE0); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x02); ST7701_WriteCommand(0xE1); ST7701_WriteData(0x03); ST7701_WriteData(0xA0); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x04); ST7701_WriteData(0xA0); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x20); ST7701_WriteData(0x20); ST7701_WriteCommand(0xE2); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE3); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x11); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE4); ST7701_WriteData(0x22); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE5); ST7701_WriteData(0x05); ST7701_WriteData(0xEC); ST7701_WriteData(0xA0); ST7701_WriteData(0xA0); ST7701_WriteData(0x07); ST7701_WriteData(0xEE); ST7701_WriteData(0xA0); ST7701_WriteData(0xA0); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE6); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x11); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE7); ST7701_WriteData(0x22); ST7701_WriteData(0x00); ST7701_WriteCommand(0xE8); ST7701_WriteData(0x06); ST7701_WriteData(0xED); ST7701_WriteData(0xA0); ST7701_WriteData(0xA0); ST7701_WriteData(0x08); ST7701_WriteData(0xEF); ST7701_WriteData(0xA0); ST7701_WriteData(0xA0); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteCommand(0xEB); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x40); ST7701_WriteData(0x40); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteCommand(0xED); ST7701_WriteData(0xFF); ST7701_WriteData(0xFF); ST7701_WriteData(0xFF); ST7701_WriteData(0xBA); ST7701_WriteData(0x0A); ST7701_WriteData(0xBF); ST7701_WriteData(0x45); ST7701_WriteData(0xFF); ST7701_WriteData(0xFF); ST7701_WriteData(0x54); ST7701_WriteData(0xFB); ST7701_WriteData(0xA0); ST7701_WriteData(0xAB); ST7701_WriteData(0xFF); ST7701_WriteData(0xFF); ST7701_WriteData(0xFF); ST7701_WriteCommand(0xEF); ST7701_WriteData(0x10); ST7701_WriteData(0x0D); ST7701_WriteData(0x04); ST7701_WriteData(0x08); ST7701_WriteData(0x3F); ST7701_WriteData(0x1F); ST7701_WriteCommand(0xFF); ST7701_WriteData(0x77); ST7701_WriteData(0x01); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x13); ST7701_WriteCommand(0xEF); ST7701_WriteData(0x08); ST7701_WriteCommand(0xFF); ST7701_WriteData(0x77); ST7701_WriteData(0x01); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteData(0x00); ST7701_WriteCommand(0x36); ST7701_WriteData(0x00); ST7701_WriteCommand(0x3A); ST7701_WriteData(0x66); ST7701_WriteCommand(0x11); vTaskDelay(pdMS_TO_TICKS(480)); ST7701_WriteCommand(0x20); // vTaskDelay(pdMS_TO_TICKS(120)); ST7701_WriteCommand(0x29); ST7701_CS_Dis(); // RGB esp_lcd_rgb_panel_config_t rgb_config = { .clk_src = LCD_CLK_SRC_DEFAULT, .timings = { .pclk_hz = ESP_PANEL_LCD_RGB_TIMING_FREQ_HZ, .h_res = ESP_PANEL_LCD_HEIGHT, .v_res = ESP_PANEL_LCD_WIDTH, .hsync_pulse_width = ESP_PANEL_LCD_RGB_TIMING_HPW, .hsync_back_porch = ESP_PANEL_LCD_RGB_TIMING_HBP, .hsync_front_porch = ESP_PANEL_LCD_RGB_TIMING_HFP, .vsync_pulse_width = ESP_PANEL_LCD_RGB_TIMING_VPW, .vsync_back_porch = ESP_PANEL_LCD_RGB_TIMING_VBP, .vsync_front_porch = ESP_PANEL_LCD_RGB_TIMING_VFP, .flags = { .hsync_idle_low = 0, /*!< The hsync signal is low in IDLE state */ .vsync_idle_low = 0, /*!< The vsync signal is low in IDLE state */ .de_idle_high = 0, /*!< The de signal is high in IDLE state */ .pclk_active_neg = false, .pclk_idle_high = 0, /*!< The PCLK stays at high level in IDLE phase */ }, }, .data_width = ESP_PANEL_LCD_RGB_DATA_WIDTH, .bits_per_pixel = ESP_PANEL_LCD_RGB_PIXEL_BITS, .num_fbs = ESP_PANEL_LCD_RGB_FRAME_BUF_NUM, .bounce_buffer_size_px = 10 * ESP_PANEL_LCD_HEIGHT, .psram_trans_align = 64, .hsync_gpio_num = ESP_PANEL_LCD_PIN_NUM_RGB_HSYNC, .vsync_gpio_num = ESP_PANEL_LCD_PIN_NUM_RGB_VSYNC, .de_gpio_num = ESP_PANEL_LCD_PIN_NUM_RGB_DE, .pclk_gpio_num = ESP_PANEL_LCD_PIN_NUM_RGB_PCLK, .disp_gpio_num = ESP_PANEL_LCD_PIN_NUM_RGB_DISP, .data_gpio_nums = { ESP_PANEL_LCD_PIN_NUM_RGB_DATA0, ESP_PANEL_LCD_PIN_NUM_RGB_DATA1, ESP_PANEL_LCD_PIN_NUM_RGB_DATA2, ESP_PANEL_LCD_PIN_NUM_RGB_DATA3, ESP_PANEL_LCD_PIN_NUM_RGB_DATA4, ESP_PANEL_LCD_PIN_NUM_RGB_DATA5, ESP_PANEL_LCD_PIN_NUM_RGB_DATA6, ESP_PANEL_LCD_PIN_NUM_RGB_DATA7, ESP_PANEL_LCD_PIN_NUM_RGB_DATA8, ESP_PANEL_LCD_PIN_NUM_RGB_DATA9, ESP_PANEL_LCD_PIN_NUM_RGB_DATA10, ESP_PANEL_LCD_PIN_NUM_RGB_DATA11, ESP_PANEL_LCD_PIN_NUM_RGB_DATA12, ESP_PANEL_LCD_PIN_NUM_RGB_DATA13, ESP_PANEL_LCD_PIN_NUM_RGB_DATA14, ESP_PANEL_LCD_PIN_NUM_RGB_DATA15, }, .flags = { .disp_active_low = 0, .refresh_on_demand = 0, .fb_in_psram = true, .double_fb = true, .no_fb = 0, .bb_invalidate_cache = 0, }, }; esp_lcd_new_rgb_panel(&rgb_config, &panel_handle); // esp_lcd_rgb_panel_event_callbacks_t cbs = { // .on_vsync = example_on_vsync_event, // }; // esp_lcd_rgb_panel_register_event_callbacks(panel_handle, &cbs, &disp_drv); esp_lcd_panel_reset(panel_handle); esp_lcd_panel_init(panel_handle); } bool example_on_vsync_event(esp_lcd_panel_handle_t panel, const esp_lcd_rgb_panel_event_data_t *event_data, void *user_data) { BaseType_t high_task_awoken = pdFALSE; return high_task_awoken == pdTRUE; } void LCD_Init() { ST7701_Reset(); ST7701_Init(); Touch_Init(); Backlight_Init(); } void LCD_addWindow(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend,uint8_t* color) { Xend = Xend + 1; // esp_lcd_panel_draw_bitmap: x_end End index on x-axis (x_end not included) Yend = Yend + 1; // esp_lcd_panel_draw_bitmap: y_end End index on y-axis (y_end not included) if (Xend >= ESP_PANEL_LCD_WIDTH) Xend = ESP_PANEL_LCD_WIDTH; if (Yend >= ESP_PANEL_LCD_HEIGHT) Yend = ESP_PANEL_LCD_HEIGHT; esp_lcd_panel_draw_bitmap(panel_handle, Xstart, Ystart, Xend, Yend, color); // x_end End index on x-axis (x_end not included) } // backlight uint8_t LCD_Backlight = 50; void Backlight_Init() { ledcAttach(LCD_Backlight_PIN, Frequency, Resolution); Set_Backlight(LCD_Backlight); //0~100 } void Set_Backlight(uint8_t Light) // { if(Light > Backlight_MAX || Light < 0) printf("Set Backlight parameters in the range of 0 to 100 \r\n"); else{ uint32_t Backlight = Light*10; if(Backlight == 1000) Backlight = 1024; ledcWrite(LCD_Backlight_PIN, Backlight); } }