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

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

[复制链接]
STMCU小助手 发布时间:2022-3-29 10:05
01. TFTLCD简介
, b2 Q9 f5 m% d0 g: |; fTFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。5 _: _, y" {( M2 |
  Z, m/ ?+ ~- t, j- A5 H8 j$ ]$ r
该模块有如下特点:
9 q1 b0 P" P9 \9 W& e7 @1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。; p( h* F3 Z( j
2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。" `, y, Z0 B; \% _3 p  ?
3,16 位真彩显示。
! q( \! L/ n. f0 }* R2 f4,自带触摸屏,可以用来作为控制输入。
$ y/ z* C" c+ u. a" S9 t0 r
% A, e0 n! P+ j' A02. TFTLCD原理图
( J6 e+ G  F+ m. z我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。& C9 ^/ P) c& _3 S( |
/ D5 u! ?& }) [/ M& @# N
HF)JNYAF_I8WZ`E0OHG$Y2C.png
' E8 ?& e) Z* L/ V. b2 O! B6 I. }8 i9 L  W
模块原理图
3 J; q) N+ T' `: M% ^* I+ o

" T6 O2 I7 X0 N$ x: f; T 2FZ50[C}R_I]{CY3N0C{KF1.png
6 D5 j9 C0 E7 h' X" v7 m4 \) Y! m+ f8 p) B5 d9 m- u
03. TFTLCD接口描述3 k* U7 {) ?- W2 G' T1 d
TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:
% F' }! R$ o& Y; _" v7 b, D0 A9 o# b: V2 }3 h3 B; @# F
AS%[T4[V1}`D8U(H63{3T}C.png 0 g9 g5 }3 ?" V

% j1 Q. E. x6 L7 m! N7 y# y* ~* hALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。
# `5 H( G0 u: K' d0 H3 Z. j
, a: f/ v# V0 x; S' V该模块的 80 并口有如下一些信号线:
; m: Q: i! w$ o+ [& L- c8 E) J- }0 ~# K# l' l
CS:TFTLCD 片选信号。
7 q3 v2 |. g3 V; U3 G+ n: {0 m# P$ s" B0 b# `8 _& j
WR:向 TFTLCD 写入数据。7 T! F/ v' _& @

' T% d( f  a9 s2 j3 V1 y: tRD:从 TFTLCD 读取数据。5 r2 t$ `; H. H) @) d

8 |% P9 {' |4 ]' i' ]D[15:0]:16 位双向数据线。
- c5 M  c( {9 c( ^: l: G9 O
8 Z5 `9 d; R5 b  Z- gRST:硬复位 TFTLCD。. X! Z' z$ j+ H  o3 |

: o8 p/ \, S5 w' {6 V3 [( LRS:命令/数据标志(0,读写命令;1,读写数据)。
' @' H: U: \) x% G# ~
/ B$ I, w2 R4 Y8 I04. TFTLCD驱动芯片
6 m+ S" r* S8 }8 D2 R+ OALIENTEK 提供 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 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。
7 a# [, ?8 j. ^9 Y; ~- f* U$ R3 z$ g- B
ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:# Y, P) p+ n# @0 J( M% P
( F0 f' G. H4 W" U; p
20200907113818869.png
. @* r6 u4 Q% v5 L$ m0 a. P' U, G7 {! S) z
从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。. v+ Q8 f( a& B* l5 J

4 C5 z: V( `! T9 \这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。
, k- _1 g5 y9 A2 ]" u7 h0 R2 \) {' p+ Q7 ?# G' `0 q
05. ILI9341命令
; p2 u. T0 p% O1 T6 HILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。
" j, a& x+ z' F+ c4 Y/ k
. j+ r/ d' J, y/ I8 S8 b4 K& ~读 ID4 指令
$ k$ w1 q  {: @! J0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:
3 Y- I) M7 ^  W& D, b# @7 \6 w; _7 s( D5 O! q
P@17}V]V_WHVW6FIHDVWLRO.png
$ }# g7 _5 i0 R* V# j7 F( G# K- x- v: Y2 e4 T+ t
0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。/ U- P( h$ T4 g& O* R
( ~: c+ s  W6 A* i  l, R1 H
存储访问控制指令1 t, x# }" I( s4 R/ ?' r
  X' ^/ e* Y: Q1 i; X0 O  O) R
0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
: E0 T- w) x% h  w
: V4 r) C' y3 Z0 f 20200907113840494.png
8 h6 F- q  a: _7 i/ G6 B% @+ J& _- d  W
从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:
, B! [: ?6 J/ x& s! o* C# H
! C- C' ~7 F& `0 V  u 0_%X}VI8BL[4]E9_XJ2GSXA.png 1 B+ }! p8 d+ a3 R

% ?$ W  m9 P2 F+ e这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。. S" E' O8 f" H* u6 p7 n2 i
$ |; |% M3 ~, }9 j7 F# g& G
列地址设置指令
+ K/ z( v1 q4 l% P0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
' E% {, M" Y6 S7 \- I  f
9 u: ]2 ~2 K6 S! i ZI)KS3[{RS2P9(@I3$$PMS2.png
$ X8 ~) k6 Y" [: ~& e, u5 q) A5 z* X& u
在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。4 E( I! m" {5 v3 `8 w- V

3 h/ `; P9 n0 X1 d& x页地址设置指令
3 g$ w) K4 b, c7 Q  \3 I, o; j$ J7 w! f9 I# i
0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:
1 i. s* z  p/ B2 V9 C
( b* x* |1 @) U  | 9 P1 f% `2 L, E3 D6 [
9 o7 R% f3 i1 B
在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。$ d0 k8 c( }' `; T% Q" R1 S; F

$ @5 k5 x, N* p) h0 o* k0 F写 GRAM 指令
: F) _& }0 l/ M* w3 _1 f8 E. y! l- d
0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:* ~) n2 |- s8 ]- T3 a4 a0 ~
" g. [' r; h9 H$ M1 ]; l4 M2 ~$ `9 Y# u
20200907113919790.png - D" I# l9 ^% v/ X. m
& d6 ^7 O' u& p5 F9 I7 q
在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。) B/ T3 ?1 B9 F3 ?

" m5 c5 X/ [. o+ d( f读 GRAM 指令7 H& C* |# v+ n; Y6 ^6 _( f6 d
0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:/ A, r6 y7 P! z1 [' _& Y

" ^5 \" T2 _% N7 F' J) | 2CMYL2Y1Z~FYAOSJ}{)NQ)C.png 8 c9 G. @6 y, L
+ J% J+ d  y  d- z8 Q
该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。
, Y0 A! N: _* ]8 e! b- D( n4 V  b2 I0 K" |
06. TFTLCD使用流程7 i" ]4 d) `  i/ V1 K* M
) f! e- x( Q- T' D3 S' R8 F* _" P& g6 L
775`$`C87{XIMQ7FZ_(T3AY.png 7 q/ \0 F" {3 w

! f$ Z7 a! q; J7 w6 L/ S任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。
) d  ~, T2 H* v2 ?4 [  N& P( D) B5 G  m8 P' x+ T# g
, {8 i; j$ i1 I; Q
收藏 评论0 发布时间:2022-3-29 10:05

举报

0个回答

所属标签

相似分享

官网相关资源

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