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厂商自带源码中。