LCD—液晶显示

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

本节主要介绍以下内容

显示器简介

液晶控制原理

秉火3.2寸液晶屏简介

使用FSMC模拟8080时序

NOR FLASH时序结构体

FSMC初始化结构体

一、显示器简介

  显示器属于计算机的I/O设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有CRT显示器、液晶显示器、LED点阵显示器及OLED显示器。

1.1 液晶显示器

液晶显示器,简称LCD(Liquid Crystal Display),相对于上一代CRT显示器(阴极射线管显示器)LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。

液晶电视与CRT电视的外观对比,很明显液晶电视更薄,“时尚”是液晶电视给人的第一印象,而CRT 电视则感觉很“笨重”。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分子排列却和固体晶体一样非常规则,因此取名液晶。如果给液晶施加电场,会改变它的分子排列,从而改变光线的传播方向,配合偏振光片,它就具有控制光线透过率的作用,再配合彩色滤光片,改变加给液晶电压大小,就能改变某一颜色透光量的多少 

LCD—液晶显示,嵌入式软件学习总结,计算机外设

利用液晶控制的原理,做出可控红、绿、蓝光输出强度的显示结构,把三种显示结构组成一个显示单位,通过控制红绿蓝的强度,可以使该单位混合输出不同的色彩,这样的一个显示单位被称为像素。 

注意液晶本身是不发光的,所以需要有一个背光灯提供光源,光线经过一系列处理过程才到输出,所以输出的光线强度是要比光源的强度低很多的,比较浪费能源(当然,比CRT显示器还是节能多了)。而且这些处理过程会导致显示方向比较窄,也就是它的视角较小,从侧面看屏幕会看不清它的显示内容。另外,输出的色彩变换时,液晶分子转动也需要消耗一定的时间,导致屏幕的响应速度低。

1.2 LED显示器

  LED点阵彩色显示器的单个像素点内包含红绿蓝三色LED,显示原理类似实验板上的LED彩灯,通过控制红绿蓝颜色的强度进行混色,实现全彩颜色输出,多个像素点构成一个屏幕。由于每个像素点都是LED灯自发光的,所以在户外白天也显示得非常清晰,但由于LED灯体积较大,导致屏幕的像素密度低,所以它一般只适合用于广场上的巨型显示器。相对来说,单色的LED点阵显示器应用得更广泛,如公交车上的信息展示牌、店招等

LCD—液晶显示,嵌入式软件学习总结,计算机外设

1.3 OLED显示器 

新一代的OLED显示器与LED点阵彩色显示器的原理类似,但由于它采用的像素单元是“有机发光二极管”(Organic Light Emitting Diode),所以像素密度比普通LED点阵显示器高得多。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

OLED显示器不需要背光源、对比度高、轻薄、视角广及响应速度快等优点。待到生产工艺更加成熟时,必将取代现在液晶显示器的地位 

LCD—液晶显示,嵌入式软件学习总结,计算机外设

 对于不同种类的显示器,其控制程序原理是类似的,都是以操作像素点为基础。

1.3 显示器的基本参数

不管是哪一种显示器,都有一定的参数用于描述它们的特性,各个参数介绍如下:

像素

  像素是组成图像的最基本单元要素,显示器的像素指它成像最小的点,即前面讲解液晶原理中提到的一个显示单元。

分辨率

  一些嵌入式设备的显示器常常以“行像素值x列像素值”表示屏幕的分辨率。如分辨率800x480表示该显示器的每一行有800个像素点,每一列有480个像素点,也可理解为有800列,480行。

色彩深度

  色彩深度指显示器的每个像素点能表示多少种颜色,一般用“位”(bit)来表示。如单色屏的每个像素点能表示亮或灭两种状态(即实际上能显示2种颜色),用1个数据位就可以表示像素点的所有状态,所以它的色彩深度为1bit,其它常见的显示屏色深为16bit24bit

显示器尺寸

  显示器的大小一般以英寸表示,如5英寸、21英寸、24英寸等,这个长度是指屏幕对角线的长度, 通过显示器的对角线长度及长宽比可确定显示器的实际长宽尺寸。

点距

  点距指两个相邻像素点之间的距离,它会影响画质的细腻度及观看距离,相同尺寸的屏幕,若分辨率越高,则点距越小,画质越细腻。如现在有些手机的屏幕分辨率比电脑显示器的还大,这是手机屏幕点距小的原因;LED点阵显示屏的点距一般都比较大,所以适合远距离观看。

二、 液晶控制原理

下图两种适合于STM32芯片使用的显示屏,我们以它为例讲解控制液晶屏的原理

LCD—液晶显示,嵌入式软件学习总结,计算机外设

 完整的显示屏由液晶显示面板电容触摸面板以及PCB底板构成。

图中的触摸面板带有触摸控制芯片,该芯片处理触摸信号并通过引出的信号线与外部器件通讯面板中间是透明的,它贴在液晶面板上面,一起构成屏幕的主体,触摸面板与液晶面板引出的排线连接到PCB底板上

  根据实际需要,PCB底板上可能会带有“液晶控制器芯片”。因为控制液晶面板需要比较多的资源,所以大部分低级微控制器都不能直接控制液晶面板,需要额外配套一个专用液晶控制器来处理显示过程,外部微控制器只要把它希望显示的数据直接交给液晶控制器即可。而不带液晶控制器的PCB底板 ,只有小部分的电源管理电路,液晶面板的信号线与外部微控制器相连,直接控制。STM32F429系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到STM32F429芯片内部了,节约了额外的控制器成本。STM32F1系列的芯片控制液晶时,液晶屏需带有液晶控制器。

2.1 液晶面板的控制信号

液晶面板的控制信号线(不带液晶控制器)

信号名称

说明

R[7:0]

红色数据

G[7:0]

绿色数据

B[7:0]

蓝色数据

CLK

像素同步时钟信号

HSYNC

水平同步信号

VSYNC

垂直同步信号

DE

数据使能信号

