EC600U_esp32_iap_uart/lcd/lcd_demo.c
2024-02-05 17:39:56 +08:00

404 lines
16 KiB
C

/*=================================================================
EDIT HISTORY FOR MODULE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
WHEN WHO WHAT, WHERE, WHY
------------ ------- -------------------------------------------------------------------------------
=================================================================*/
/*===========================================================================
* include files
===========================================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ql_api_osi.h"
#include "ql_log.h"
#include "ql_gpio.h"
#include "lcd_demo.h"
/*===========================================================================
* Macro Definition
===========================================================================*/
#define QL_LCDDEMO_LOG_LEVEL QL_LOG_LEVEL_INFO
#define QL_LCDDEMO_LOG(msg, ...) QL_LOG(QL_LCDDEMO_LOG_LEVEL, "ql_LCDDEMO", msg, ##__VA_ARGS__)
#define QL_LCDDEMO_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_LCDDEMO", msg, ##__VA_ARGS__)
#define BWSCREEN_TEST 0 //open test when set 1
/*===========================================================================
* Variate
===========================================================================*/
//uint16_t rotation_flg = 0; // for rotation test
#if !BWSCREEN_TEST
uint16_t Test_image1[30*50] = {};
uint16_t Test_image2[50*100] = {};
uint16_t Test_image3[100*200] = {};
#else
uint8_t bmp[]={
// 请
0x00,
0X20,0X22,0Xec,0X00,0X20,0X22,0Xaa,0Xaa,0Xaa,0Xbf,0Xaa,0Xaa,0Xeb,0Xa2,0X20,0X00,
// 插
0X10,0X10,0X10,0Xff,0X90,0X24,0X24,0Xa4,0X24,0Xfc,0X22,0X23,0X22,0Xb0,0X20,0X00,
// 入
0X00,0X00,0X00,0X00,0X00,0X01,0Xe2,0X1c,0Xe0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//'U'
0Xfc,0Xfc,0X00,0X00,0X00,0Xfc,0Xfc,0X00,
//'I'
0X00,0X00,0X04,0Xfc,0Xfc,0X04,0X00,0X00,
//'M'
0Xfc,0Xfc,0X38,0X70,0X38,0Xfc,0Xfc,0X00,
// 卡
0X40,0X40,0X40,0X40,0X40,0X40,0Xff,0X44,0X44,0X44,0X46,0X44,0X40,0X60,0X40,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
//请2
//0x00,
0X00,0X00,0X7f,0X20,0X10,0X00,0Xff,0X0a,0X0a,0X0a,0X4a,0X8a,0X7f,0X00,0X00,0X00,
//插2
0X02,0X42,0X81,0X7f,0X00,0Xff,0X49,0X48,0X40,0X7f,0X40,0X49,0X49,0Xff,0X01,0X00,
//入2
0X80,0X40,0X20,0X10,0X0c,0X03,0X00,0X00,0X00,0X03,0X0c,0X30,0X40,0Xc0,0X40,0X00,
//'U'2
0X07,0X0f,0X08,0X08,0X08,0X0f,0X07,0X00,
//'I'2
0X00,0X00,0X08,0X0f,0X0f,0X08,0X00,0X00,
//'M'2
0X0f,0X0f,0X00,0X00,0X00,0X0f,0X0f,0X00,
// 卡2
0X00,0X00,0X00,0X00,0X00,0X00,0Xff,0X00,0X02,0X04,0X0c,0X18,0X00,0X00,0X00,0X00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
#endif
/*===========================================================================
* Functions
===========================================================================*/
#if !BWSCREEN_TEST
void image_test_set(void)
{
uint16_t count = 0;
uint16_t image1_len = sizeof(Test_image1)/sizeof(Test_image1[0]);
uint16_t image2_len = sizeof(Test_image2)/sizeof(Test_image2[0]);
uint16_t image3_len = sizeof(Test_image3)/sizeof(Test_image3[0]);
for( count = 0; count < image1_len; count++ )
{
Test_image1[count] = LCD_BLACK;
}
for( count = 0; count < image2_len; count++ )
{
Test_image2[count] = LCD_YELLOW;
}
for( count = 0; count < image3_len; count++ )
{
Test_image3[count] = LCD_PURPLE;
}
}
#else
void ql_lcd_write_bmp(uint8_t *buffer)
{
uint8_t page, column;
for( page = 0; page < 8; page++ )
{
ql_spi_lcd_write_cmd(0xb0+page); // from page0
ql_spi_lcd_write_cmd(0x10); // from column0_high
ql_spi_lcd_write_cmd(0x00); // from column0_low
for( column = 0; column < 128; column++ )
{
ql_spi_lcd_write_data(*buffer++);
}
}
}
#endif
static void ql_lcd_demo_thread(void *param)
{
QL_LCDDEMO_LOG("lcd demo thread enter, param 0x%x", param);
ql_event_t event;
ql_lcd_info_t lcd_info = {0};
#if BWSCREEN_TEST
ql_lcd_bw_info_t bw_info = {0};
#endif
//if you don't want clean screen in the initialization,you can use this API
//ql_lcd_config_t config =
//{
// 0, //0--not rotating ,1--Rotate 90 degrees
// 0, //width of display
// QL_LCD_RGB565, //LCD format
// false, //false -- clean screen ,true -- keep screen
// QL_LCD_SPI_LINE_4, //busmode
// 0, // use default frequence
//};
//config.clean_screen = true;
//ql_lcd_set_config(&config);
// befor/after lcd_init all OK!!!
// 1. set the first two parameters when customer's LCD start pixel isn't (0,0)
// 2. set the last two parameters when customer's LCD driver width&height is inconsistent with QL_driver
// (less/greater than QL_driver, is positive/negative value)
//ql_lcd_set_display_offset(2, 1, 10, 20);
//before lcd_init set this API!!!
//if busmode isn't SPI_LINE_4, set other busmode by this API.
//ql_lcd_set_busmode(QL_LCD_SPI_LINE_3);
#if !BWSCREEN_TEST
if( ql_lcd_init() != QL_LCD_SUCCESS )
#else
bw_info.index = QL_LCD_BW_ST7567A;
if( ql_lcd_init_bwscreen(bw_info) != QL_LCD_SUCCESS )
#endif
//if( ql_lcd_init_ext(LCD_BLACK, false) != QL_LCD_SUCCESS )
{
QL_LCDDEMO_LOG("LCD init failed");
ql_rtos_task_delete(NULL);
}
// befor/after lcd_init all OK!!!
//ql_lcd_set_display_offset(0, 0, -80, 80);
ql_lcd_get_info(&lcd_info);
QL_LCDDEMO_LOG("LCD ID[0x%x] w[%d] h[%d] bus[%d] freq[%d]", lcd_info.drv_id, lcd_info.width, lcd_info.height, lcd_info.bus_mode, lcd_info.freq);
ql_lcd_config_t get_config = {0};
ql_lcd_get_config(&get_config);
QL_LCDDEMO_LOG("LCD get_config lcdrotation[%d] widthoriginal[%d] lcdcolorformat[%d] clean_screen[%d] bus[%d] freq[%d]", get_config.lcdrotation, get_config.widthoriginal, get_config.lcdcolorformat, get_config.clean_screen, get_config.bus_mode, get_config.freq);
#if !BWSCREEN_TEST
image_test_set();
/* set backlight brightness, from level 1 to level 5 */
ql_lcd_set_level_brightness(1, 0);
ql_lcd_set_level_brightness(2, 7);
ql_lcd_set_level_brightness(3, 15);
ql_lcd_set_level_brightness(4, 31);
ql_lcd_set_level_brightness(5, 63);
//ql_lcd_set_brightness(5); //if ql_lcd_init_ext's second argument is false, need to set ql_lcd_set_brightness.
#endif
while(1)
{
ql_event_wait(&event, 1);
#if !BWSCREEN_TEST
#if 0 // for rotation test
if( rotation_flg == 0)
{
ql_lcd_clear_screen(LCD_RED);
ql_rtos_task_sleep_s(5);
ql_lcd_set_display_offset(0, 0, 0, 0);
ql_spi_lcd_write_cmd(0x36);
ql_spi_lcd_write_data(0x00);
ql_lcd_clear_screen(LCD_GREEN);
ql_rtos_task_sleep_s(5);
rotation_flg = 1;
}
else
{
ql_lcd_clear_screen(LCD_YELLOW);
ql_rtos_task_sleep_s(5);
ql_lcd_set_display_offset(0, 0, -80, 80);
ql_spi_lcd_write_cmd(0x36);
ql_spi_lcd_write_data(0xC0);
ql_lcd_clear_screen(LCD_BLUE);
ql_rtos_task_sleep_s(5);
rotation_flg = 0;
}
/* block display BLACK */
ql_lcd_write(Test_image1, 20, 20, 50-1, 70-1);
ql_rtos_task_sleep_s(5);
#else
/* display on */
ql_lcd_display_on();
QL_LCDDEMO_LOG("LCD display on");
ql_rtos_task_sleep_s(1);
/* full screen RED */
ql_lcd_clear_screen(LCD_RED);
ql_rtos_task_sleep_s(5);
/* block display BLACK */
ql_lcd_write(Test_image1, 20, 20, 50-1, 70-1);
ql_rtos_task_sleep_s(5);
/* full screen GREEN */
ql_lcd_clear_screen(LCD_GREEN);
ql_rtos_task_sleep_s(5);
/* block display YELLOW */
ql_lcd_write(Test_image2, 50, 50, 100-1, 150-1);
ql_rtos_task_sleep_s(5);
/* LCD enter sleep*/
/* if the lcd has been initialized, the function must be called before enter sleep*/
ql_lcd_enter_sleep(true);
QL_LCDDEMO_LOG("LCD enter sleep");
ql_rtos_task_sleep_s(10);
/* LCD exit sleep*/
ql_lcd_enter_sleep(false);
QL_LCDDEMO_LOG("LCD exit sleep");
/* full screen BLUE */
ql_lcd_clear_screen(LCD_BLUE);
ql_rtos_task_sleep_s(5);
/* block display PURPLE */
ql_lcd_write(Test_image3, 100, 100, 200-1, 300-1);
ql_rtos_task_sleep_s(5);
/* rotation 90 display */
ql_spi_lcd_write_cmd(0x36);
ql_spi_lcd_write_data(0x60);
ql_lcd_write(Test_image1, 70, 100, 100-1, 150-1);
ql_rtos_task_sleep_s(3);
/* normal display */
ql_spi_lcd_write_cmd(0x36);
ql_spi_lcd_write_data(0x00);
ql_lcd_write(Test_image2, 120, 150, 170-1, 250-1);
ql_rtos_task_sleep_s(3);
/* full screen WHITE */
ql_lcd_clear_screen(LCD_WHITE);
/* brightness adjust */
ql_lcd_set_brightness(0);
QL_LCDDEMO_LOG("LCD backlight 0");
ql_rtos_task_sleep_s(3);
ql_lcd_set_brightness(1);
QL_LCDDEMO_LOG("LCD backlight 1");
ql_rtos_task_sleep_s(3);
ql_lcd_set_brightness(2);
QL_LCDDEMO_LOG("LCD backlight 2");
ql_rtos_task_sleep_s(3);
ql_lcd_set_brightness(3);
QL_LCDDEMO_LOG("LCD backlight 3");
ql_rtos_task_sleep_s(3);
ql_lcd_set_brightness(4);
QL_LCDDEMO_LOG("LCD backlight 4");
ql_rtos_task_sleep_s(3);
ql_lcd_set_brightness(5);
QL_LCDDEMO_LOG("LCD backlight 5");
ql_rtos_task_sleep_s(3);
/* display off */
ql_lcd_display_off();
QL_LCDDEMO_LOG("LCD display off");
ql_rtos_task_sleep_s(1);
#endif
#else
ql_lcd_write_bmp(bmp);
ql_rtos_task_sleep_s(10);
#endif
}
ql_rtos_task_delete(NULL);
}
void ql_lcd_app_init(void)
{
QlOSStatus err = QL_OSI_SUCCESS;
ql_task_t lcd_task = NULL;
err = ql_rtos_task_create(&lcd_task, 5*1024, APP_PRIORITY_NORMAL, "ql_lcddemo", ql_lcd_demo_thread, NULL, 1);
if( err != QL_OSI_SUCCESS )
{
QL_LCDDEMO_LOG("lcd demo task created failed");
}
}