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

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

[复制链接]
STMCU小助手 发布时间:2022-3-29 10:05
01. TFTLCD简介  }% H9 Q( a' k! [: a
TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。; I# n' @" L; G; a2 X7 O
: B' L: e7 U/ k; U1 i
该模块有如下特点:( R' Z' u2 m+ e$ [; t$ g- O; `) Q
1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。9 Q0 B7 q4 E" F. U* Z9 x7 d; y
2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。
+ c* @: {- O9 `4 [9 v* _  ^3,16 位真彩显示。
8 y" @. d  D; D- x8 t; j( V4,自带触摸屏,可以用来作为控制输入。
4 F" n; p9 k* e- P8 T7 ?2 a
! M& s5 x8 u* Q02. TFTLCD原理图" B+ L4 q! R, N9 Q5 O
我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。7 f: B* X: l" B1 N: m8 H0 ^

! I7 K3 Y, L+ v. z3 j HF)JNYAF_I8WZ`E0OHG$Y2C.png
" d0 q1 e1 L, q) ]+ K' v& o
3 g/ m2 h# [4 |) ]# ~" V9 k! l$ C模块原理图
4 X& a4 k; q) m5 n  J( _# Y
5 m! ]( H* W: O# d  }+ f: X
2FZ50[C}R_I]{CY3N0C{KF1.png
* S6 j  s. K! P( w8 q% f! C( V6 _( O+ b. l. N
03. TFTLCD接口描述) n3 _& W5 ^, A& u/ Y! ~4 C8 _
TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:% y. }2 T* |, n  l, q. e: V

+ g1 V0 y: V0 |1 p, Z AS%[T4[V1}`D8U(H63{3T}C.png
. i: o) M0 [- K2 |" S- k* u* S' R6 u# M5 r$ L! `
ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。0 ^' u4 j  g" g2 O- g

; K7 z" J: i& q* ^该模块的 80 并口有如下一些信号线:
7 P% \) M! H2 c; P/ B  K
2 b4 g6 G+ K9 |7 v9 f/ ZCS:TFTLCD 片选信号。
8 H9 h) S/ m4 W4 h: U& X% G4 M
! F! Y4 j7 v  iWR:向 TFTLCD 写入数据。2 D8 ]' n$ y, ^. _" [) v

0 b# o( q4 L2 q: a- e  C8 cRD:从 TFTLCD 读取数据。
* D' a) q) a  z) N/ N) k; X9 ]
. I/ o8 X. _6 T) u4 eD[15:0]:16 位双向数据线。6 A6 I4 \+ M0 L0 J. [
% g( N& W6 L: q; O( d
RST:硬复位 TFTLCD。1 a- T* [' _) s: l) K! V

" Z4 R) x$ Q$ ~  ^RS:命令/数据标志(0,读写命令;1,读写数据)。
/ O' g2 z& A: y* N6 c. G/ |
3 a, E, V' n7 J8 I1 P4 r2 ^$ U04. TFTLCD驱动芯片3 @: O' v1 V4 G5 t
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 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。
0 y  Z/ Y: Y  Q: Y8 d$ ~8 k' g% y& P# U9 H  z- f/ a6 h  b
ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:$ Y# }) {5 y8 |/ I. e7 i  t

1 |  h1 F2 O8 v7 m$ t' X. C% h* Y 20200907113818869.png
4 P2 ~  l" H4 Z9 \+ H! g  N& `, X) C) v9 f4 }# W
从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。
# Q% `; Q( ^6 q6 Z1 d0 o6 [4 L; o, N. \; E
这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。
# j; D5 T9 C0 D1 O. O7 F1 X/ M- y1 I2 X" f7 E
05. ILI9341命令
- }, e$ A' F( {7 [: W$ ?ILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。
" V$ B/ S8 T0 C" }" {# A; @  X4 S0 a% G! Z
读 ID4 指令7 U: p/ C1 |# v+ n2 ^
0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:& Z' w) b9 n! q% h- D0 `  |$ J/ G$ R8 i

: N2 {2 ?( H; N5 y0 ] P@17}V]V_WHVW6FIHDVWLRO.png
9 p( h/ R- d) y( X# n, |
$ W, h5 r: q9 d0 ^( b. W0 c0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。
2 o* z8 J; C$ Z8 c( K9 V8 R' Z  U  G8 n' w
存储访问控制指令
: _) _8 a: @+ f1 s7 m6 e
+ _! S1 g. Q$ f0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
5 F- O+ O5 T2 Y7 z2 Y4 D# t0 |; i  C3 y5 [- I
20200907113840494.png
. r& N/ E- l! y+ W0 [
) B% b5 R+ Y# V; H+ U$ D. Y# y5 g, k从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:! t& C# g3 U: Q& s; u8 A- ]5 H

1 [) G  W" f# l, k 0_%X}VI8BL[4]E9_XJ2GSXA.png 2 Q4 O* ^& F0 x, H# v

# D) u+ \7 m: o1 d! Q3 W# a7 b这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。9 J; J- L* _& c
5 M8 J* e+ Q) l% G" I! z$ z
列地址设置指令
! K# j: C' A9 o* E  D% [/ `$ }! |0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
) p+ V0 Z: @! y; g' `1 e, m; a: B$ @4 Q6 m3 h8 j
ZI)KS3[{RS2P9(@I3$$PMS2.png # v' h/ L7 q6 K5 i, L- ]/ R4 {

+ v6 J8 f' j" |. ?# M( `在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。% P) `) X% V: d) ?
0 E$ \. u6 S9 B
页地址设置指令9 T: s" x3 H- _2 R( `) D" \
! H) B7 ^. E0 s9 ?- h
0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:5 H' ]) a* p& e6 ~- z% F

8 u$ N$ Y: \7 B6 _" y : j6 E7 E& i4 B

! h0 u4 M0 _3 D8 N在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。4 |; X' }4 W( d6 d$ i4 Q# c
' W- M9 ~. T& ]( @9 x3 s
写 GRAM 指令2 Z6 r% F# o6 b" H: l

' Y0 r! Y, A* w4 j+ ^0 b0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:2 ~$ x9 I9 g7 {# M% a$ c3 E+ @( J- z

- `* [' ]# s0 L! m. @1 J 20200907113919790.png
9 w" x4 N  q7 r3 }0 P+ Y. r! T; T* P' Y1 E
在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。7 K  c8 d0 ^2 S% g3 ?
, E7 e2 c6 J) Z2 z
读 GRAM 指令! U1 O' p* R8 b, U6 u) }
0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:
3 T# ?+ R, ]* R' p( u! Q
' V# X7 M4 I2 }7 h 2CMYL2Y1Z~FYAOSJ}{)NQ)C.png
0 y1 w' [! e% K7 K. }2 U
, T/ m7 a* v# ?* N该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。
- j+ U5 Q8 |- H2 e) \/ {) u* G# x4 f! y2 a; I' G
06. TFTLCD使用流程
7 r/ ^2 S; ^6 g6 y. L' v
7 ~0 Q, l2 M# m; o% i: ~4 V 775`$`C87{XIMQ7FZ_(T3AY.png / R' J: M' x) y/ ~  I' _5 z
% [" t0 |, N8 Y$ ~1 W# }1 e
任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。! g0 g2 ^( r) U' ]! g+ I! B$ N# m

8 J- d' W' z) l/ e4 h6 q
; ]# @7 `5 s7 O6 T) W0 }+ k+ d
赞 收藏 评论0 发布时间:2022-3-29 10:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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