RGB 信号线

  RGB信号线各有8根,分别用于表示液晶屏一个像素点的红、绿、蓝颜色分量。使用红绿蓝颜色分量来表示颜色是一种通用的做法,打开Windows系统自带的画板调色工具,可看到颜色的红绿蓝分量值,常见的颜色表示会在RGB”后面附带各个颜色分量值的数据位数,如RGB565表示红绿蓝的数据线数分别为565根,一共为16个数据位,可表示2^16种颜色;而这个液晶屏的种颜色分量的数据线都有8根,所以它支持RGB888格式,一共24位数据线,可表示的颜色为2^24种。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

同步时钟信号 CLK

  液晶屏与外部使用同步通讯方式,以CLK信号作为同步时钟,在同步时钟的驱动下,每个时钟传输一个像素点数据。

水平同步信号 HSYNC

  水平同步信号HSYNC(Horizontal Sync)用于表示液晶屏一行像素数据的传输结束,每传输完成液晶屏的一行像素数据时,HSYNC会发生电平跳变,如分辨率为800x480的显示屏(800列,480),传输一帧的图像HSYNC的电平会跳变480次。

垂直同步信号 VSYNC

  垂直同步信号VSYNC(Vertical Sync)用于表示液晶屏一帧像素数据的传输结束,每传输完成一帧像素数据时,VSYNC会发生电平跳变。其中“帧”是图像的单位,一幅图像称为一帧,在液晶屏中,一帧指一个完整屏液晶像素点。人们常常用“帧/秒”来表示液晶屏的刷新特性,即液晶屏每秒可以显示多少帧图像,如液晶屏以60/秒的速率运行时,VSYNC每秒钟电平会跳变60次。

数据使能信号 DE

  数据使能信号DE(Data Enable)用于表示数据的有效性,当DE信号线为高电平时,RGB信号线表示的数据有效。

2.2 液晶数据传输时序

向液晶屏传输一帧图像数据的时序

LCD—液晶显示,嵌入式软件学习总结,计算机外设

液晶屏显示的图像可看作一个矩形液晶屏有一个显示指针,它指向将要显示的像素。显示指针的扫描方向方向从左到右、从上到下,一个像素点一个像素点地描绘图形。这些像素点的数据通过RGB数据线传输至液晶屏,它们在同步时钟CLK的驱动下一个一个地传输到液晶屏中,交给显示指针,传输完成一行时,水平同步信号HSYNC电平跳变一次,而传输完一帧时VSYNC电平跳变一次。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

 液晶显示指针在行与行之间,帧与帧之间切换时需要延时,而且HSYNCVSYNC信号本身也有宽度,这些时间参数说明见下表:

时间参数

参数说明

VBP (vertical back porch)

表示在一帧图像开始时,垂直同步信号以后的无效的行数

VFP (vertical front porch)

表示在一帧图像结束后,垂直同步信号以前的无效的行数

HBP (horizontal back porch)

表示从水平同步信号开始到一行的有效数据开始之间的CLK的个数

HFP (horizontal front porth)

表示一行的有效数据结束到下一个水平同步信号开始之间的CLK的个数

VSW (vertical sync width)

表示垂直同步信号的宽度,单位为行

HSW (horizontal sync width)

表示水平同步信号的宽度,单位为同步时钟CLK的个数

在这些时间参数控制的区域,数据使能信号线“DE”都为低电平,RGB数据线的信号无效,当“DE”为高电平时,表示的数据有效,传输的数据会直接影响液晶屏的显示区域。

2.3 显存

液晶屏中的每个像素点都是数据,在实际应用中需要把每个像素点的数据缓存起来,再传输给液晶屏,这种存储显示数据的存储器被称为显存。显存一般至少要能存储液晶屏的一帧显示数据,如分辨率为800x480的液晶屏,使用RGB888格式显示,它的一帧显示数据大小为:3x800x480=1152000字节(3个8,3个字节);若使用RGB565格式显示,一帧显示数据大小为:2x800x480=768000字节(5+6+5 = 16,2个字节)。

三、秉火3.2寸液晶屏简介

前面介绍的屏幕其液晶控制器与液晶屏是完全分离的,且具有带控制器和不带控制器的版本,易于理解,下面来分析实验板标配的分辨率为320*2403.2寸电阻触摸液晶屏

3.1、3.2寸电阻触摸屏实物

LCD—液晶显示,嵌入式软件学习总结,计算机外设

图中的标号部分是液晶屏幕的整体,通过引出的排针接入到实验板上可对它进行控制,它分为标号的液晶触摸面板和标号PCB底板两部分。

  标号①处的液晶触摸面板由液晶屏和触摸屏组成,屏幕表面的灰色线框即为电阻触摸屏的信号线,触摸屏的下方即为液晶面板,在它的内部包含了一个型号为ILI9341的液晶控制器芯片(由于集成度高,所以图中无法看见),该液晶控制器使用8080接口与单片机通讯,图中液晶面板引出的FPC信号线即8080接口(RGB接口已在内部直接与ILI9341相连),且控制器中包含有显存,单片机把要显示的数据通过引出的8080接口发送到液晶控制器,这些数据会被存储到它内部的显存中,然后液晶控制器不断把显存的内容刷新到液晶面板,显示内容。

标号②处的是PCB底板,它主要包含了一个电阻触摸屏的控制器XPT2046,电阻触摸屏控制器实质上是一个ADC芯片,通过检测电压值来计算触摸坐标。PCB底板与液晶触摸面板通过FPC排线座连接,然后引出到排针,方便与实验板的排母连接。

3.2 ILI9341液晶控制器简介

本液晶屏内部包含有一个液晶控制芯片ILI9341,它的内部结构如下图:

LCD—液晶显示,嵌入式软件学习总结,计算机外设

该芯片最主核心部分是位于中间的GRAM(Graphics RAM),它就是显存。GRAM中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。  图的左上角为ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是616还是18位;可配置使用SPI接口、8080接口还是RGB接口与MCU进行通讯。MCU通过SPI8080接口或RGB接口与ILI9341进行通讯,从而访问它的控制寄存器(CR)、地址计数器(AC)、及GRAM

  GRAM的左侧还有一个LED控制器(LED Controller)LCD为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED控制器就是用来控制液晶屏中的LED背光源。

与STM32通信主要使用标黄的引脚。

3.3 液晶屏的信号线及8080时序

