液晶显示屏使用ST7789V SPI 4线接口 连接MCU
3线接口和4线接口:
第一种:3-line是指CSX(Chip selection signal)、DCX(Clock signal)、SDA(Serial input/output data),其中CSX也写着CS片选,DCX也写着SCL时钟信号;4-line在3-line的基础上多了WRX(data/ command flag),也叫着D/CX。这种情况下是半双工,数据只能往一个方向传输,例如SPI的屏只需要输出。
第二种:3-line是指CSX(Chip selection signal)、DCX(Clock signal)、SDA(Serial input data)、SDO(Serial output data),其中SDA也叫MISO,SDO也叫MOSI。4-line在此基础上多了WRX(data/ command flag)。这种情况下是全双工的传输方式。
第二种其实不能叫3-line和4-line,实际上是4-line和5-line了,所以很容易引起误解,猜测应该是把CSX脚忽略了这么叫的。明白了就行不纠结,以实际应用,根据需要来决定几line。
补充一下:因为3-line(上面的统一说法)没有WRX,所有要有1bit来说明是command还是data,经常就会有3-line 9bit,4-line 8bit的说法。
规格书上也有讲:
3行串行数据包包含一个控制位D/CX和一个传输字节。在4行串行接口中,数据包只包含传输字节,控制位D/CX由D/CX引脚传输。如果D/CX为"低",则传输字节被解释为命令字节。如果D/CX为"高",则传输字节作为显示的数据或配置的参数。
任何指令都可以以任何顺序发送给Driver。首先传高字节。当CSX为高时,将初始化串行接口。在此状态下,SCL时钟脉冲或SDA数据没有影响。CSX上的下降边可以启用串行接口,并指示数据传输的开始。

