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

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

[复制链接]
STMCU小助手 发布时间:2022-6-14 13:39
01. TFTLCD简介
) @( B9 Z6 [: f$ M; j, gTFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。
5 ^5 v1 C  ?0 L1 g' p) u6 f* t0 F' z. V: f
该模块有如下特点:* K7 w+ h( B* @- J, E% s8 r3 a
1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。' |9 s$ t" V3 F! z6 O( s0 W* i
2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。+ Z- q% n; K( j2 A  h
3,16 位真彩显示。
4 n8 _$ Q$ R4 F" o% _1 A4,自带触摸屏,可以用来作为控制输入。
6 |  B; ?7 O5 e4 B9 X0 @9 D! m7 \5 k
02. TFTLCD原理图
' x, i$ T$ h. L7 q! X我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。
8 [6 \2 \+ `$ ~2 |. U1 k1 R! d2 w" b+ M* n2 ]  A; y
L0L01FU~NM3_T{RON7R{~FL.png
# \9 _& J# v+ p7 Y  \! k& X/ ?
( r$ [3 I( D6 P( h2 A. f模块原理图: l! H+ ~: o8 d, ]4 L% I) y( T
) j1 S2 }1 X1 \
A]4GE3T)E)H6@MW}HI[729T.png
& _$ M  |# T  j; u
: l5 T' G, f. O; l9 s03. TFTLCD接口描述
8 Q2 N% S1 |% R% W' _TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:( m8 [* q. T( b7 C7 G. u

( e. O( _8 i% x1 R' {! B %O{6LR4E%$EU1M2~~K~3OXE.png
& w3 V" W$ @8 R7 ?7 l& C
8 M% o6 e; N. q9 t: x+ W( b4 ^ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。8 w) ]6 a1 |8 s; g( w& {
. K+ c+ u6 A! K+ h' V9 V
该模块的 80 并口有如下一些信号线:+ E3 ?. b; I& y' Q( u* p

$ f. b! ~* k& R/ t$ T1 q" a. N; tCS:TFTLCD 片选信号。, ^9 |; [& H1 N6 \% \

9 |+ ~2 h+ E3 U0 }* C& UWR:向 TFTLCD 写入数据。8 C" C0 q+ X* p1 V7 v

) @) d6 T9 j! @' P/ T2 ~& D7 @RD:从 TFTLCD 读取数据。% D" a2 @+ h+ o# W- P5 K: |

: Y5 `1 r3 x) ?* u% nD[15:0]:16 位双向数据线。
+ j' m, D' W4 F5 I( g" `3 {: V& \: K8 B8 I( y/ d' `
RST:硬复位 TFTLCD。
" a0 `; H8 W! m" ]" R! @) z
* S8 g2 Y! O! hRS:命令/数据标志(0,读写命令;1,读写数据)。
* J# }% H$ Z0 ~9 h0 }: g  H: w
- F) N0 e4 e, b3 N- D04. TFTLCD驱动芯片# J$ ^" [) b2 n
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 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。
& j  t0 V# C# R9 y  v1 p! x. I5 A: l: s& F, o9 K2 L- ?2 Y2 H) ^3 H
ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:
8 O& x) z9 f- {7 o; u! p7 u
3 d& a+ m8 d) | 20200907113818869.png , \/ }6 ^4 q+ j$ z. y
' U2 n1 y* f! G# b7 i( e# U0 d
从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。
$ @: B* }8 C$ ]& m9 d" L. ^5 t+ T: A: C+ G9 U( O% M6 x6 ]
这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。
7 E/ J( V6 A2 ?' n% U
) O5 e7 Z3 A) O0 C2 B1 W$ j: c05. ILI9341命令- |9 ^* N$ W$ G" R  Q! n
ILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。+ F% P" R4 B, }8 J