ILI9341控制器根据自身的IM[3:0]信号线电平决定它与MCU的通讯方式,它本身支持SPI8080通讯方式,本示例中液晶屏的ILI9341控制器在出厂前就已经按固定配置好(内部已连接硬件电路),它被配置为通过8080接口通讯,使用16根数据线的RGB565格式。内部硬件电路连接完,剩下的其它信号线被引出到FPC排线,最后该排线由PCB底板引出到排针,排针再与实验板上的STM32芯片连接,引出的排针信号线如下图:

LCD—液晶显示,嵌入式软件学习总结,计算机外设

图中红色为数据线,蓝色为控制线

这些引出的信号线即8080通讯接口,带X的表示低电平有效,STM32通过该接口与ILI9341芯片进行通讯,实现对液晶屏的控制。通讯的内容主要包括命令和显存数据,显存数据即各个像素点的RGB565内容;命令是指对ILI9341的控制指令,MCU可通过8080接口发送命令编码控制ILI9341的工作方式,例如复位指令、设置光标指令、睡眠模式指令等等,具体的指令在《ILI9341.pdf》数据手册均有详细说明。

信号线

ILI9341对应的信号线

说明

LCD_DB[15:0]

D[15:0]

数据信号

LCD_RD

RDX

读数据信号,低电平有效

LCD_RS

D/CX

数据/命令信号,高电平时,D[15:0]表示的是数据(RGB像素数据或命令数据),低电平时D[15:0]表示控制命令

LCD_RESET

RESX

复位信号,低电平有效

LCD_WR

WRX

写数据信号,低电平有效

LCD_CS

CSX

片选信号,低电平有效

LCD_BK

-

背光信号,低电平点亮

GPIO[5:1]

-

触摸屏的控制信号线,下一章再介绍

ILI9341写命令时序图 (8080时序)

LCD—液晶显示,嵌入式软件学习总结,计算机外设

写命令时序由片选信号CSX拉低开始,对数据/命令选择信号线D/CX也置低电平表示写入的是命令地址(可理解为命令编码,如软件复位命令:0x01),以写信号WRX为低,读信号RDX为高表示数据传输方向为写入,同时,在数据线D[17:0](D[15:0])输出命令地址,在第二个传输阶段传送的是命令的参数,所以D/CX要置高电平,表示写入的是命令数据,命令数据是某些指令带有的参数,如复位指令编码为0x01,它后面可以带一个参数,该参数表示多少秒后复位(实际的复位命令不含参数,此处只是为了讲解指令编码与参数的区别)

  当需要把像素数据写入GRAM时,过程很类似,把片选信号CSX拉低后,再把数据/命令选择信号线D/CX置为高电平,这时由D[17:0]传输的数据则会被ILI9341保存至它的GRAM中。

四、使用STM32的FSMC模拟8080接口时序

STM32没有8080接口,ILI93418080通讯接口时序可以由STM32使用普通I/O接口进行模拟,但这样效率太低,STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。

在前面的《FSMC—扩展外部SRAM》章节中了解到STM32FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且8080接口的通讯时序完全可以使用FSMC外设产生,因而非常适合使用FSMC控制液晶屏。

4.1 FSMC简介

LCD—液晶显示,嵌入式软件学习总结,计算机外设

 控制LCD时,适合使用FSMCNOR\PSRAM模式,它与前面使用FSMC控制SRAM的稍有不同,控制SRAM时使用的是模式A,而控制LCD时使用的是与NOR FLASH一样的模式B,所以我们重点分析框图中NOR FLASH控制信号线部分。

FSMC信号名称

信号方向

功能

CLK

输出

时钟(同步突发模式使用)

A[25:0]

输出

地址总线

D[15:0]

输入/输出

双向数据总线

NE[x]

输出

片选,x = 1...4

NOE

输出

输出使能

NWE

输出

写使能

NWAIT

输入

NOR闪存要求FSMC等待的信号

NADV

输出

地址、数据线复用时作锁存信号

  在控制LCD时,使用的是类似异步、地址与数据线独立的NOR FLASH控制方式,所以实际上CLKNWAITNADV引脚并没有使用到。

FSMC NOR/PSRAM中的模式B的写时序如下图:

LCD—液晶显示,嵌入式软件学习总结,计算机外设

根据STM32对寻址空间的地址映射,地址0x6000 0000 ~0x9FFF FFFF是映射到外部存储器的,而其中的0x6000 0000 ~0x6FFF FFFF则是分配给NOR FLASHPSRAM这类可直接寻址的器件。

当FSMC外设被配置成正常模式,并且外部连接了NOR FLASH时,若向0x60000000地址写入数据0xABCD,FSMC会自动在各信号线上产生相应的电平信号,写入数据。FSMC会控制片选信号信号NE1选择相应的NOR 芯片,然后使能地址线A[25:0]输出0x60000000,NWE写使能信号线上发出低电平的写使能信号,而要写入的数据信号0xABCD则从数据线D[15:0]输出,然后数据就被保存到NOR FLASH中了。

4.2 用FSMC模拟8080时序

LCD—液晶显示,嵌入式软件学习总结,计算机外设

对比FSMC NOR/PSRAM中的模式B时序与ILI9341液晶控制器芯片使用的8080时序可发现,这两个时序是十分相似的(除了FSMC的地址线A8080D/CX线,可以说是完全一样) 

FSMC-NOR信号线

功能

8080信号线

功能

NEx

片选信号

CSX

片选信号

NWR

写使能

WRX

写使能

NOE

读使能

RDX

读使能

D[15:0]

数据信号

D[15:0]

数据信号

A[25:0]

地址信号

D/CX

数据/命令选择

对于FSMC和8080接口,前四种信号线都是完全一样的,仅仅是FSMC的地址信号线A[25:0]8080的数据/命令选择线D/CX有区别。而对于D/CX线,它为高电平的时候表示数值,为低电平的时候表示命令,如果能使用FSMCA地址线根据不同的情况产生对应的电平,那么就完全可以使用FSMC来产生8080接口需要的时序了。

为了模拟出8080时序,我们可以把FSMCA0地址线(也可以使用其它A1/A2等地址线)ILI9341芯片8080接口的D/CX信号线连接,那么当A0为高电平时(D/CX为高电平),数据线D[15:0]的信号会被ILI9341理解为数值,若A0为低电平时(D/CX为低电平),传输的信号则会被理解为命令。

