1. 准备工作
本次需要用到的器材有ESP32、高通字库、ST7789液晶屏。
前言
随着学习的深入,本次学习GUI交互功能之液晶屏移植。
一、液晶屏操作关键信息
(1)需要在指定位置显示,需要指定显示RAM操作地址。
操作步骤为:
首先,写入X方向起始地址跟结束地址;其次,写入Y方向的起始地址跟结束地址;最后,在指定区域内填充像素点(16bit)的值。
X方向:
XS[15:0]必须始终等于或小于XE [15:0]
当XS[15:0]或XE[15:0]大于如下所示的最大地址时,超出范围的数据将被忽略.
MV="0" :参数范围:0<Xs[15:0]<239(00efh)
MV="1" :参数范围:0Xs[15:0]<319(013FH)
Y方向:
YS[15:0]必须始终等于或小于YE [15:0]
当YS[15:0]或YE[15:0]大于如下所示的最大地址时,超出范围的数据将被忽略。
MV="0":参数范围:0<YS[15:0]<YE[15:0]<239
MV="1"参数范围:0<YS[15:0]<YE[15:0]<319
RAMWR:
二、使用步骤
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(uint16_t regval)
{
lcd_cmd(lcd_spi,regval);
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(uint16_t data)
{
lcd_data(lcd_spi,&data,1);
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
lcd_cmd(lcd_spi,(void*)lcddev.wramcmd);
}
void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
/* 指定X方向操作区域 */
LCD_WR_REG(lcddev.setxcmd); //2AH
LCD_WR_DATA(x1 >> 8);
LCD_WR_DATA(x1);
LCD_WR_DATA(x2 >> 8);
LCD_WR_DATA(x2);
/* 指定Y方向操作区域 */
LCD_WR_REG(lcddev.setycmd); //2BH
LCD_WR_DATA(y1 >> 8);
LCD_WR_DATA(y1);
LCD_WR_DATA(y2 >> 8);
LCD_WR_DATA(y2);
LCD_WriteRAM_Prepare();//2CH //开始写入GRAM
}
void Write_RAM_Dat(uint8_t *str,uint8_t len){
lcd_data(lcd_spi,&data,len);
}
我们每次操作的时候都需要指定操作区域,使用 void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)函数来指定区域。再调用void Write_RAM_Dat(uint8_t *str,uint8_t len),写入数据即可,注意根据RGB565可以一个像素点的值为16bit。
三、地址控制
地址计数器设置用于写入和读取的显示数据RAM的地址。
数据按像素顺序写入驱动器的RAM矩阵中。收集一个或两个像素的数据(RGB 6-6-6位),根据数据格式而定。一旦这个像素数据信息完成“写”access”在RAM上被激活。内存的位置由地址指针来寻址。地址范围为X=0 ~ X=239 (Efh)和Y=0 ~ Y=319 (13Fh)。这些范围之外的地址是不允许的。在写入RAM之前,必须定义一个将要写入的窗口。窗口是可编程通过命令中注册XS、YS表示起始地址,XE、YE表示结束地址。
例如,整个显示内容将被写入,窗口由以下值定义:
XS=0 (0h) YS=0 (0h), XE=239 (Efh), YE=319 (13Fh)。
在垂直寻址模式(MV=1)中,y地址在最后一个y地址之后的每个字节之后递增(Y=YE), Y绕到YS和X个增量来定位下一列。水平寻址方式(V=0), X-address在每个字节后递增,在最后一个X-address (X=XE)后,X绕到XS和Y个增量来寻址下一行。在每一个地址之后(X=XE和Y=YE)地址指针绕到地址(X=XS和Y=YS)。
为了灵活地处理各种各样的显示架构,命令“CASET, RASET和,定义标志MX和MY,它允许x地址和y地址的镜像。所有的组合flags是允许的。第8.12节显示了写入显示RAM的可用组合。当MX、MY和MV被改变时,数据将被重写到显示RAM中。
对于每个图像情况,列和行计数器的控件应用如下: