TFT-LCD

2021/7/13 6:06:11

本文主要是介绍TFT-LCD,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

TFT-LCD 即薄膜晶体管液晶显示器,其英文全称为:Thin Film Transistor-Liquid CrystalDisplay。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。

该模块有如下特点:

  1. 2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。
  2. 320×240 的分辨率(3.5’分辨率为:320*480,4.3’和 7’分辨率为:800*480)。
  3. 16 位真彩显示。
  4. 自带触摸屏,可以用来作为控制输入。

 

本章,我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为 16 位的 80 并口,自带触摸屏。

 

L 丨 、 T K 
2 / 24 ' LCD MODULE

 

模块原理图如图 18.1.1.2 所示:

 

妥 三 
9180 
•Ig CIND 
-IH 
OSIIX 
I 」 
S• 1 二 
「 -80 
1 -80 
IS 
9180 
山 「 HO 
11a0 
「 1a0

 

TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:

 

LCT) CS 
LCD 
LCD RSV 
DB2 
DB4 
DB6 
DBS 
DBII 
DB13 
DBIS 
DB17 
LCDI 
LCD CS 
RSV 
DB2 
DB4 
11 
DB6 
13 
DBS 
15 
DBII 
17 
DB13 
19 
DBF 
21 
DB17 
BL CTRS 
RD 
DB3 
DBS 
DB7 
DBIO 
DB12 
DB14 
DB16 
GND 
VDD3.3 
GND 
GND 
T MISO 
T PEN 
T CS 
VDD3.3 
27 
GND BL VDD 
29 
MISO 
31 
T PEN 
T CS 
TET LCD 
MOSI 
MO 
CLK 
10 
12 
14 
16 
18 
20 
22 
24 
26 
28 
30 
32 
34 
LCD RS 
LCD RD 
OBI 
DBS 
DBS 
DBIO 
DB12 
DB14 
DB16 
GND 
vccs.3 
GND 
BL VDD 
T MOSI 
T CLR

 

从图可以看出,ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。

该模块的 80 并口有如下一些信号线:

  • CS:TFTLCD 片选信号。
  • WR:向 TFTLCD 写入数据。
  • RD:从 TFTLCD 读取数据。
  • D[15:0]:16 位双向数据线。
  • RST:硬复位 TFTLCD。
  • RS:命令/数据标志(0,读写命令;1,读写数据)

 

需要说明的是,TFTLCD模块的RST信号线是直接接到STM32的复位脚上,并不由软件控制,这样可以省下来一个 IO口。另外我们还需要一个背光控制线来控制TFTLCD 的背光。所以,我们总共需要的 IO口数目为 21 个。这里还需要注意,我们标注的DB1~DB8,DB10~DB17,是相对于 LCD 控制 IC 标注的,实际上大家可以把他们就等同于 D0~D15,这样理解起来就比较简单一点。

 

ILI9341 液晶控制器自带显存,其显存总大小为 172800(240*320*18/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:

 

计算机生成了可选文字:
93唼1总线
肥U数据
(吒位)
LCDGRAM
(16位)
D15
D13
RC4]RC3]RC2]R[1]RCO]
D17
D15
D16
DI唼
DI唼
D12
D13
D11
D12
NC
D11
D10
DB
引GC4]GCS]GC2]G1]G0]
BC4]BCS]BC2]B[1]ECO]
D10
DB

 

从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。

 

这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效,且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。

接下来,我们介绍一下 ILI9341 的几个重要命令:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。

 

首先来看指令:0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如图所示:

 

计算机生成了可选文字:
各位描述
顺序
指令
参数1
参数2
参数3
参数4
RS
0
1
1
1
1
RD
WR
D15、D8
XX
XX
XX
XX
XX
D7
X
D6
X
D5
X
D4
X
D3
X
D2
X
D1
X
DO
1
X
0
1
HEX
D3H
0OH
93H
41H

 

从上表可以看出,0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号。这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。

 

接下来看指令:0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如图所示:

计算机生成了可选文字:
各位描述
顺序
指令
0
控制
RD
1
WR
忄
D15、D8
XX
XX
D7
0
MY
D6
0
MX
D5
1
MV
D4
1
ML
D3
0
BGR
D2
1
MH
DI
1
0
DO
0
0
HEX
36H
0

 

从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如图所示:

计算机生成了可选文字:
MY
0
1
0
1
0
0
1
1
控制位
从左到右,从上到下
从左到右,从下到上
从右到左,从上到下
从右到左,从下到上
从上到下,从左到右
从上到下,从右到左
从下到上,从左到右
从下到上,从右到左
效果
LCD扫描方向(GRAM自增方式)
MX
0
0
1
1
0
1
0
1
MV
0
0
0
0
1
1
1
1

 