当CSX为"高"时,将忽略SCL时钟,同时串口被初始化。在CSX的下降沿,SCL可以是高的或低的。SDA在SCL的上升沿进行采样。D/CX表示该字节是命令(D/CX='0")还是参数/数据(D/CX='1")。当SCL的第一个上升沿(3线)或SCL的第8个上升沿(4线)时,对D/CX进行采样。如果D/CX字节的最后一位之后CSX保持低位,串口等待SCL的下一个上升沿处的下一个字节的D/CX位(3线)或D7字节(4线)。

如果发送1个或多个参数命令,并且在发送最后一个参数之前发生中断,如果随后发送新命令而不是重新发送中断的参数,则存储成功发送的参数,并无视中断发送时的参数。
如果发送2个或多个参数命令,并且在发送另一个命令之前另一个命令发生中断,那么成功发送的参数将被存储,另一个参数仍然是以前的值。
在传输命令、帧存储器数据或多个参数数据时,可以调用数据传输中的暂停。如果芯片选择线在整个帧存储器数据或多个参数数据完成后被释放,那么驱动程序将等待并从其暂停的点继续帧存储器数据或参数数据传输。如果芯片选择行在一个命令的整个字节完成后被释放,则当下次启用芯片选择行时,显示模块将接收该命令的参数或一个新命令,如下所示。
下面介绍数据传输模式:
该模块有三种颜色模式,用于将数据传输到显示内存,每像素12位颜色,每像素16位颜色和每像素18位颜色。对每个接口的数据格式进行了描述。数据可以通过两种方法下载到帧存储器中:
1.图像数据以连续的帧写入方式发送到帧存储器,每次填充帧存储器时,帧存储器指针被重置到起始点,并写入下一帧。
2.发送图像数据,在每个帧下载结束时,发送一个命令来停止帧写入。然后发送启动内存写命令,并写入一个新的帧。
LCM支持的三种颜色深度可提供不同的显示数据格式。
4k颜色,RGB444位输入
65k颜色,RGB565位输入
262k颜色,RGB666位输入
下面介绍ST7789V地址的控制方法
地址计数器设置用于写入和读取的显示数据RAM的地址。数据被按像素级地写入到驱动程序的RAM矩阵中。根据数据格式,收集一个或两个像素的数据(RGB6-6-6位)。一旦这个像素数据信息完成,RAM上的"写访问"就会被激活。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地址在每个字节之后递增,在最后一个X地址(X=XE)之后,X环绕到XS和Y增量以处理下一行地址。在每个最后一个地址(X=XE和Y=YE)之后,地址指针环绕到地址(X=XS和Y=YS)。
为了提高处理各种显示架构的灵活性,命令"CASET、RASET和MADCTL"定义了标志MX和MY,这允许X地址和y地址的翻转。允许使用所有的标志组合。
对于每个图像条件,列和行计数器的控件应用如下所示:
收到RAMWR/RD命令时,行指针和列指针复位(移动到开始位置)
收到Pixel R/W命令时,列指针加一,行不变
列指针到末尾时,行指针加一,列不变
行列指针都到末尾时,行列指针复位
MX/MY/MV控制显示扫描方向:
ST7789V包含了伽马校正功能,以显示液晶面板的262,244种颜色。伽玛校正采用3组寄存器进行,分别是梯度调整、对比度调整和正极性和负极性的微调寄存器,RGB可以单独调整。
然后就是基本命令了
初始化要用到的命令如下:
0x11 sleep mode 退出
0x36 Memory data access control 存储器数据访问控制
0x3A Interface pixel format 接口像素格式
0xB2 Porch Setting 入口设置
0xBB VCOM Setting 电压设置
0xC0 LCM Control 模块控制
0xC2 已启用VDV和VRH命令
0xC3 GVDD VRH Set VRH设置
0xC4 VDV Set VDV设置
0xC6 Frame Rate Control in Normal Mode 正常模式下的帧速率控制
0xD0 Power Control 电压控制
0xE0 Positive Voltage Gamma Control 正电压伽马控制
0xE1 Negative Voltage Gamma Control 负电压伽马控制
0x21 Display inversion on 颠倒显示开
0x2A Column Address Set 列地址设置
0x2B Row Address Set 行地址设置
0x29 Display on 打开显示
c
WriteComm(0x11);
Delay(120); //ms
WriteComm(0x36);
WriteData(0x00);
WriteComm(0x3A);
WriteData(0x05);
WriteComm(0xB2);
WriteData(0x0C);
WriteData(0x0C);
WriteData(0x00);
WriteData(0x33);
WriteData(0x33);
WriteComm(0xBB); //VCOM
WriteData(0x20); //1F
WriteComm(0xC0);
WriteData(0x2C);
WriteComm(0xC2);
WriteData(0x01);
WriteComm(0xC3); //GVDD
WriteData(0x0F); //4.3V
WriteComm(0xC4);
WriteData(0x20);
WriteComm(0xC6);
WriteData(0x0F); //Dot INV, 60Hz
WriteComm(0xD0);
WriteData(0xA4);
WriteData(0xA1);
WriteComm(0xE0);
WriteData(0xD0);
WriteData(0x0A);
WriteData(0x10);
WriteData(0x0A);
WriteData(0x0A);
WriteData(0x26);
WriteData(0x36);
WriteData(0x34);
WriteData(0x4D);
WriteData(0x18);
WriteData(0x13);
WriteData(0x14);
WriteData(0x2F);
WriteData(0x34);
WriteComm(0xE1);
WriteData(0xD0);
WriteData(0x0A);
WriteData(0x10);
WriteData(0x0A);
WriteData(0x09);
WriteData(0x26);
WriteData(0x36);
WriteData(0x53);
WriteData(0x4C);
WriteData(0x18);
WriteData(0x14);
WriteData(0x14);
WriteData(0x2F);
WriteData(0x34);
WriteComm(0x21);
WriteComm(0x2A); //Column Address Set
WriteData(0x00);
WriteData(0x00); //0
WriteData(0x00);
WriteData(0xEF); //239
WriteComm(0x2B); //Row Address Set
WriteData(0x00);
WriteData(0x00); //0
WriteData(0x00);
WriteData(0xEF); //239
WriteComm(0x29);
Delay(120); //ms