由于FSMC会自动产生地址信号,当使用FSMC0x6xxx xxx10x6xxx xxx30x6xxx xxx5…这些奇数地址写入数据时,地址最低位的值均为1,所以它会控制地址线A0(D/CX)输出高电平,那么这时通过数据线传输的信号会被理解为数值;若向0x6xxx xxx0 0x6xxx xxx20x6xxx xxx4…这些偶数地址写入数据时,地址最低位的值均为0,所以它会控制地址线A0(D/CX)输出低电平,因此这时通过数据线传输的信号会被理解为命令,如下表:

地址

地址的二进制值(仅列出低四位)

A0(D/CX)的电平

控制ILI9341时的意义

0x6xxx xxx1

0001

1 高电平

D数值

0x6xxx xxx3

0011

1高电平

D数值

0x6xxx xxx5

0101

1高电平

D数值

0x6xxx xxx0

0000

0低电平

C命令

0x6xxx xxx2

0010

0低电平

C命令

0x6xxx xxx4

0100

0低电平

C命令

有了这个基础,只要配置好FSMC外设,然后在代码中利用指针变量,向不同的地址单元写入数据,就能够由FSMC模拟出的8080接口向ILI9341写入控制命令或GRAM的数据了。

 注意:在实际控制时,以上地址计算方式还不完整,还需要注意HADDR内部地址与FSMC地址信号线的转换,关于这部分内容在代码讲解时再详细举例说明

五、NOR FLASH时序结构体

与控制SRAM时一样,控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的时序结构体以及初始化结构体可以很方便地写入参数。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

FSMC_AddressSetupTime

  本成员设置地址建立时间,它可以被设置为0-0xFHCLK周期数,按STM32标准库的默认配置,HCLK的时钟频率为72MHz,即一个HCLK周期为1/72微秒。

FSMC_AddressHoldTime

本成员设置地址保持时间,它可以被设置为0-0xFHCLK周期数。

FSMC_DataSetupTime

本成员设置数据建立时间,它可以被设置为0-0xFHCLK周期数。

FSMC_BusTurnAroundDuration

本成员设置总线转换周期,在NOR FLASH存储器中,地址线与数据线可以分时复用,总线转换周期就是指总线在这两种状态间切换需要的延时,防止冲突。控制其它存储器时这个参数无效,配置为0即可。

FSMC_CLKDivision

本成员用于设置时钟分频,它以HCLK时钟作为输入,经过FSMC_CLKDivision分频后输出到FSMC_CLK引脚作为通讯使用的同步时钟。控制其它异步通讯的存储器时这个参数无效,配置为0即可。

FSMC_DataLatency

本成员设置数据保持时间,它表示在读取第一个数据之前要等待的周期数,该周期指同步时钟的周期,本参数仅用于同步NOR FLASH类型的存储器,控制其它类型的存储器时,本参数无效。

FSMC_AccessMode

本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,可选FSMC_AccessMode_A/B/C/D模式。一般来说控制异步NOR FLASH时使用B模式。

这个FSMC_NORSRAMTimingInitTypeDef 时序结构体配置的延时参数,将作为下一节的FSMC SRAM初始化结构体的一个成员。

FSMCNOR FLASH初始化结构体

FSMC初始化结构体,除最后两个成员是上一小节讲解的时序配置外,其它结构体成员的配置都对应到FSMC_BCR中的寄存器位。

LCD—液晶显示,嵌入式软件学习总结,计算机外设

FSMC_Bank

本成员用于选择FSMC映射的存储区域。

FSMC_DataAddressMux

  本成员用于设置地址总线与数据总线是否复用(FSMC_DataAddressMux_Enable /Disable),在控制NOR FLASH时,可以地址总线与数据总线可以分时复用,以减少使用STM32信号线的数量。

FSMC_MemoryType

  本成员用于设置要控制的存储器类型,它支持控制的存储器类型为SRAMPSRAM以及NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)

FSMC_MemoryDataWidth

  本成员用于设置要控制的存储器的数据宽度,可选择设置成816(FSMC_MemoryDataWidth_8b /16b)

FSMC_BurstAccessMode

  本成员用于设置是否使用突发访问模式(FSMC_BurstAccessMode_Enable/Disable),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式。

FSMC_AsynchronousWait

  本成员用于设置是否使能在同步传输时使用的等待信号(FSMC_AsynchronousWait_Enable/Disable),在控制同步类型的NORPSRAM时,存储器可以使用FSMC_NWAIT引脚通知STM32需要等待。

FSMC_WaitSignalPolarity

  本成员用于设置等待信号的有效极性,即要求等待时,使用高电平还是低电平(FSMC_WaitSignalPolarity_High/Low)

FSMC_WrapMode

  本成员用于设置是否支持把非对齐的AHB突发操作分割成2次线性操作(FSMC_WrapMode_Enable/Disable),该配置仅在突发模式下有效。

FSMC_WaitSignalActive

  本成员用于配置在突发传输模式时,决定存储器是在等待状态之前的一个数据周期有效还是在等待状态期间有效(FSMC_WaitSignalActive_BeforeWaitState/DuringWaitState)

FSMC_WriteOperation

  这个成员用于设置是否写使能(FSMC_WriteOperation_ Enable /Disable),禁止写使能的话FSMC只能从存储器中读取数据,不能写入。

FSMC_WaitSignal

  本成员用于设置当存储器牌突发传输模式时,是否允许通过NWAIT信号插入等待状态(FSMC_WaitSignal_Enable/Disable)

FSMC_ExtendedMode

  本成员用于设置是否使用扩展模式(FSMC_ExtendedMode_Enable/Disable),在非扩展模式下,对存储器读写的时序都只使用FSMC_BCR寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。

FSMC_ReadWriteTimingStruct

  本成员是一个指针,赋值时使用上一小节中讲解的时序结构体FSMC_NORSRAMInitTypeDef设置,当不使用扩展模式时,读写时序都使用本成员的参数配置。

FSMC_WriteTimingStruct

  同样地,本成员也是一个时序结构体的指针,只有当使用扩展模式时,本配置才有效,它是写操作使用的时序。文章来源地址https://www.toymoban.com/news/detail-782536.html

六、驱动程序

lcd.c

#include "./lcd/bsp_ili9341_lcd.h"





