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

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

[复制链接]
STMCU小助手 发布时间:2022-6-14 13:39
01. TFTLCD简介$ p8 s! }, `" b. S% G! K
TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。2 R2 X$ o. t# q6 x% X9 ]5 Q3 ]
$ w* f! ~# W2 Z  r
该模块有如下特点:6 c( n2 q8 o' J9 V7 X' s. P
1,2.4’/2.8’/3.5’/4.3’/7’ 5 种大小的屏幕可选。; `  R4 U, N7 Z# }0 N! _
2,320×240 的分辨率(3.5’分辨率为:320480,4.3’和 7’分辨率为:800480)。  X) R" _! m- ^2 q1 ^% e
3,16 位真彩显示。
, P  ~0 M- s$ ?7 u6 O8 ?9 A4,自带触摸屏,可以用来作为控制输入。7 q3 N# D, R5 ~) p

- t3 v0 W) j4 @7 a02. TFTLCD原理图
& v$ n% ^$ r3 g我们以 2.8 寸的 ALIENTEK TFTLCD 模块为例介绍,该模块支持 65K 色显示,显示分辨率为 320×240,接口为16位的 80并口,自带触摸屏。3 I( Z" O: `! B0 t! `9 i& K1 c. _
% d) N1 ^" Y1 w( @' ?& Z
L0L01FU~NM3_T{RON7R{~FL.png
5 u3 |" P. O) o" t
+ h& h1 {: `5 k; e: E: A- y( \0 q模块原理图6 z2 c+ |. a2 A! _/ f; [

* B( u3 D6 _6 x! w: X A]4GE3T)E)H6@MW}HI[729T.png / k. z/ w+ h. x; i

' T7 e- w3 P7 M) q. A! b03. TFTLCD接口描述( e! K5 s0 s1 i. A8 t
TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接,接口定义如图所示:$ w2 o9 @6 ]1 X8 A3 H; i1 O9 A8 m
1 C3 n- c( T; i. J# @% d
%O{6LR4E%$EU1M2~~K~3OXE.png 6 Z4 i% C3 k- w/ L) Z3 h
# j3 m# _8 [% C$ l  |. K7 P2 e3 t
ALIENTEK TFTLCD 模块采用 16 位的并方式与外部连接,之所以不采用 8 位的方式,是因为彩屏的数据量比较大,尤其在显示图片的时候,如果用 8 位数据线,就会比 16 位方式慢一倍以上,我们当然希望速度越快越好,所以我们选择 16 位的接口。
1 t. l7 ~: x6 y% _/ b$ O5 Z$ {! Y- K3 `2 G
该模块的 80 并口有如下一些信号线:" C$ q3 p. y  J4 n* m; ^- q
) ~! t" C2 K% L: t! W
CS:TFTLCD 片选信号。
! c! _; k7 o6 W8 b- V" M6 D
, P' h8 w. f0 R. j" J, x+ k* aWR:向 TFTLCD 写入数据。$ l- o. K6 J  f4 P0 E2 M
8 O& T3 \& j8 j* s, d0 n2 T4 d' c
RD:从 TFTLCD 读取数据。3 Y) u( E% g- S% Z: }# n$ v! u
; Y$ k8 X" q  e0 V; T) x' E
D[15:0]:16 位双向数据线。
; I5 }' P6 s( }0 f" a
* h! m' [: u0 N+ r( z  v3 g6 URST:硬复位 TFTLCD。
3 O; c6 |; O  d- a" ?
5 Y0 [$ [# a' q3 ]& x) jRS:命令/数据标志(0,读写命令;1,读写数据)。
. v: N. j$ {( [, I
3 X8 g3 j: g( V+ O9 |0 z04. TFTLCD驱动芯片
4 I2 J  P5 C6 ?8 c' f7 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 控制器为例进行介绍,其他的控制基本都类似,我们就不详细阐述了。9 z4 H/ m& @1 V& g6 b, Q; J4 U
' h) z9 u. N  [) h4 T
ILI9341 液晶控制器自带显存,其显存总大小为 172800(24032018/8),即 18 位模式(26万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图所示:. j+ x( \5 S- Z2 a; U. [( p
& F) g& c( x  T
20200907113818869.png
9 T6 J( i( _# C6 U3 g: Y( h+ G- ]" m: c/ |/ {
从图中可以看出,ILI9341 在 16 位模式下面,数据线有用的是:D17~D13 和 D11~D1,D0和 D12 没有用到,实际上在我们 LCD 模块里面,ILI9341 的 D0 和 D12 压根就没有引出来,这样,ILI9341 的 D17~D13 和 D11~D1 对应 MCU 的 D15~D0。
3 U) j9 M9 O# K) a, E' l" X
. n5 r  h; k6 q  f3 `% E' R这样 MCU 的 16 位数据,最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。数值越大,表示该颜色越深。另外,特别注意 ILI9341 所有的指令都是 8 位的(高 8 位无效),且参数除了读写 GRAM 的时候是 16 位,其他操作参数,都是 8 位的,这个和 ILI9320 等驱动器不一样,必须加以注意。
& u- R; C$ n* }* m" u/ z( d  W9 |3 d" K+ x  `0 }% c2 @# d
05. ILI9341命令
& w* Q+ j* a- iILI9341 几个重要命令,因为 ILI9341 的命令很多,我们这里就不全部介绍了,有兴趣的大家可以找到 ILI9341 的 datasheet 看看。里面对这些命令有详细的介绍。我们将介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 条指令。
9 R9 Z8 Y% e. k' I* g0 `# B5 r0 ?; h
读 ID4 指令
% b1 m# P$ p! F* e6 z; v' E# G8 Q( C. L, l, @7 `
0XD3,这个是读 ID4 指令,用于读取 LCD 控制器的 ID,该指令如表所示:
8 r- Z6 Q5 j# j& i
2 U  C6 B! g! a UVPO~PIO98X4S3_QL5{${JC.png 8 F) @' |" F7 U4 f9 @5 y0 G* U

% j/ e1 A7 a* n$ `) a) |) ?* [0XD3 指令后面跟了 4 个参数,最后 2 个参数,读出来是 0X93 和 0X41,刚好是我们控制器 ILI9341 的数字部分,从而,通过该指令,即可判别所用的 LCD 驱动器是什么型号,这样,我们的代码,就可以根据控制器的型号去执行对应驱动 IC 的初始化代码,从而兼容不同驱动 IC 的屏,使得一个代码支持多款 LCD。' r- F3 p# I6 G, ~# H1 S2 w
  o% C+ ]$ \! ?! x6 K: Y, E- j) T6 C
存储访问控制指令
- L4 Z7 U9 O5 t! S/ [% i2 w# d

) _" m$ r) I/ S* G: T0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)。该指令如表所示:
4 d% F1 ~. @4 `  X0 g% W, R5 J, m: r: e" Q& K
20200907113840494.png
- b) q0 Y9 R/ Z+ \( |3 S: g$ \! V1 \' a- b  H
从上表可以看出,0X36 指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以控制整个 ILI9341 的全部扫描方向,如表所示:' t  }6 ?; d8 _$ @& Y% N3 R6 W5 y' @

2 ^* e' e1 e$ @7 d, y2 m 3351S(8L6OLPHWHC%%8$A1O.png
. j( G/ P$ R# Q' ]& R0 m' x9 |& \1 f. H0 v* u
这样,我们在利用 ILI9341 显示内容的时候,就有很大灵活性了,比如显示 BMP 图片,BMP 解码数据,就是从图片的左下角开始,慢慢显示到右上角,如果设置 LCD 扫描方向为从左到右,从下到上,那么我们只需要设置一次坐标,然后就不停的往 LCD 填充颜色数据即可,这样可以大大提高显示速度。
$ g$ D9 l* A3 ]5 W3 x. N/ W# `( b+ y: r$ [7 m
列地址设置指令1 X. F( k+ d4 |+ f" R! @

# F  v# F; J+ W) k3 j* n+ M* ~0X2A,这是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置横坐标(x 坐标),该指令如表 所示:
3 U* O( I. Y+ ^: E( ]) R% \. |* m% T% a
5SS}1]T)}K$%VR_FJ_[0)16.png
5 Q! ?$ I, M0 P. A
3 t8 r& q$ F' W& E# i9 s在默认扫描方式时,该指令用于设置 x 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SC 和 EC,即列地址的起始值和结束值,SC 必须小于等于 EC,且 0≤SC/EC≤239。一般在设置 x 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SC 即可,因为如果 EC 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。
% m. d1 A% R) n9 A& V3 O# g0 f# M) e/ [2 w
页地址设置指令- L4 E# V+ g  H' @

0 I2 Q* z6 L6 P; F) m0X2B,是页地址设置指令,在从左到右,从上到下的扫描方式(默认)下面,该指令用于设置纵坐标(y 坐标)。该指令如表 所示:
) y  r3 B+ S! M: Z* g6 ]/ |7 J" u8 o& K3 P$ p8 L+ {% V
H03IR1117DD9`(32D]3P_X3.png
" ]  {/ z+ i% h
- s9 L1 n4 p8 K" C1 ?在默认扫描方式时,该指令用于设置 y 坐标,该指令带有 4 个参数,实际上是 2 个坐标值:SP 和 EP,即页地址的起始值和结束值,SP 必须小于等于 EP,且 0≤SP/EP≤319。一般在设置y 坐标的时候,我们只需要带 2 个参数即可,也就是设置 SP 即可,因为如果 EP 没有变化,我们只需要设置一次即可(在初始化 ILI9341 的时候设置),从而提高速度。
1 g* N' R7 I- u7 H5 l
2 e2 }  R) C6 Y4 h: l0 v' k写 GRAM 指令
' X7 l/ e% U" R% i% @3 M8 t3 q9 |  @' ~4 J4 W- i
0X2C,该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD的 GRAM 里面写入颜色数据了,该指令支持连续写,指令描述如表所示:: L2 |2 Y' ]3 l' }$ _

0 ]1 V( A7 \. i: m8 R/ a 20200907113919790.png
3 t/ d8 W7 i* ~9 c- J; ^, i, j  }( `! |' A6 n; t1 }
在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCDGRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。2 ]" z) S! h! [6 a! J

3 f- }& v% u1 o/ {6 @0 D读 GRAM 指令* v. G/ }( Z  \: d: Z, Y* R9 g5 z
4 I& F5 P2 `% a! M5 y4 J
0X2E,该指令是读 GRAM 指令,用于读取 ILI9341 的显存(GRAM),该指令在 ILI9341 的数据手册上面的描述是有误的,真实的输出情况如表所示:! q* H- g$ Y0 Y! ~+ X

; d9 f& K9 F! V; v) t, y `VC3KFV4$SK$HYPIPQQF%P8.png , O+ L3 g3 u" `+ n, T$ k8 k  }

7 \2 k. a  R6 o% ]# e5 Y1 j该指令用于读取 GRAM,如表所示,ILI9341 在收到该指令后,第一次输出的是dummy 数据,也就是无效的数据,第二次开始,读取到的才是有效的 GRAM 数据(从坐标:SC,SP 开始),输出规律为:每个颜色分量占 8 个位,一次输出 2 个颜色分量。比如:第一次输出是 R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5… 以此类推。如果我们只需要读取一个点的颜色值,那么只需要接收到参数 3 即可,如果要连续读取(利用 GRAM地址自增,方法同上),那么就按照上述规律去接收颜色数据。
' u- w: W" l: C% @& C. J
7 g, e9 i" ]1 Q& O06. TFTLCD使用流程
  y" V8 G' F* y) U3 N8 _$ I* o! S! h- [6 Q5 n8 I5 r
F08PDQKBY1BS3@]K`RHV{JH.png 8 q* _& {( d0 K8 d' i/ G# w
, p. @" _* `( Q, `0 v
任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。
$ F) m( H, ]. o4 T; s! R9 f8 N% T7 Q1 U8 [) n' Q1 P1 K9 d. e

. A2 e2 X+ d! m: J( R* C6 b# j% I
收藏 评论0 发布时间:2022-6-14 13:39

举报

0个回答

所属标签

相似分享

官网相关资源

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