1.11. LCD

推屏测试接口:push_screen_test();可直接调用进行刷屏测试

1.11.1. LCD基本接口

1.11.1.1. lcd_driver_init

lcd初始化

原型:

void lcd_driver_init(void)
参数:

1.11.1.2. lcd_backlight_ctrl

控制lcd背光

原型:

int lcd_backlight_ctrl(u8 on)
参数:

on

true:打开背光;false:关闭背光

返回值

1.11.1.3. lcd_clear_screen

整屏刷新指定颜色

原型:

int lcd_clear_screen(u16 color)
参数:

color

RGB565颜色值

返回值

示例:

lcd_clear_screen(0xf800);

1.11.1.4. lcd_set_draw_area

设置刷屏区域

原型:

int lcd_set_draw_area(int xs, int xe, int ys, int ye)
参数:

xs

x起始坐标

xe

x结束坐标

ys

y起始坐标

ye

y结束坐标

返回值

示例:

lcd_set_draw_area(0, 120, 0, 40);

1.11.1.5. lcd_draw

lcd绘图

原型:

int lcd_draw(char *buf, u32 len, u8 wait)
参数:

buf

图像buffer

len

buffer长度

wait

0

返回值

示例:

lcd_draw(buf, len, 0);

1.11.1.6. 相关IO控制API

void lcd_reset_l();  复位引脚拉低
void lcd_reset_h();  复位引脚拉高
void lcd_cs_l();     片选引脚拉低
void lcd_cs_h();     片选引脚拉低
void lcd_rs_l();     rs(dc/A0)引脚拉低
void lcd_rs_h();     rs(dc/A0)引脚拉高
void lcd_bl_l();     背光引脚拉低
void lcd_bl_h();     背光引脚拉高

1.11.2. LCD相关宏配置

1.11.2.1. 驱动方式选择

LCD_PUSH_MODE:lcd推屏驱动选择(SPI、PAP),例如:

#define LCD_PUSH_MODE   PAP

#define LCD_PUSH_MODE   SPI

1.11.2.2. 屏幕驱动选择

#define TCFG_LCD_SPI_ST7789V_ENABLE         0
#define TCFG_LCD_PAP_SPI_ST7789V_ENABLE     0

以上二选一,分别对应spi和pap两种屏,置1打开

1.11.2.3. SPI硬件选择

#define TCFG_TFT_LCD_DEV_SPI_HW_NUM     1
#define LCD_SPI_INTERRUPT_ENABLE        1

TCFG_TFT_LCD_DEV_SPI_HW_NUM:选择spi索引,使用spi0、spi1…,默认spi1; LCD_SPI_INTERRUPT_ENABLE:spi中断使能,默认打开; TCFG_LCD_9BIT_SPI_ENABLE:是否使能芯片9bit spi模式:在lcd屏需要9bit spi 时序的情况下需要将该宏置1

1.11.3. 驱动引脚配置

1.11.3.1. 公共引脚

包括reset、rs、cs、bl引脚,这些引脚为推屏的公共引脚,默认如下图配置,可自行更改IO

#if (LCD_PUSH_MODE == SPI)
const static struct lcd_spi_platform_data lcd_spi_data = {
    .pin_reset      = IO_PORTC_02,//触摸屏 和 屏公用复位,先初始化触摸
    .pin_rs = IO_PORTD_00,
    .pin_cs = IO_PORTC_03,
    .pin_bl     = IO_PORTC_00,
    .spi_cfg        = HW_SPI1,
    .spi_pdata  = NULL,//&spi1_p_data,
};
#elif (LCD_PUSH_MODE == PAP)
const static struct lcd_spi_platform_data lcd_spi_data = {
    .pin_reset      = IO_PORTC_02,//触摸屏 和 屏公用复位,先初始化触摸
    .pin_rs = IO_PORTC_04,
    .pin_cs = IO_PORTC_03,
    .pin_bl     = IO_PORTC_00,
};
#endif

1.11.3.2. SPI引脚配置

#define TCFG_HW_SPI1_PORT_CLK   IO_PORTA_10  //时钟脚
#define TCFG_HW_SPI1_PORT_DO    IO_PORTA_09   //data out
#define TCFG_HW_SPI1_PORT_DI    NO_CONFIG_PORT   //data in
#define TCFG_HW_SPI1_BAUD       1000000L   //波特率
#define TCFG_HW_SPI1_MODE           SPI_MODE_BIDIR_1BIT  //传输模式
#define TCFG_HW_SPI1_ROLE           SPI_ROLE_MASTER   //主从机

1.11.3.3. PAP引脚配置

调用hw_pap_init(0)完成pap引脚初始化,pap除了reset、cs、dc、bl公共引脚外,额外需要d0-d7数据线,pap模块已固定这八个引脚,不能更改;d0-d7依次对应pc8~pc15

1.11.4. 屏幕驱动替换

参考文件:lcd_pap_st7789_240x240.c 可直接复制一份lcd_pap_st7789_240x240.c,新建一份c文件,改动其中部分内容,加入编译即可,改动部分具体如下:

第一步,根据屏幕分辨率设置一下宏,图中为240x240,LINE_BUFF_SIZE大小根据实际设置,为推屏缓存buffer大小;

#define LCD_WIDTH 240
#define LCD_HIGHT 240
#define LINE_BUFF_SIZE  (60 * LCD_WIDTH * 2)

第二步,更新LcdInit_code数组

static InitCode LcdInit_code[] = {
    {0X36, 1, {0X00}},
    {0X3A, 1, {0X05}},
    {0XB2, 5, {0X0C, 0X0C, 0X00, 0X33, 0X33}},
    {0XB7, 1, {0X35}},
    {0xBB, 1, {0x37}},
    {0xC0, 1, {0x2C}},
    {0xC2, 1, {0x01}},
    {0xC3, 1, {0x12}},
    {0xC4, 1, {0x20}},
    {0xC6, 1, {0x0F}},
    {0xd0, 2, {0xa4, 0xa1}},
    {0xE0, 14, {0xD0, 0x04, 0x0d, 0x11, 0x13, 0x2b, 0x3F, 0x54, 0x4c, 0x18, 0x0d, 0x0b, 0x1f, 0x23}},
    {0xE1, 14, {0xD0, 0x04, 0x0c, 0x11, 0x13, 0x2c, 0x3F, 0x44, 0x51, 0x2f, 0x1f, 0x1f, 0x20, 0x23}},
    {0X21, 0},
    {0x11, 0},                              // sleep out
    /* {REGFLAG_DELAY, 120}, */
    {0X29, 0},
    /* {REGFLAG_DELAY, 120}, */
};
InitCode结构体如下:
typedef struct {
   u8 cmd;         // 指令
   u8 cnt;         // 数据个数
   u8 dat[64];     // 数据
} InitCode;

屏幕初始化需要将该部分指令及数据发给lcd内部ic进行自检初始化,该初始化指令数据一般会在lcd厂商自带源码中。