void ILI9341_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	// 打开GPIO的时钟
	RCC_APB2PeriphClockCmd(ILI9341_CS_CLK|ILI9341_RST_CLK|ILI9341_BK_CLK|ILI9341_RD_CLK|
						ILI9341_WR_CLK|ILI9341_DC_CLK|ILI9341_D0_CLK|ILI9341_D1_CLK|ILI9341_D2_CLK|
						ILI9341_D3_CLK|ILI9341_D4_CLK|ILI9341_D5_CLK|ILI9341_D6_CLK|ILI9341_D7_CLK|
						ILI9341_D8_CLK|ILI9341_D9_CLK|ILI9341_D10_CLK|ILI9341_D11_CLK|ILI9341_D12_CLK|
						ILI9341_D13_CLK|ILI9341_D14_CLK|ILI9341_D15_CLK	, ENABLE);
	
	// 将的GPIO配置为推挽模式
	GPIO_InitStructure.GPIO_Pin = ILI9341_BK_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(ILI9341_BK_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_RST_PIN;
	GPIO_Init(ILI9341_RST_PORT, &GPIO_InitStructure);
	
	
	// 将的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = ILI9341_CS_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(ILI9341_CS_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_RD_PIN;
	GPIO_Init(ILI9341_RD_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_WR_PIN;
	GPIO_Init(ILI9341_WR_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_DC_PIN;
	GPIO_Init(ILI9341_DC_PORT, &GPIO_InitStructure);
	
	
		/* 配置FSMC相对应的数据线,FSMC-D0~D15 */	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D0_PIN;
	GPIO_Init ( ILI9341_D0_PORT, & GPIO_InitStructure );

	GPIO_InitStructure.GPIO_Pin = ILI9341_D1_PIN;
	GPIO_Init ( ILI9341_D1_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D2_PIN;
	GPIO_Init ( ILI9341_D2_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D3_PIN;
	GPIO_Init ( ILI9341_D3_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D4_PIN;
	GPIO_Init ( ILI9341_D4_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D5_PIN;
	GPIO_Init ( ILI9341_D5_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D6_PIN;
	GPIO_Init ( ILI9341_D6_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D7_PIN;
	GPIO_Init ( ILI9341_D7_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D8_PIN;
	GPIO_Init ( ILI9341_D8_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D9_PIN;
	GPIO_Init ( ILI9341_D9_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D10_PIN;
	GPIO_Init ( ILI9341_D10_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D11_PIN;
	GPIO_Init ( ILI9341_D11_PORT, & GPIO_InitStructure );

	GPIO_InitStructure.GPIO_Pin = ILI9341_D12_PIN;
	GPIO_Init ( ILI9341_D12_PORT, & GPIO_InitStructure );	
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D13_PIN;
	GPIO_Init ( ILI9341_D13_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D14_PIN;
	GPIO_Init ( ILI9341_D14_PORT, & GPIO_InitStructure );
	
	GPIO_InitStructure.GPIO_Pin = ILI9341_D15_PIN;
	GPIO_Init ( ILI9341_D15_PORT, & GPIO_InitStructure );


}



void ILI9341_FSMC_Config(void)
{
	
	FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
	FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;

		
	/*使能FSMC外设时钟*/
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);

	//地址建立时间(ADDSET)
	readWriteTiming.FSMC_AddressSetupTime = 0x01;	
	//数据保持时间(DATAST)
	readWriteTiming.FSMC_DataSetupTime = 0x04;		 

	
	//地址保持时间(ADDHLD)模式B未用到
	readWriteTiming.FSMC_AddressHoldTime = 0x00;	 
	
	//设置总线转换周期,仅用于复用模式的NOR操作
	readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
	
	//设置时钟分频,仅用于同步类型的存储器
	readWriteTiming.FSMC_CLKDivision = 0x00;	

	//数据保持时间,仅用于NOR
	readWriteTiming.FSMC_DataLatency = 0x00;		
	
	//选择匹配SRAM的模式
	readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B;	 
    

	// 选择FSMC映射的存储区域: Bank1 NORSRAMx
	FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_BANK_NORSRAMx; 
	
	//设置地址总线与数据总线是否复用,仅用于NOR
	FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; 
	
	//设置要控制的存储器类型:NOR类型
	FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_NOR;   
	
	//存储器数据宽度:16位
	FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; 
	
	//设置是否使用突发访问模式,仅用于同步类型的存储器
	FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
	
	//设置是否使能等待信号,仅用于同步类型的存储器
	FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
	
	//设置等待信号的有效极性,仅用于同步类型的存储器
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
	
	//设置是否支持把非对齐的突发操作,仅用于同步类型的存储器
	FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; 
	
	//设置等待信号插入的时间,仅用于同步类型的存储器
	FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
	
	//存储器写使能 
	FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
	
	//不使用等待信号
	FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  		
	
	// 不使用扩展模式,读写使用相同的时序
	FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; 
	
	//突发写操作
	FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
	
	//读写时序配置
	FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
	
	//读写同样时序,使用扩展模式时这个配置才有效
	FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; 

	FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

	FSMC_NORSRAMCmd(FSMC_BANK_NORSRAMx, ENABLE);  // 使能BANK										  
					
}



/**
  * @brief  向ILI9341写入命令
  * @param  usCmd :要写入的命令(表寄存器地址)
  * @retval 无
  */	
__inline void ILI9341_Write_Cmd ( uint16_t usCmd )
{
	 *ILI9341_CMD_ADDR = usCmd;	
}


/**
  * @brief  向ILI9341写入数据
  * @param  usData :要写入的数据
  * @retval 无
  */	
__inline void ILI9341_Write_Data ( uint16_t usData )
{
	* ILI9341_DATA_ADDR = usData;
	
}


/**
  * @brief  从ILI9341读取数据
  * @param  无
  * @retval 读取到的数据
  */	
__inline uint16_t ILI9341_Read_Data ( void )
{
	return ( *ILI9341_DATA_ADDR );
	
}

uint16_t Read_Pixel_Format(void)
{

	ILI9341_Write_Cmd(0x0C);
	ILI9341_Read_Data();
	
	return ILI9341_Read_Data();

}


/**
 * @brief  ILI9341背光LED控制
 * @param  enumState :决定是否使能背光LED
  *   该参数为以下值之一:
  *     @arg ENABLE :使能背光LED
  *     @arg DISABLE :禁用背光LED
 * @retval 无
 */
void ILI9341_BackLed_Control ( FunctionalState enumState )
{
	if ( enumState )
		GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );	
	else
		GPIO_SetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
		
}


/**
  * @brief  用于 ILI9341 简单延时函数
  * @param  nCount :延时计数值
  * @retval 无
  */	
static void ILI9341_Delay ( __IO uint32_t nCount )
{
  for ( ; nCount != 0; nCount -- );
	
}


/**
 * @brief  ILI9341 软件复位
 * @param  无
 * @retval 无
 */
void ILI9341_Rst ( void )
{			
	GPIO_ResetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN );	 //低电平复位

	ILI9341_Delay ( 0xAFF ); 					   

	GPIO_SetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN );		 	 

	ILI9341_Delay ( 0xAFF ); 	
	
}


/**
 * @brief  初始化ILI9341寄存器
 * @param  无
 * @retval 无
 */
static void ILI9341_REG_Config ( void )
{
	/*  Power control B (CFh)  */
	DEBUG_DELAY  ();
	ILI9341_Write_Cmd ( 0xCF  );
	ILI9341_Write_Data ( 0x00  );
	ILI9341_Write_Data ( 0x81  );
	ILI9341_Write_Data ( 0x30  );
	
	/*  Power on sequence control (EDh) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xED );
	ILI9341_Write_Data ( 0x64 );
	ILI9341_Write_Data ( 0x03 );
	ILI9341_Write_Data ( 0x12 );
	ILI9341_Write_Data ( 0x81 );
	
	/*  Driver timing control A (E8h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xE8 );
	ILI9341_Write_Data ( 0x85 );
	ILI9341_Write_Data ( 0x10 );
	ILI9341_Write_Data ( 0x78 );
	
	/*  Power control A (CBh) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xCB );
	ILI9341_Write_Data ( 0x39 );
	ILI9341_Write_Data ( 0x2C );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x34 );
	ILI9341_Write_Data ( 0x02 );
	
	/* Pump ratio control (F7h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xF7 );
	ILI9341_Write_Data ( 0x20 );
	
	/* Driver timing control B */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xEA );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x00 );
	
	/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xB1 );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x1B );
	
	/*  Display Function Control (B6h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xB6 );
	ILI9341_Write_Data ( 0x0A );
	ILI9341_Write_Data ( 0xA2 );
	
	/* Power Control 1 (C0h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xC0 );
	ILI9341_Write_Data ( 0x35 );
	
	/* Power Control 2 (C1h) */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0xC1 );
	ILI9341_Write_Data ( 0x11 );
	
	/* VCOM Control 1 (C5h) */
	ILI9341_Write_Cmd ( 0xC5 );
	ILI9341_Write_Data ( 0x45 );
	ILI9341_Write_Data ( 0x45 );
	
	/*  VCOM Control 2 (C7h)  */
	ILI9341_Write_Cmd ( 0xC7 );
	ILI9341_Write_Data ( 0xA2 );
	
	/* Enable 3G (F2h) */
	ILI9341_Write_Cmd ( 0xF2 );
	ILI9341_Write_Data ( 0x00 );
	
	/* Gamma Set (26h) */
	ILI9341_Write_Cmd ( 0x26 );
	ILI9341_Write_Data ( 0x01 );
	DEBUG_DELAY ();
	
	/* Positive Gamma Correction */
	ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma
	ILI9341_Write_Data ( 0x0F );
	ILI9341_Write_Data ( 0x26 );
	ILI9341_Write_Data ( 0x24 );
	ILI9341_Write_Data ( 0x0B );
	ILI9341_Write_Data ( 0x0E );
	ILI9341_Write_Data ( 0x09 );
	ILI9341_Write_Data ( 0x54 );
	ILI9341_Write_Data ( 0xA8 );
	ILI9341_Write_Data ( 0x46 );
	ILI9341_Write_Data ( 0x0C );
	ILI9341_Write_Data ( 0x17 );
	ILI9341_Write_Data ( 0x09 );
	ILI9341_Write_Data ( 0x0F );
	ILI9341_Write_Data ( 0x07 );
	ILI9341_Write_Data ( 0x00 );
	
	/* Negative Gamma Correction (E1h) */
	ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x19 );
	ILI9341_Write_Data ( 0x1B );
	ILI9341_Write_Data ( 0x04 );
	ILI9341_Write_Data ( 0x10 );
	ILI9341_Write_Data ( 0x07 );
	ILI9341_Write_Data ( 0x2A );
	ILI9341_Write_Data ( 0x47 );
	ILI9341_Write_Data ( 0x39 );
	ILI9341_Write_Data ( 0x03 );
	ILI9341_Write_Data ( 0x06 );
	ILI9341_Write_Data ( 0x06 );
	ILI9341_Write_Data ( 0x30 );
	ILI9341_Write_Data ( 0x38 );
	ILI9341_Write_Data ( 0x0F );
	
	/* memory access control set */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0x36 ); 	
	ILI9341_Write_Data ( 0xC8 );    /*竖屏  左上角到 (起点)到右下角 (终点)扫描方式*/
	DEBUG_DELAY ();
	
	/* column address control set */
	ILI9341_Write_Cmd ( CMD_SetCoordinateX );  
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0xEF );
	
	/* page address control set */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( CMD_SetCoordinateY ); 
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x00 );
	ILI9341_Write_Data ( 0x01 );
	ILI9341_Write_Data ( 0x3F );
	
	/*  Pixel Format Set (3Ah)  */
	DEBUG_DELAY ();
	ILI9341_Write_Cmd ( 0x3a ); 
	ILI9341_Write_Data ( 0x55 );
	
	/* Sleep Out (11h)  */
	ILI9341_Write_Cmd ( 0x11 );	
	ILI9341_Delay ( 0xAFFf<<2 );
	DEBUG_DELAY ();
	
	/* Display ON (29h) */
	ILI9341_Write_Cmd ( 0x29 ); 
	
	
}


