你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 TFTLCD驱动原理

[复制链接]
STMCU小助手 发布时间:2022-6-14 13:39
01. TFTLCD简介
" m0 k4 {1 i  ~# {6 rTFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。* \" G+ e. ?' W
5 \2 v; n" B  O3 s" |
该模块有如下特点:# [3 y: J; g* ^3 X
1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。- i' l  M% x2 z( p" n* r
2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。, a+ Q+ D4 w; M2 k4 J$ T
3,16 位真彩显示。
6 |" ^6 Y1 Q8 H: w. N0 y4,自带触摸屏,可以用来作为控制输入。) B& w  \8 M( t( }4 S# K

6 w; h3 Q& e/ a02. TFTLCD原理图
( S4 _( P% A/ L! }6 i我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。- [9 ?1 f3 R3 F. ]0 p6 n: ?' {& J
: o, q$ t: D, _$ J5 a4 C( |& ^: F
L0L01FU~NM3_T{RON7R{~FL.png
( }1 B0 l. y3 \/ V5 j/ T$ h$ b) o* x. {
模块原理图
# R, [# X- ?+ k) g" e- r: u! r" d
. y2 Z- ^' w5 I! Q A]4GE3T)E)H6@MW}HI[729T.png
' L+ {& u. ]3 S, z/ z; c  F8 n' r, P
/ a. f2 J( t$ A03. TFTLCD接口描述; [! i1 q% s! y' I4 ]  z( q
TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:3 O! ~9 o# d3 e3 v4 n

6 C/ D' C5 P* s %O{6LR4E%$EU1M2~~K~3OXE.png
2 w2 p: T- _  W( P- E: w! d$ r' Q  W8 Y) d" O
ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。
3 S1 Q5 H+ z2 T. W2 [$ K* V- c
% X0 U0 ~% c+ m$ D! V该模块的 80 并口有如下一些信号线:6 [5 o7 q# k: E  w

; F. P/ m" L5 \2 T" [( ~" hCS:TFTLCD 片选信号。: b3 r* m/ j; K) X, J
/ |6 e! Z' P, d& Z3 s4 f1 e
WR:向 TFTLCD 写入数据。8 M) L+ z$ p# s% [  k$ l0 M6 Q

9 r& l1 b- i- nRD:从 TFTLCD 读取数据。# _9 Q0 x4 [1 \8 ]8 q7 y( h

7 w- ~$ R- e7 v. a9 u7 tD[15:0]:16 位双向数据线。+ o( F$ q+ e, [) \0 u: _# p* U! `

/ T1 x/ b! u; h1 N" M0 R( ?& bRST:硬复位 TFTLCD。
4 J7 b  v; s' J& G; s$ A/ u0 y9 l9 ~# Q
RS:命令/数据标志(0,读写命令;1,读写数据)。: `& L4 ?/ G- |6 Q9 @. D

& X( F# O* A7 T1 ?; o: \04. TFTLCD驱动芯片+ f% F" j( |" i) {
ALIENTEK 提供 2.8/3.5/4.3/7 寸等不同尺寸的 TFTLCD 模块,其驱动芯片有很多种类型,比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510/SSD1963 等,这里我们仅以 ILI9341 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。
3 I2 w6 J  N# t9 [9 S" n
, K0 |/ Z+ l# p5 h! x+ GILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:
) s: s8 z0 m6 z- r$ `+ D9 }$ }6 |# k9 j4 E' S0 T1 e
20200907113818869.png
% m) w8 w& d) w
* B* L1 I$ z% ^- S; s  r* D从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。
4 Z# K/ W% y0 ^. a+ e
* E& J% d5 w8 l% u这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。% ]; ?5 h6 H+ H! s$ R" g

8 \4 D" B+ B$ O% a05. ILI9341命令; B! D, J! A. L6 x! ~' S$ Z
ILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。
: a6 A7 Z: B% v! }. ~- s, I: V) n7 Z7 D" `8 P
读 ID4 指令
0 {1 G3 k4 Y2 b. a! g; h) U3 l+ V3 u" h; E% T, U0 U
0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:3 @2 c) D; m/ t0 n7 C
0 X- i/ A0 u2 ], z% Y' z" W# r
UVPO~PIO98X4S3_QL5{${JC.png 5 \7 V# P* [$ w5 L) w5 `0 o% W( k$ Y
6 E+ S1 j6 C1 A) P( t+ Q
0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。
* s/ ]4 @1 ]% m9 ]$ x! ?$ W, f/ C, U9 i9 Z' q1 c! N
存储访问控制指令
2 e6 Q/ [5 b- g1 z! Z0 `5 @

. U1 ~+ Y1 x; U# B7 h- y2 d0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
2 M2 b% G1 k( Q$ ]: R* ?7 O1 D! K0 }; ~! [! r- A" A* J$ X- j
20200907113840494.png
" ~5 G* q% n) h. L) D5 n0 q4 S
% a& q3 A7 D1 v1 c6 Z; e' m  C从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:
, h' J& i7 V) f
. R: d. B& s8 G/ a. K) m2 G 3351S(8L6OLPHWHC%%8$A1O.png * Q  t# i. s; b6 N2 S6 Z

! q1 h$ ^8 N1 A" F这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。
* r9 ^# |8 O2 y7 q8 \. e. t" }8 _( K, z# u0 r# f
列地址设置指令
  M. ]6 s0 G) `8 E5 F+ W+ v- V8 ?, n, I
0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
3 N1 y5 c( o4 U6 b7 {
1 q, p  q5 @. ` 5SS}1]T)}K$%VR_FJ_[0)16.png
7 \* P2 P9 \6 {" e( u7 W
0 V7 u# I' h! L( Z9 c1 [/ \7 ~在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。
+ c4 @7 {6 T- }  g* n; q6 A3 B* ~; s. X, {; T8 J
页地址设置指令  |" Z, }( h! }5 B0 L- U/ Z' W

- J0 O& e9 e9 Z0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:
' r7 o7 t$ N9 h5 z2 B8 K& O! c3 N5 k4 [, P8 D8 p8 Q8 b
H03IR1117DD9`(32D]3P_X3.png
8 b- E0 [4 G: x' n' [7 O& q+ K! e! \, U1 I+ R& i# n
在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。! g) M' z$ M- v( d, a
! p9 O0 @& Y1 _1 S8 O' S
写 GRAM 指令
$ b7 I3 E$ h. R  {
' D3 X3 L8 V0 B0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:
# g- e, t1 k, u3 \5 G/ C9 Q0 Z6 U/ z
20200907113919790.png ' B# \5 g4 b! }

2 Q3 a) l! M3 w% [3 X在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。5 n% V9 B, w$ Z1 i# {8 G( S9 V

; Q- o! @: B- ]( \6 P$ w! X读 GRAM 指令
/ Y- }6 E! a& G& o9 m; B; P, K5 d5 U+ u- h- a+ q& r
0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:
# U8 w1 W, J0 y. |9 f. S  ~) J$ ]5 i4 y4 r$ G( f
`VC3KFV4$SK$HYPIPQQF%P8.png
+ }% h" Z( \# }( a5 B& ~6 V& J' c1 K1 B
该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。
: F7 ~6 K$ R# Z8 N& y# \: h3 {. a% L5 s1 c+ I
06. TFTLCD使用流程0 ]- d" g( A1 h! N5 {
8 ~# u; M9 k. p+ Y4 R
F08PDQKBY1BS3@]K`RHV{JH.png
& s2 A& j8 O! u- ^3 X: d
9 p' c, j- X( I4 ?, \任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。
/ {+ k) b2 e! s) |: o" @- I6 x( D2 c
" I4 x9 b3 I, C% y
赞 收藏 评论0 发布时间:2022-6-14 13:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版