这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角。如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。

 

接下来看指令:0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如图所示:

计算机生成了可选文字:
各位描述
顺序
指令
参数1
参数2
参数3
参数4
RS
0
1
1
1
1
RD
1
1
1
1
1
WR
忄
忄
忄
忄
忄
D15、D8
XX
XX
XX
XX
XX
D7
0
SC15
SC7
EC15
EC7
D6
0
SC14
SC6
EC14
EC6
D5
1
SC13
SC5
EC13
EC5
D4
0
SC12
SC4
EC12
EC4
D3
1
SC11
SC3
EC11
EC3
D2
0
SCIO
SC2
ECIO
EC2
DI
1
SC9
SCI
EC9
ECI
DO
0
SC8
SCO
EC8
ECO
HEX
2AH
SC
EC

 

 

在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

 

指令:0X2B,与 0X2A 指令类似,是页地址设置指令。在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如图所示:

各 位 描 述 
顺 序 
指 令 
参 数 1 
参 数 2 
参 数 3 
参 数 4 
控 制 
RD 
RS 
0 
WR 
D15 、 D8 
XX 
XX 
D7 
0 
SP15 
SP7 
EP15 
EP7 
SP14 
SP6 
EP14 
EP6 
SP13 
SP5 
EP13 
EP5 
SP12 
EP12 
EP4 
SPII 
SP3 
EPII 
EP3 
SPIO 
SP2 
EPIC) 
EP2 
SP9 
SP 1 
EP9 
EP 1 
2B 日 
SP8 
SP 
SPO 
EP8 
EP 
EPO

 

在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。

 

接下来看指令:0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如图所示:

RS 
RD 
ifi4 
xx 
o 
DI 
0 
DO 
0 
o 
Dn[15: 
0] 
HEX 
2CH 
xx 
xx 
xx

 

从上表可知,在收到指令0X2C之后,数据有效位宽变为16位,我们可以连续写入 LCD-GRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。

 

最后,来看看指令:0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如图所示:

RS 
0 
RD 
DIO 
xx 
1 
R114:0] 
BIC4:O] 
D9 
xx 
xx 
xx 
xx 
D8 D7 D6 
0 
0 
xx 
105 
D2 
0 
Dl 
1 
xx 
xx 
xx 
xx 
DO 
0 
R2C4:O] 
HEX 
2EH 
dummy 
RIGI 
BIR2 
G2B2 
R3G3

 

该指令用于读取 GRAM,如图所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5... 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。

 

以上,就是操作 ILI9341 常用的几个指令,通过这几个指令,我们便可以很好的控制 ILI9341

显示我们所要显示的内容了。

 

一般 TFTLCD 模块的使用流程如图:

硬 复 位 
LCD RST=O; 
delay_ms( 100L 
LCD RST=I; 
初 始 化 序 列 
设 置 坐 标 
写 GRAM 指 令 
写 入 颜 色 数 据 
LCD 显 示 
读 GRAM 指 令 
读 出 颜 色 数 据 
单 片 机 处 理

 

任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。

读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。

 

以上只是最简单的操作,也是最常用的操作,有了这些操作,一般就可以正常使用 TFTLCD了。接下来我们将该模块(2.8 寸屏模块)用来来显示字符和数字,通过以上介绍,我们可以得出 TFTLCD 显示需要的相关设置步骤如下:

  1. 设置 STM32F1 与 与 TFTLCD 模块相连接的 IO 。

这一步,先将我们与 TFTLCD 模块相连的 IO 口进行初始化,以便驱动 LCD。这里我们用到的是 FSMC,FSMC 将在 18.1.2 节向大家详细介绍。

  1. 初始化 TFTLCD 模块。

即初始化序列,这里我们没有硬复位 LCD,因为精英 STM32F103 的 LCD 接口,将 TFTLCD 的 RST 同 STM32F1 的 RESET 连接在一起了,只要按下开发板的 RESET 键,就会对 LCD 进行硬复位。初始化序列,就是向 LCD 控制器写入一系列的设置值(比如伽马校准),这些初始化序列一般 LCD 供应商会提供给客户,我们直接使用这些序列即可,不需要深入研究。在初始化之后,LCD 才可以正常使用。

通过函数将字符和数字显示到 TFTLCD 模块上。

  1. 这一步则通过图 18.1.1.5 左侧的流程,即:设置坐标→写 GRAM 指令→写 GRAM 来实现,但是这个步骤,只是一个点的处理,我们要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目的,所以需要设计一个函数来实现数字/字符的显示,之后调用该函数,就可以实现数字/字符的显示了。


这篇关于TFT-LCD的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程