void ILI9341_Init(void)
{
	ILI9341_GPIO_Config();
	ILI9341_FSMC_Config();
	
	ILI9341_BackLed_Control(ENABLE);
	ILI9341_Rst();
	ILI9341_REG_Config();
}

void ILI9341_Open_Window(uint16_t usX,uint16_t usY,uint16_t usWidth,uint16_t usHeight)
{
	/* column address control set */
	ILI9341_Write_Cmd ( CMD_SetCoordinateX );  
	ILI9341_Write_Data ( (usX&0xFF00) >> 8 );
	ILI9341_Write_Data ( (usX&0x00FF) );
	ILI9341_Write_Data ( ((usX+usWidth)&0xFF00) >> 8 );
	ILI9341_Write_Data ( ((usX+usWidth)&0x00FF) );	

	ILI9341_Write_Cmd ( CMD_SetCoordinateY ); 
	ILI9341_Write_Data ( (usY&0xFF00) >> 8 );
	ILI9341_Write_Data ( (usY&0x00FF) );
	ILI9341_Write_Data ( ((usY+usHeight)&0xFF00) >> 8 );
	ILI9341_Write_Data ( ((usY+usHeight)&0x00FF) );	
}

void ILI9341_Draw_Rec(void)
{
	uint32_t i;
	ILI9341_Open_Window(10,20,100,100);
	
	ILI9341_Write_Cmd(CMD_SetPixel);
	

	for(i=0;i<100*100;i++)
		ILI9341_Write_Data(RGB888_2_RGB565(79,67,188)); 
}

   
/*********************************************END OF FILE**********************/

