14.4 实验原理
14.4.1 液晶屏介绍
查看底板上集成的2.0寸串行彩色液晶屏规格书,屏幕采用ST7789的驱动芯片,接下来我们主要根据ST7789的芯片手册来了解其工作原理和驱动方法。
ST7735S为262K 真彩控制器/驱动器,芯片可以直接跟外部处理器连接,支持串行SPI通信和8/9/16/18位并行通信(本液晶屏集成ST7735S时没有留并行接口,所以只能使用串行通信),显示数据存储在片上240x320x18 RAM块中,详细参数请参考数据手册。

ST7789支持不同位宽的并行通信格式。

在控制器给屏幕刷屏时,根据MV、MX、MY的配置支持8种不同方向的刷屏模式。

支持大量功能指令,部分系统功能指令列表如下:

更多的内容这里就不一一介绍了,感兴趣的同学可以详细阅读ST7789芯片手册。
14.4.2 液晶屏硬件连接
STEP BaseBoard V4.0底板上的2.0寸串行彩色液晶屏模块电路,其电路图如下:

底板上的2.0寸串行彩色液晶屏电路和HDMI显示电路复用部分FPGA管脚,两者不能同时使用,当使用2.0寸串行彩色液晶屏时,DISP_SEL信号置高,驱动2.0寸串行彩色液晶屏使能同时点亮背光,DISP_2~ DISP_5分别对应RESET、D/C、SDA、SCK管脚,最后FPGA驱动2.0寸液晶屏完成屏显示控制即可。
14.4.3 液晶屏驱动设计
要驱动液晶屏需要先了解液晶屏的驱动流程,可以从液晶屏驱动芯片ST7735S的芯片手册上获取,也可以到网上找找有没有别人使用同类液晶屏的案例,或者向卖方问问有没有相关资料提供,这里我们找到了一个用C51单片机驱动的程序例程,例程仅供参考,需要根据例程中的配置到芯片手册中查找确认,不可以直接套用。 首先完成液晶屏初始化操作,51程序流程如下:
void Lcd_Init(void)
{
LCD_RES_Clr();
delay_ms(100);
LCD_RES_Set();
delay_ms(100);
LCD_BLK_Set();
delay_ms(100);
//************* Start Initial Sequence **********//
LCD_WR_REG(0x11); //Sleep out
delay_ms(120); //Delay 120ms
//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
else LCD_WR_DATA8(0xA0);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x32); //Vcom=1.35V
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x15); //GVDD=4.8V ��ɫ���
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20); //VDV, 0x20:0v
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F); //0x0F:60Hz
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x05);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x17);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x15);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x34);
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x08);
LCD_WR_DATA8(0x0E);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x09);
LCD_WR_DATA8(0x15);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x48);
LCD_WR_DATA8(0x17);
LCD_WR_DATA8(0x14);
LCD_WR_DATA8(0x15);
LCD_WR_DATA8(0x31);
LCD_WR_DATA8(0x34);
LCD_WR_REG(0x21);
LCD_WR_REG(0x29);
}
初始化过程中写的所有指令和数据存储,同时存储的还有指令或数据 标志,例如初始化第1条指令为8'h11,我们增加最高位1‘b0组成9位位宽数据。存储器部分指令和数据如下:
7'd0: init_data <= 9'h011 ;
7'd1: init_data <= 9'h036 ;
7'd2: init_data <= 9'h100 ;
7'd3 : init_data <= 9'h03a ;
7'd4 : init_data <= 9'h105 ;
FPGA驱动液晶屏的设计使用SPI总线,状态机完成,程序实现如下:
//mosi:SPI总线写数据信号
always@(posedge sys_clk_50MHz or negedge sys_rst_n)
if(!sys_rst_n)
mosi <= 1'b0;
else if(state == STATE0)
mosi <= 1'b0;
else if(state == STATE1 && cnt_delay == CNT_SCLK_MAX)
mosi <= data[7];
else if(state == STATE2 && sclk_flag)
case(cnt1)
1 : mosi <= data[6];
3 : mosi <= data[5];
5 : mosi <= data[4];
7 : mosi <= data[3];
9 : mosi <= data[2];
11: mosi <= data[1];
13: mosi <= data[0];
15: mosi <= 1'b0;
default: mosi <= mosi;
endcase
else
mosi <= mosi;