【STM32】SPI通讯控制ILI9341显示屏

这篇具有很好参考价值的文章主要介绍了【STM32】SPI通讯控制ILI9341显示屏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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,stm32,单片机,arm

显示接口

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,stm32,单片机,arm
本次驱动ILI9341显示器使用的是 SPI通讯协议
ili9341,stm32,单片机,arm
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 芯片输入使能

ili9341,stm32,单片机,arm
4线串行通讯

缩写 含义
SCL 时钟线
SDA 数据线
D/C 数据命令选择
CSX 芯片输入使能

ili9341,stm32,单片机,arm
时序分析:
三线SPI通讯协议时序
ili9341,stm32,单片机,arm
四线SPI通讯协议时序
ili9341,stm32,单片机,arm

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接口时必须选择串行接口。
ili9341,stm32,单片机,arm
Rgb位数与编码表之间的关系
ili9341,stm32,单片机,arm
像素时钟(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(内存读)命令中描述。

ili9341,stm32,单片机,arm

2. 软件复位(01h)

当软件复位命令被写入时,它会导致软件复位。它将命令和参数重置为它们的
S/W重置默认值。(参见每个命令描述中的默认表。)
注意:帧内存内容不受此命令影响;X =不在乎。
ili9341,stm32,单片机,arm

3.读取显示标识信息(04h)

这个读字节返回24位显示标识信息。
第1个参数是虚拟数据。
第2个参数(ID1 [7:0]): LCD模块的制造商ID。
第3个参数(ID2 [7:0]): LCD模块/驱动版本ID。
第4个参数(ID3 [7:0]): LCD模块/驱动ID。
ili9341,stm32,单片机,arm

4.读取显示状态(09h)ili9341,stm32,单片机,armili9341,stm32,单片机,arm

ili9341,stm32,单片机,arm
ili9341,stm32,单片机,arm

5. 读取显示功率模式(0Ah)

ili9341,stm32,单片机,arm

6.读取显示的内存寻址模式(0Bh)

ili9341,stm32,单片机,arm

7.读取显示像素格式(0Ch)

ili9341,stm32,单片机,arm

8. 读取显示图像格式(0Dh)

ili9341,stm32,单片机,arm

9.读取显示信号模式(0Eh)

ili9341,stm32,单片机,arm

10.读取显示自诊断结果(0Fh)

ili9341,stm32,单片机,arm

2.配置一些LCD的配置和模式:

1.进入睡眠模式(10h)

ili9341,stm32,单片机,arm

2.退出睡眠模式(11h)

ili9341,stm32,单片机,arm

3.部分模式开启(12h)

ili9341,stm32,单片机,arm

4. 正常显示模式ON(13h)

ili9341,stm32,单片机,arm

5.显示反转关闭(20h)

ili9341,stm32,单片机,arm

6.显示反转ON (21h)

ili9341,stm32,单片机,arm

7.Gamma 设定(26h)

ili9341,stm32,单片机,arm

8.显示 关闭(28 h)ili9341,stm32,单片机,arm
9.显示开启(29h)

ili9341,stm32,单片机,arm

10. 列地址设定(2Ah)

ili9341,stm32,单片机,arm

11.页地址集设定

ili9341,stm32,单片机,arm

12. 内存写 (2Ch)

ili9341,stm32,单片机,arm

13.颜色设置(2dh)

ili9341,stm32,单片机,arm

14. 内存读(2Eh)

ili9341,stm32,单片机,arm

其他

…其余的值列表参照芯片手册。

代码部分

  1. 配置GPIO引脚模式
  2. 初始化控制引脚
  3. 创建SPI模拟时序
  4. 发送SPI数据
  5. 关联LCD 写数据、写命令
  6. 拓展16bit数据发送
  7. 初始化LCD
  8. 设置点
  9. 设置GUI

具体代码如下:

#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;
}