lcd.h

#ifndef __ILI9341_LCD_H
#define __ILI9341_LCD_H

#include "stm32f10x.h"
#include <stdio.h>


#define USE_ZNZ 1

/*LCD控制信号****************************/
#ifdef USE_ZNZ

	#define     FSMC_BANK_NORSRAMx				FSMC_Bank1_NORSRAM1
	
	#define 		ILI9341_CMD_ADDR  		(__IO uint16_t*)(0x60000000)
  #define 		ILI9341_DATA_ADDR  		(__IO uint16_t*)(0x60020000)
 

	#define      ILI9341_CS_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_CS_PORT          GPIOD
	#define      ILI9341_CS_PIN           GPIO_Pin_7

	#define      ILI9341_RST_CLK           RCC_APB2Periph_GPIOE
	#define      ILI9341_RST_PORT          GPIOE
	#define      ILI9341_RST_PIN           GPIO_Pin_1


	#define      ILI9341_BK_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_BK_PORT          GPIOD
	#define      ILI9341_BK_PIN           GPIO_Pin_12


	#define      ILI9341_RD_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_RD_PORT          GPIOD
	#define      ILI9341_RD_PIN           GPIO_Pin_4

	#define      ILI9341_WR_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_WR_PORT          GPIOD
	#define      ILI9341_WR_PIN           GPIO_Pin_5

	#define      ILI9341_DC_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_DC_PORT          GPIOD
	#define      ILI9341_DC_PIN           GPIO_Pin_11

#else

	#define     FSMC_BANK_NORSRAMx				FSMC_Bank1_NORSRAM4
	
	#define 		ILI9341_CMD_ADDR  		(__IO uint16_t*)(0x6c000000)
  #define 		ILI9341_DATA_ADDR  		(__IO uint16_t*)(0x6d000000)

	#define      ILI9341_CS_CLK           RCC_APB2Periph_GPIOG
	#define      ILI9341_CS_PORT          GPIOG
	#define      ILI9341_CS_PIN           GPIO_Pin_12

	#define      ILI9341_RST_CLK           RCC_APB2Periph_GPIOG
	#define      ILI9341_RST_PORT          GPIOG
	#define      ILI9341_RST_PIN           GPIO_Pin_11


	#define      ILI9341_BK_CLK           RCC_APB2Periph_GPIOG
	#define      ILI9341_BK_PORT          GPIOG
	#define      ILI9341_BK_PIN           GPIO_Pin_6


	#define      ILI9341_RD_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_RD_PORT          GPIOD
	#define      ILI9341_RD_PIN           GPIO_Pin_4

	#define      ILI9341_WR_CLK           RCC_APB2Periph_GPIOD
	#define      ILI9341_WR_PORT          GPIOD
	#define      ILI9341_WR_PIN           GPIO_Pin_5

	#define      ILI9341_DC_CLK           RCC_APB2Periph_GPIOE
	#define      ILI9341_DC_PORT          GPIOE
	#define      ILI9341_DC_PIN           GPIO_Pin_2
	
#endif


#define      ILI9341_D0_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D0_PORT               GPIOD
#define      ILI9341_D0_PIN                GPIO_Pin_14

#define      ILI9341_D1_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D1_PORT               GPIOD
#define      ILI9341_D1_PIN                GPIO_Pin_15

#define      ILI9341_D2_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D2_PORT               GPIOD
#define      ILI9341_D2_PIN                GPIO_Pin_0

#define      ILI9341_D3_CLK                RCC_APB2Periph_GPIOD  
#define      ILI9341_D3_PORT               GPIOD
#define      ILI9341_D3_PIN                GPIO_Pin_1

#define      ILI9341_D4_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D4_PORT               GPIOE
#define      ILI9341_D4_PIN                GPIO_Pin_7

#define      ILI9341_D5_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D5_PORT               GPIOE
#define      ILI9341_D5_PIN                GPIO_Pin_8

#define      ILI9341_D6_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D6_PORT               GPIOE
#define      ILI9341_D6_PIN                GPIO_Pin_9

#define      ILI9341_D7_CLK                RCC_APB2Periph_GPIOE  
#define      ILI9341_D7_PORT               GPIOE
#define      ILI9341_D7_PIN                GPIO_Pin_10

#define      ILI9341_D8_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D8_PORT               GPIOE
#define      ILI9341_D8_PIN                GPIO_Pin_11

#define      ILI9341_D9_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D9_PORT               GPIOE
#define      ILI9341_D9_PIN                GPIO_Pin_12

#define      ILI9341_D10_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D10_PORT               GPIOE
#define      ILI9341_D10_PIN                GPIO_Pin_13

#define      ILI9341_D11_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D11_PORT               GPIOE
#define      ILI9341_D11_PIN                GPIO_Pin_14

