简介
ILI9341是一款分辨率为240x320 分辨率的a- tft液晶显示单片SOC驱动,由720通道源驱动、320通道门驱动、172800字节GRAM (240RGBx320点位图形显示数据)和电源电路组成。
ILI9341支持并行8-/9-/16-/18位数据总线MCU接口,6-/16-/18位数据总线RGB接口和3 /4线串行外围接口SPI通讯。通过窗口地址函数可以在内部GRAM中指定运动图像的区域。指定的窗口区域可以有选择地更新,使移动的图片
系统框图
显示接口
ILI9341提供了四种单片机系统接口,
其中8080- /8080Ⅰ-Ⅱ系列并行接口和3 - 4线串行接口。
给定接口的选择由外部IM[3:0]引脚完成,如下所示:
IM3 | IM2 | IM1 | IM0 | MCU-Interface Mode | Register/Content | GRAM |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 8080-8bit–I | D[7:0] | D[7:0],WRX,RDX,CSX,D/CX |
0 | 0 | 0 | 1 | 8080-16bit–I | D[7:0] | D[15:0],WRX,RDX,CSX,D/CX |
0 | 0 | 1 | 0 | 8080-9bit–I | D[7:0] | D[8:0],WRX,RDX,CSX,D/CX |
0 | 0 | 1 | 1 | 8080-18bit–I | D[7:0] | D[17:0],WRX,RDX,CSX,D/CX |
IM3 | IM2 | IM1 | IM0 | MCU-Interface Mode | Pins in use |
---|---|---|---|---|---|
0 | 1 | 0 | 1 | 3-write 9bit serial interface I | SCL,SDA,CSX |
0 | 1 | 1 | 0 | 4-write 8bit serial interface I | SCL,SDA,CSX,D/C |
IM3 | IM2 | IM1 | IM0 | MCU-Interface Mode | Register/Content | GRAM |
---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 8080-16bit–II | D[8:1] | D[17:10],D[8:1],WRX,RDX,CSX,D/CX |
1 | 0 | 0 | 1 | 8080-8bit–II | D[17:10] | D[17:10],WRX,RDX,CSX,D/CX |
1 | 0 | 1 | 0 | 8080-18bit–II | D[8:1] | D[17:0],WRX,RDX,CSX,D/CX |
1 | 0 | 1 | 1 | 8080-9bit–II | D[17:10] | D[17:9],WRX,RDX,CSX,D/CX |
IM3 | IM2 | IM1 | IM0 | MCU-Interface Mode | Pins in use |
---|---|---|---|---|---|
1 | 1 | 0 | 1 | 3-write 9bit serial interface I | SCL,SDI,SDO,CSX |
1 | 1 | 1 | 0 | 4-write 8bit serial interface I | SCL,SDI,SDO,CSX,D/C |
注意:
在8080-Ⅰ/8080-Ⅱ串并联接口中,寄存器由D[17:0]数据引脚访问。
本次驱动ILI9341显示器使用的是 SPI通讯协议
ILI9341提供3线/ 9位和4线/8位双向串行接口,用于主机与ILI9341通信。
3线串行模式由芯片使能输入(CSX),串行时钟输入(SCL)和串行数据输入/输出(SDA或SDI/SDO)组成。
4线串行模式包括数据/命令选择输入(D/CX),芯片使能输入(CSX),串行时钟输入(SCL)和串行数据输入/输出(SDA或SDI/SDO)进行数据传输。
未使用的数据总线(D[17:0])必须连接到GND。串行时钟(SCL)仅用于与MCU的接口
写入数据/命令
接口的写模式是指主机向ILI9341写入命令或数据。3线/3 PIN 串行数据包包含一个数据/命令选择位(D/CX)和一个传输字节。如果D/CX位为“low”,则传输字节被解释为命令字节。如果D/CX位为“高”,则传输字节存储为显示数据RAM(内存写命令),或命令寄存器作为参数。
3线串行通讯
缩写 | 含义 |
---|---|
SCL | 时钟线 |
SDA | 数据线 |
CSX | 芯片输入使能 |
4线串行通讯
缩写 | 含义 |
---|---|
SCL | 时钟线 |
SDA | 数据线 |
D/C | 数据命令选择 |
CSX | 芯片输入使能 |
时序分析:
三线SPI通讯协议时序
四线SPI通讯协议时序
Rgb 接口
ILI9341有两种RGB接口,这两种接口可以通过RCM[1:0]位进行选择。当RCM[1:0]位设置为“10”时,DE模式被选择,使用VSYNC, HSYNC, DOTCLK, DE, D[17:0]引脚;当RCM[1:0]位设置为“11”,选择同步模式,使用垂直同步,高度同步,DOTCLK, D [17:0] pin。使用RGB接口时必须选择串行接口。
Rgb位数与编码表之间的关系
像素时钟(DOTCLK)一直不停地运行,用于输入垂直同步、HSYNC、DE和D[17:0]说明DOTCLK何时有上升边缘,垂直同步(VSYNC)用于告知何时收到了显示的新帧。这是低使能,它的状态是通过DOTCLK信号的上升边缘读取到显示模块。
水平同步(HSYNC)用于告知何时接收到帧的新行。这是低使能,它的状态是通过DOTCLK信号的上升边缘读取到显示模块。
在DE模式下,数据启用(DE)用来告诉何时有接收到的RGB信息应该在显示器上传输。这是一个高使能,它的状态通过DOTCLK信号的上升边缘读取到显示模块。D[17:0]是用来告诉在显示器上传输的图像的信息是什么(当DE= ’ 0 ‘(低),DOTCLK有上升边)。D[17:0]可以是’ 0 ‘(低)或’ 1 '(高)。这些行由DOTCLK信号的上升边读取。
在SYNC模式下,根据HSYNC信号的HFP/HBP设置和VSYNC的VFP/VBP设置,通过D[17:0]以像素单位输入的有效显示数据。在两种RGB接口模式下,输入显示数据先写入GRAM,然后根据GRAM的灰色数据输出相应的源电压。
指令表内容
1.一级指令说明:
Description of Level 1 Command
1. 空指令(00h)
此命令为空命令;对显示模块没有任何影响。但是它可以用来终止帧内存写或读在RAMWR(内存写)和RAMRD(内存读)命令中描述。
2. 软件复位(01h)
当软件复位命令被写入时,它会导致软件复位。它将命令和参数重置为它们的
S/W重置默认值。(参见每个命令描述中的默认表。)
注意:帧内存内容不受此命令影响;X =不在乎。
3.读取显示标识信息(04h)
这个读字节返回24位显示标识信息。
第1个参数是虚拟数据。
第2个参数(ID1 [7:0]): LCD模块的制造商ID。
第3个参数(ID2 [7:0]): LCD模块/驱动版本ID。
第4个参数(ID3 [7:0]): LCD模块/驱动ID。
4.读取显示状态(09h)
5. 读取显示功率模式(0Ah)
6.读取显示的内存寻址模式(0Bh)
7.读取显示像素格式(0Ch)
8. 读取显示图像格式(0Dh)
9.读取显示信号模式(0Eh)
10.读取显示自诊断结果(0Fh)
2.配置一些LCD的配置和模式:
1.进入睡眠模式(10h)
2.退出睡眠模式(11h)
3.部分模式开启(12h)
4. 正常显示模式ON(13h)
5.显示反转关闭(20h)
6.显示反转ON (21h)
7.Gamma 设定(26h)
8.显示 关闭(28 h)
9.显示开启(29h)
10. 列地址设定(2Ah)
11.页地址集设定
12. 内存写 (2Ch)
13.颜色设置(2dh)
14. 内存读(2Eh)
其他
…其余的值列表参照芯片手册。
代码部分
- 配置GPIO引脚模式
- 初始化控制引脚
- 创建SPI模拟时序
- 发送SPI数据
- 关联LCD 写数据、写命令
- 拓展16bit数据发送
- 初始化LCD
- 设置点
- 设置GUI
具体代码如下:文章来源:https://uudwc.com/A/0ko9
#include "ili9341.h"
#include "delay.h"
/****************************************************************************
* 名 称 :void Lcd_Init(void)
* 功 能 :初始化液晶屏幕
* 入口参数:void
* 出口参数:void
* 说 明 :液晶初始化_ILI9225_176X220
* 作 者 :koko
****************************************************************************/
void Lcd_Init(void)
{
LCD_SPI_GPIO_Init();
Lcd_Reset();
Lcd_WriteIndex(0x11); //休眠指令
LCD_WriteData(0x00); //0x0000 0000
Lcd_WriteIndex(0xCF); //电源控制
LCD_WriteData(0X00); //0x0000 0000
LCD_WriteData(0XC1); //0x1100 0001 开启节电操作
LCD_WriteData(0X30); //0x0011 0000 防静电保护
Lcd_WriteIndex(0xED); //开机顺序控制
LCD_WriteData(0X54); //0x0101 0100 软启动保持两帧 。内置帧缓存器是否可用 /启用内置帧缓存
LCD_WriteData(0X03); //
LCD_WriteData(0X12); //
LCD_WriteData(0X81); //使能DDVDH_ENH
Lcd_WriteIndex(0xE8); //驱动器定时控制A
LCD_WriteData(0X85); //NOW
LCD_WriteData(0X11); //门驱动不重叠定时控制 ,CR振荡器定时控制
LCD_WriteData(0X78); //不使用pre-charge定时控制
Lcd_WriteIndex(0xF6); //显示接口设定
LCD_WriteData(0X01); //记忆写控制
LCD_WriteData(0X30); //EPR设定 11 模式
LCD_WriteData(0X00); //选择显示数据的传输方式
Lcd_WriteIndex(0xCB); //电压控制设定
LCD_WriteData(0X39); //默认
LCD_WriteData(0X2C); //默认
LCD_WriteData(0X00); //默认
LCD_WriteData(0X34); //默认
LCD_WriteData(0X05); //DDVDH 设定为5.3
Lcd_WriteIndex(0xF7); //泵比控制
LCD_WriteData(0X20); //DDVDH=3xVCI
Lcd_WriteIndex(0xEA); //驱动器定时控制B
LCD_WriteData(0X00); //门驱动时序控制 0UNIT
LCD_WriteData(0X00); //默认
Lcd_WriteIndex(0xC0); //功率控制1
LCD_WriteData(0X20); //设置GVDD电平,该电平是VCOM电平和灰度电压电平的参考电平 设置禁止
Lcd_WriteIndex(0xC1); //功率控制2
LCD_WriteData(0X11); //设置在升压电路中使用的因子。 为工作电压选择最佳的升压系数。为了降低功耗,请设置较小的因数。
Lcd_WriteIndex(0xC5); //Vcom 控制1
LCD_WriteData(0X31); //默认值
LCD_WriteData(0X3C); //默认值
Lcd_WriteIndex(0xC7); //Vcom 控制2
LCD_WriteData(0XA9); //开机复位后,nVM等于“0”,VCOM偏移等于程序MTP值。当nVM设置为“1”时,VMF[6:0]的设置生效,VCOMH/VCOML可以调整。
Lcd_WriteIndex(0x3A); //像素格式集
LCD_WriteData(0X55); //16bit色
Lcd_WriteIndex(0x36); //存储器存取控制
#if USE_HORIZONTAL
LCD_WriteData(0xE8);//横屏参数
#else
LCD_WriteData(0x48);//竖屏参数
#endif
Lcd_WriteIndex(0xB1); //帧比率控制 /控制 /帧率控制 /帧速率控制
LCD_WriteData(0X00); //默认值
LCD_WriteData(0X18); //RTNA[4:0]用于在MCU接口上设置Normal模式1H(线)周期。 设定为禁止
Lcd_WriteIndex(0xB4); //显示反转控制
LCD_WriteData(0X00);
LCD_WriteData(0X00);
Lcd_WriteIndex(0xF2); //使能3G
LCD_WriteData(0X02); //不使用3G控制
Lcd_WriteIndex(0x26); //伽马设定
LCD_WriteData(0X01); //默认值
Lcd_WriteIndex(0xE0); //积极的伽马校正
LCD_WriteData(0X0F);
LCD_WriteData(0X17);
LCD_WriteData(0X14);
LCD_WriteData(0X09);
LCD_WriteData(0X0C);
LCD_WriteData(0X06);
LCD_WriteData(0X43);
LCD_WriteData(0X75);
LCD_WriteData(0X36);
LCD_WriteData(0X08);
LCD_WriteData(0X13);
LCD_WriteData(0X05);
LCD_WriteData(0X10);
LCD_WriteData(0X0B);
LCD_WriteData(0X08);
Lcd_WriteIndex(0xE1); //负面的伽马矫正
LCD_WriteData(0X00);
LCD_WriteData(0X1F);
LCD_WriteData(0X23);
LCD_WriteData(0X03);
LCD_WriteData(0X0E);
LCD_WriteData(0X04);
LCD_WriteData(0X39);
LCD_WriteData(0X25);
LCD_WriteData(0X4D);
LCD_WriteData(0X06);
LCD_WriteData(0X0D);
LCD_WriteData(0X0B);
LCD_WriteData(0X33);
LCD_WriteData(0X37);
LCD_WriteData(0X0F);
Lcd_WriteIndex(0x29); //开显示
}
/*************************************************
函数名:LCD_Set_XY
功能:设置lcd显示起始点
入口参数:xy坐标
返回值:无
*************************************************/
void Lcd_SetXY(u16 Xpos, u16 Ypos)
{
Lcd_WriteIndex(0x2A); //列地址设定
LCD_WriteData_16Bit(Xpos); //列地址内容
Lcd_WriteIndex(0x2B); //页地址设定
LCD_WriteData_16Bit(Ypos); //页地址内容
Lcd_WriteIndex(0x2c); //内存写入
}
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
//设置显示窗口
void Lcd_SetRegion(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
{
Lcd_WriteIndex(0x2A); //列地址设定
LCD_WriteData_16Bit(xStar); //x起点
LCD_WriteData_16Bit(xEnd); //x重点
Lcd_WriteIndex(0x2B); //页地址设定
LCD_WriteData_16Bit(yStar); //页的起点
LCD_WriteData_16Bit(yEnd); //页的终点
Lcd_WriteIndex(0x2c); //内存写入
}
/****************************************************************************
* 名 称 :void LCD_Color_Fill(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color)
* 功 能 :填充一个模块使用一个颜色
* 入口参数:u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color
* 出口参数:void
* 说 明 :void
* 作 者 :koko
****************************************************************************/
void LCD_Color_Fill(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd,u16 color)
{
int i,j;
Lcd_SetRegion(xStar,yStar,xEnd,yEnd);
for(i = 0; i<=(xEnd-xStar); i ++)
{
for(j =0 ;j<=(yEnd-yStar);j ++)
{
LCD_WriteData_16Bit(color);
}
}
}
/*************************************************
函数名:LCD_DrawPoint
功能:画一个点
入口参数:xy坐标和颜色数据
返回值:无
*************************************************/
void Gui_DrawPoint(u16 x,u16 y,u16 Data)
{
Lcd_SetXY(x,y); //描点
LCD_WriteData_16Bit(Data); //画点内容
}
/*************************************************
函数名:Lcd_Clear
功能:全屏清屏函数
入口参数:填充颜色COLOR
返回值:无
*************************************************/
void Lcd_Clear(u16 Color)
{
unsigned int i;
Lcd_SetRegion(0,0,X_MAX_PIXEL-1,Y_MAX_PIXEL-1);
LCD_CS_CLR;
LCD_RST_SET;
for(i=0;i<X_MAX_PIXEL*Y_MAX_PIXEL;i++)
{
LCD_WriteData_16Bit(Color);
}
LCD_CS_SET;
}
显示效果如下:
文章来源地址https://uudwc.com/A/0ko9