- ~7 T/ I' Y9 l: z读 ID4 指令
/ z6 g& A& X$ g7 y& W) f/ m! {2 u& G! ]- H9 E  f6 e5 ^5 W5 S
0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:
2 I' b# w1 |% K! I+ T4 F  @7 |5 i6 f, ^; s! d& k
UVPO~PIO98X4S3_QL5{${JC.png / M; F  h- a3 y0 P: ^6 ^
' K3 I$ ^' U, j$ ]  _4 T. g0 N
0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。
; W& _1 ~  ]" J0 s4 L0 W1 |' `2 c2 k2 N4 v* N" L: F3 P% n1 x
存储访问控制指令
: z- }8 f+ \% p
+ V- T3 S6 v& P* D
0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
9 w2 w1 p% H$ B4 {7 F3 r1 \  ~& J, l7 Q9 W& _
20200907113840494.png
+ R, ]/ o8 w0 |/ b. M! }- y7 e, i+ z9 y3 o. i3 a
从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:
& o! {" d  l3 R4 Y- E! k: b0 e, d7 _
3351S(8L6OLPHWHC%%8$A1O.png
0 j1 H+ U5 h: f" W( U, U; ~+ t. }6 ~9 W  I
这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。
3 _/ T+ @$ F/ V# G. k! N% J" a1 L( @, C0 x4 s8 w  N' T1 r1 W
列地址设置指令3 i" |, E' b6 |  |  ~1 ^" J
# a' T  T5 z8 I& G
0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
9 D$ B" u' _! v: f( s( z& J0 E. \! g- |" V+ g
5SS}1]T)}K$%VR_FJ_[0)16.png 7 l1 g  J5 _# d+ k' P& l

! `( H- v8 K9 c- O" Y+ b在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。. s$ V4 p: ~  }5 ]: H

7 G5 T' }) s8 U. ~7 T( W页地址设置指令
- d6 T! t0 ^7 W6 \- _; S6 j0 [
! X! H+ ]9 ?- k, A" [- n7 _0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:
, x. T7 ?8 u" |) d
- I9 e3 Z7 p! X H03IR1117DD9`(32D]3P_X3.png
. R$ r* {" c( a% Y( C+ A
8 ~1 T; V6 j, d" X+ _在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。
- @4 A/ s5 w) T, v+ H
6 T- v* M: O( C! R写 GRAM 指令
) x& u& Z& c9 R9 `) g' l
7 y8 U! \) M8 j! X: W& l0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:" `2 x/ y8 d0 n$ y1 @  ^6 A

% a' K$ B  X7 O5 |& I: g 20200907113919790.png
  k3 g) w* [. p, r* x0 F, p' r) p' o
, M2 z/ n2 }. Y1 ?: Z在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。$ f) c. A+ K6 O' H
# s$ R9 e7 b* U7 N& o; }
读 GRAM 指令; b" j. ]7 U6 |2 ^. @( S% A. H; W* F
3 D6 @$ c+ O& `+ l2 f7 n
0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:; ~% `0 f, u+ M' k# ~

7 v: A8 @: Q$ f, g3 S3 J  C `VC3KFV4$SK$HYPIPQQF%P8.png 3 `+ k0 M: z' }* W% `6 U

2 V4 }* ?( v0 |1 d: Q该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。
5 Z2 `) {. U+ f/ G$ ?8 W: [5 R& u3 `! I- ?3 i
06. TFTLCD使用流程
# e- b, e! e: C! b: L" M" N5 `6 F9 s9 A  ~7 [$ ^: \
F08PDQKBY1BS3@]K`RHV{JH.png
4 f" u3 T6 v) I7 E# D4 g' T
3 H& `5 M. t3 a3 ?+ Q1 ^; |$ i. `: {任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。
8 }* A+ c3 y7 @0 j+ n
+ ?. B  N/ [% j8 P
) `# b; V( ^1 I, Y3 U/ `
收藏 评论0 发布时间:2022-6-14 13:39

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版