#define      ILI9341_D12_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D12_PORT               GPIOE
#define      ILI9341_D12_PIN                GPIO_Pin_15

#define      ILI9341_D13_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D13_PORT               GPIOD
#define      ILI9341_D13_PIN                GPIO_Pin_8

#define      ILI9341_D14_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D14_PORT               GPIOD
#define      ILI9341_D14_PIN                GPIO_Pin_9

#define      ILI9341_D15_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D15_PORT               GPIOD
#define      ILI9341_D15_PIN                GPIO_Pin_10



/*************************************** 调试预用 ******************************************/

#define      DEBUG_DELAY()                



/******************************* 定义 ILI934 常用命令 ********************************/
#define      CMD_SetCoordinateX		 		    0x2A	     //设置X坐标
#define      CMD_SetCoordinateY		 		    0x2B	     //设置Y坐标
#define      CMD_SetPixel		 		          0x2C	     //填充像素



#define RGB888_2_RGB565(R,G,B)		 (uint16_t)(((R & 0x1F) << 11) | ((G & 0x3F) << 5) | (B & 0x1F) )

/*SPI接口定义-结尾****************************/

/*等待超时时间*/
#define SPIT_FLAG_TIMEOUT         ((uint32_t)0x1000)
#define SPIT_LONG_TIMEOUT         ((uint32_t)(10 * SPIT_FLAG_TIMEOUT))

/*信息输出*/
#define FLASH_DEBUG_ON         1

#define FLASH_INFO(fmt,arg...)           printf("<<-FLASH-INFO->> "fmt"\n",##arg)
#define FLASH_ERROR(fmt,arg...)          printf("<<-FLASH-ERROR->> "fmt"\n",##arg)
#define FLASH_DEBUG(fmt,arg...)          do{\
                                          if(FLASH_DEBUG_ON)\
                                          printf("<<-FLASH-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
                                          }while(0)

																					
																					
void ILI9341_Init(void);
void ILI9341_Draw_Rec(void);																					

#endif /* __ILI9341_LCD_H */

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

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

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

相关文章

  • STM32显示外设集--液晶显示模块(LCD1602)

    一、介绍 产品图 二、 资源获取 欢迎关注微信公众号--星之援工作室 发送(LCD1602) 三、线路连接图 四、代码编写 LCD1602.h LCD1602.c main.h 五、参考 LCD1602是一种字母数字液晶显示模块,可以显示16个字符和2行文本,因此被命名为LCD1602。它通常用于各种电子项目,特别是

    2024年02月11日
    浏览(49)
  • LCD—STM32液晶显示(1.显示器简介及LCD显示原理)(6000字详细介绍)

    目录 显示器简介 液晶显示器 液晶 像素 液晶屏缺点 LED显示器 OLED显示器 显示器的基本参数 STM32板载液晶控制原理(不带微控制器) 液晶控制原理 控制信号线(不带液晶控制器) 液晶数据传输时序 显存 总结 3.2寸液晶屏介绍(搭载液晶控制器) 3.2寸电阻触摸屏实物 ILI9341液晶

    2024年02月17日
    浏览(52)
  • LCD液晶显示器 ----------- 原理篇

    1. 背景 ​ 在做嵌入式开发时,经常用到 LCD 显示屏,因为用户只能看得懂显示屏中的画面。因此,熟练掌握显示屏原理是非常有必要的,所以让我们来揭开LCD 显示屏的神秘面纱,进而达到完全掌控的目的。本章之讲解 LCD 显示原理以及显示时序。 2. 基本概念 2.1 LCD 是什么 ​

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

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

    2024年02月04日
    浏览(50)
  • 51单片机 | LCD1602 液晶显示实验

      在前面章节,我们已经学习过几种显示装置,例如静态数码管、动态数码管、 8*8LED 点阵、串口通信。使用它们可以直观显示一些字符数据,但是它们也有各种局限性,比如显示字符数据太少,硬件设计复杂、代码编写难度大等。这一章就来介绍一种非常简单且常用的显

    2023年04月11日
    浏览(65)
  • LCD-STM32液晶显示中英文-(7.字模及显示原理)

    目录 字模介绍 什么是字模 字模的构成 字模显示原理 字模制作 如何制作字模 字模寻址公式 存储字模文件         有了编码,我们就能在计算机中处理、存储字符了,但是如果计算机处理完字符后直接以编码的形式输出,人类将难以识别。因此计算机与人交互时,一般会

    2024年02月17日
    浏览(63)
  • 字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)

    趁机把LCD 1602的实验完成了,那个电路图有几个地方没弄懂,但是去掉也没有报错,就没管了。 LCD1602_百度百科 (baidu.com) https://baike.baidu.com/item/LCD1602/6014393?fr=ge_ala LCD1602液晶显示屏通过电压来改变填充在两块平行板之间的液晶材料内部分子的排列状况,以达到遮光和透光的目

    2024年02月06日
    浏览(51)
  • 【51单片机】LCD1602 液晶显示实验指导书

             来介绍一种非常简单且常用的显示装置——LCD1602 液晶显示器,使用它可以显示更多的字符数字。这将有助于我们清晰的观察程序的运行结果,更加方便我们的后续调试和开发。         我们的开发板上集成了一个 LCD1602 液晶显示器接口,将LCD1602 液晶对应插

    2024年02月01日
    浏览(63)
  • 单片机C语言实例:18、LCD1602液晶显示

    学单片机的小朋友应该都见过这个显示器--LCD1602,这是最古老最简单的显示屏,上世纪80年代的产物。 它显示的图案如下所示 显示部分放大就是下面这样 ,像素就是一个个小方块,相当于描点法绘图了。 如果把所有像素全部显示出来就是下面这样,全部是小黑点  全部点亮

    2024年02月09日
    浏览(49)
  • 51单片机LCD1602液晶屏显示方法

    以显示hello,world!    2022.10.17  为例。 首先把LCD1602的模块化程序添加到项目目录中,模块化方法在51单片机之程序模块化_学习笔记吧的博客-CSDN博客这里可以学习。 实验程序: LCD1602.c文件代码: LCD1602.h文件代码: 把这两个代码,分别添加到LCD1602.c 和 LCD1602.h 文件,然后添加

    2023年04月08日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包