显示效果如下:
ili9341,stm32,单片机,arm文章来源地址https://www.toymoban.com/news/detail-811097.html

到了这里,关于【STM32】SPI通讯控制ILI9341显示屏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32之LCD液晶屏(ILI9341)显示图片

    本文章基于STM32F103VET6,参考野火的驱动程序,用LCD液晶屏显示静态图像。 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714@qq.com 显示一个像素点 将rgb888图片转为rgb555 输出rgb555的C语言数组 数组的每一个元素对应一个像素点的rgb三个通道的数据,用stm32的FSMC模拟8080时

    2024年02月09日
    浏览(19)
  • STM32F103硬件IIC控制4针0.96寸OLED显示屏

    OLED使用的0.96寸四针屏幕,以下直接看实际操作。 使用PCtoLCD2002软件提取OLED字模。 注意红色方框的选项内容,不要选错了,选错会导致烧录程序后无法显示。 此为硬件IIC,如果使用过我的模拟IIC控制程序可直接看 void OLED_Write_Command(unsigned char IIC_Command); void OLED_Write_Data(unsig

    2024年02月02日
    浏览(22)
  • STM32F103模拟IIC控制4针0.96寸OLED显示屏

    OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为

    2023年04月24日
    浏览(18)
  • STM32-基本知识梳理10-FSMC控制ST7789V-LCD液晶显示屏

    一、ST7789V-LCD液晶显示 1,一种计算机的I/O设备,即输入输出设备; 2,数据传递结构,光线的传递通过偏光片进行调整,最终传递到滤光片上,进而不同RGB数据点,即像素点; 3, LCD显示器的关键参数 ①像素:显示器的像素指它成像最小的点 ②分辨率:像素点的个数的乘积

    2024年02月12日
    浏览(19)
  • STM32-OLED显示屏

    *本文采用的OLED显示屏为4针脚IIC显示屏,4针脚分别为GND,VCC,SCL,SDA OLED.C OLED_Font.h main.c

    2024年02月05日
    浏览(23)
  • STM32——OLED显示屏(4)

    目录 一、调试方式 二、OLED简介 三、OLED硬件电路 四、OLED驱动函数 五、OLED显示屏使用 1、硬件接线图 2、添加OLED驱动函数 3、程序 4、实物展示  六、Keil软件自带调试模式         对于单片机的编程而言,经常会遇到一个很大的问题,就是程序调试,单片机不像电脑,电

    2024年02月03日
    浏览(21)
  • STM32—LCD液晶显示屏

    目录 LCD液晶显示屏介绍 液晶的组成  物理特性 液晶显示屏内部构造  颜色深度 点亮LCD显示屏 查看原理图 图片显示 保存到工程用户代码的Inc目录下 参数为数组名 字符显示  汉字显示 某些物质在熔融状态或被溶剂溶解之后,尽管失去固态物质的刚性,却获得了液体的易流动

    2024年02月04日
    浏览(19)
  • 【STM32篇】驱动LCD显示屏

    本次使用的硬件设备为野火的霸道V2开发板,显示器控制芯片型号为ILI9341,实际型号为ST7789V。在编写代码时参考的是ILI9341数据手册,二者差别不大,都是240*320分辨率。         ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有262144色的240RGB x 320像素显示解决方案。

    2024年02月12日
    浏览(14)
  • STM32 使用LCD12864显示屏(串行方式)

    12864LCD液晶显示模块是一款4位/8位并行、2线或3线接口方式,内部含有国际一级、二级简体中文字库的图形点阵液晶模块。显示分辨率为128 64,内置8198个16 16点汉字,和128个16*8点ASCII字符集。 CS片选信号 (如果只有一款屏,可以将CS直接接到VCC上,实现两线通讯。) SID数据传

    2024年02月05日
    浏览(29)
  • STM32学习记录0010——TFTLCD液晶显示屏

    《STM32不完全手册》第18章 《ILI9341数据手册》 TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使

    2023年04月09日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包