以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
参考博客
1、s5pv210 LCD编程原理 - biaohc - 博客园
2、LCD常用接口原理_5组信号线是几位-CSDN博客
一、LCD简介
1、LCD是什么?
LCD(Liquid Crystal Display)俗称液晶显示。
液晶是一种材料,这种材料具有一种特点,在电信号的驱动下液晶分子进行旋转,而旋转时会影响透光性,因此我们可以在整个液晶面板后面用白光照(称为背光),可以通过不同电信号让液晶分子进行选择性的透光,此时在液晶面板前面就可以看到各种各样的颜色(白光由各种不同颜色的光组成,被选择性透光之后可以产生各种不同颜色的光),这就是LCD显示。
有些显示器本身会发光,称为主动发光,比如LED显示器;有些显示器本身不会发光而只会透光,需要背光的协助才能看起来是发光的,称为被动发光,比如LCD。
液晶多应用于电视机、电脑显示屏、手机显示屏、工业显示屏等领域。
2、有哪些显示设备?
显示设备 | 描述 |
CRT | 阴极摄像管显示器 |
等离子显示 | 未成为主流 |
OLED | 未成为主流,但是很有市场潜力 |
LED | 主要用在户外大屏幕 |
LCD | 主流显示器 |
3、有哪些种类的LCD?
种类 | 描述 |
TN | 出现最早,但响应性不够好,有拖尾现象 |
STN | 是TN的升级版,有效解决拖尾现象,显示更清晰 |
TFT | 最大特点就是超薄 |
…… | …… |
二、LCD的接口技术
1、LCD的硬件接口采用TTL电平
SoC的LCD控制器硬件接口是TTL电平的(+5V表示逻辑1,0V表示逻辑0),LCD的硬件接口也是TTL电平的,因此它们可以直接对接(一般使用软排线进行连接),比如手机、平板、开发板内部都是这样直接对接的。
TTL电平的缺陷就是传输距离短,如果LCD屏幕和主板控制器太远(比如大于1米),就不能直接TTL连接,而要进行转换。转换方式为:主机SoC(TTL) —>VGA —> LCD屏幕(TTL)。
其他各种接口(TTL、LVDS、EDP、MIPI)在传输速率、距离、适配性方面的介绍,见参考博文2。
2、S5PV210的RGB接口简介
LCD的RGB接口时序图如下所示(在用户手册P1207):
(1)VD[23:0]:24根并行的数据线(可见LCD是并行接口),用来传输图像信息。
(2)HSYNC:水平同步信号。
(3)VSYNC:垂直同步信号,是时序信号,为了让LCD能够正常显示给的控制信号。
(4)VCLK:像素时钟,LCD工作时需要主板控制器给LCD模组一个时钟信号,就是VCLK。
(5)VDEN:数据有效标志,时序信号,和HSYNC、VSYNC结合使用。
(6)LEND:行结束标志,时序信号,是非必须的,比如X210接口就没有。
3、与背光灯有关的引脚
三、LCD如何显示图像
1、像素
像素是组成图像的最基本元素(在显示中可以被控制的最小单位),整个图像就是由一个个的像素组成的。
像素可以被单独控制,控制其亮或不亮(单色屏),或者控制其亮度强弱(比如亮50%还是35%,这样叫灰度屏,以前的黑白电视机),或者控制其显示一定的颜色(现在最常用的彩色显示屏)。
我们要在显示器上显示一个图像,就是把这个图像离散化成一个个的点,然后把各个点的颜色对应到显示器的像素上。
2、扫描
扫描就是依次将颜色数值放入显示器所有像素中的这个过程。
扫描这个词是由最早的CRT显示器遗留下来的,到LCD显示器的年代已经失去意义,但是我们还是延续着这么叫。
显示器的扫描显示原理依赖于人眼的视觉暂留。只要显示器扫描频率大于人眼的发现频率,人眼看到的图像就是恒定的。如果扫描频率偏小人眼就会看到闪动。
3、LCD驱动器与LCD控制器
LCD驱动器一般和LCD显示面板集成在一起(这两者本来是分开的,做面板的是只做面板的,比如三星、LG、台湾的友达、奇美都是做面板的;驱动器也由专门的IC厂商生产;集成厂商买来面板和驱动器后集成在一起做成LCD屏幕)。LCD显示面板只负责液晶分子的旋转透光,需要一定的模拟电信号来控制液晶分子。这模拟电信号由LCD驱动器负责提供,而 LCD 驱动器的控制信号(是数字信号)来自LCD屏幕的外部接口(第二节所讲的接口)。
LCD控制器一般集成在SoC内部,负责向LCD驱动器提供控制像素显示的数字信号。LCD控制器的关键在于时序,它必须按照一定的时序和LCD驱动器通信。LCD控制器受到SoC控制,SoC会从内存中拿像素数据给LCD控制器并最终传给LCD驱动器。
4、显示内存(显存)
SoC在内存中挑选一段内存(程序员随便挑的,但是必须符合一定规矩),然后通过配置将LCD控制器和这一段内存形成一个映射关系。我们把这一段内存称为“显示内存”,简称“显存”。
这个映射关系建立之后,CPU不用再理会LCD控制器、LCD驱动器和LCD显示面板,只要关心显存即可。因为只要把待显示的图像的像素数据丢到显存中,LCD控制器就会自动从显存中读取像素数据并传输给LCD驱动器,这个过程不需要CPU的参与。
也就是说,LCD显示分为2个阶段:第一个阶段就是CPU初始化LCD控制器,使LCD控制器和某一段显存构成映射关系;第二个阶段就是将待显示的图像的像素数据丢到显存中。
四、LCD的六个主要时序参数
LCD的显示单位是帧(整个画面的内容为一帧),显示器工作时其实是一帧一帧地在显示,比如电影以每秒24帧的速度播放图片。
1、LCD显示一帧图像的过程
如下所示,一帧分为多行,一行分为多像素,因此一帧图像其实就是多个像素组成的矩阵。
LCD显示一帧图像时,先把一帧拆分为行,然后再把这些行拆分为像素点。然后LCD控制器每次将一个像素点的数据传送给LCD驱动器,LCD驱动器根据这个像素点的数据,驱动这个像素点的液晶分子旋转,从而让这个像素点显示出对应的颜色。
注意,由于 LCD控制器 和 LCD驱动器 之间一次只能传送一个像素点的数据,所以一帧图像在屏幕上其实是逐行逐像素点地显示的,不是同一时间显示出来的。
2、六个主要时序参数
LCD的六个主要时序参数如下表所示。
时序参数 | 含义 |
HSPW | 水平同步信号脉宽 |
HBPD | 水平同步信号前肩 |
HFPD | 水平同步信号后肩 |
VSPW | 垂直同步信号脉宽 |
VBPD | 垂直同步信号前肩 |
VFPD | 垂直同步信号后肩 |
这些信号其实是老式的CRT显示器才会用到,LCD本身不需要,但是出于兼容性的要求,LCD选择兼容CRT显示器的这些时序要求,所以理解LCD显示器时序和编程时,可以用CRT的方式来理解。
一帧图像由多个行组成,每行都是这个时序:LCD控制器先发送一个HSYNC高电平脉冲(脉冲宽度是HSPW),脉冲告诉驱动器下面的信息是一行信息。然后开始这一行信息,这一行信息包括3部分:HBPD+有效行信息+HFPD。其中前肩和后肩都属于时序信息(和LCD屏幕具体有关),有效行信息就是横向分辨率。所以你可以认为一行总共包含4部分:HSPW+HBPD+有效行信息+HFPD。
一帧图像的通信过程是这样的:整个帧图像信号分为4部分:VSPW+VBPD+帧有效信号+VFPD。VSPW是帧同步信号宽度,用来告诉驱动器一帧图像要开始了;VBPD和VFPD分别是垂直同步信号前后肩。
这六个时序参数本身是LCD屏幕本身的参数,与LCD控制器无关。同一个主板如果接的屏幕不一样,则时序参数设置也会不同。这些参数来源一般是:
(1)厂家一般以示例代码的形式给出。比如九鼎的210裸机教程中s5pv210-fb.c文件的第774行:
.h_fp = 210, // 160-210-354
.h_bp = 38, // 46
.h_sw = 10, // 1-40
.v_fp = 22, // 7-22-147
.v_fpe = 1,
.v_bp = 18, // 23
.v_bpe = 1,
.v_sw = 7, // 1-20
注意这些数字的单位。H开头的三个单位都是DCLK(像素时钟),V开头的三个单位是TH。这样设置的好处是当我们改变像素时钟的设置时,不用改变这里的时序参数。
如果没有设置好这些时序参数,屏幕会跑偏。
(2)来自LCD的数据手册。比如X210光盘资料\A盘\DataSheet\AT070TN92.pdf。
五、与LCD的相关概念
1、像素(pixel)
见第三节提到的“像素”。 像素的中文全称为图像元素,它是分辨率的尺寸单位,而不是画质。
2、像素间距(pitch)
像素间距,指的是相邻2个像素的像素中心的距离。
像素物理上一般是方形的,所以横向pitch和纵向的pitch一样的(当不是方形时则不一样)。
像素间距会影响屏幕的最佳观看距离,比如像素间距大的适合远距离看,像素间距小的适合近距离看。
3、分辨率(resolution)
分辨率,是指整个屏幕横向和纵向的像素个数,比如X210V3S开发板的屏幕分辨率是1024*600。
屏幕尺寸(纯屏幕对角线尺寸)和分辨率无关,比如X210V3S开发板的屏幕尺寸是7寸的。
屏幕尺寸、分辨率和像素间距三者之间有关联。屏幕尺寸固定时,分辨率越高(越低),则像素间距越小(越大);分辨率固定时,屏幕尺寸越大(越小),则像素间距越大(越小)。
分辨率,分为物理分辨率、实际显示分辨率。物理分辨率,是指物理屏幕像素点的真实个数。实际显示分辨率,是将物理分辨率抽样之后的分辨率,它小于等于物理分辨率。如何抽样呢?比如物理分辨率是1600*900,实际显示分辨率为1280*720(比如电脑上有调节电脑屏幕的选项),如何从1600变为1280呢?我们可以将1600去掉一些(即某些像素列不显示),或者让相邻列的像素数据一样(变为一个更粗的像素)。
4、清晰度
清晰度是一个主观概念,是人眼对显示效果(是否清晰)的一个主观判断。
清晰度由分辨率和像素间距共同决定。屏幕尺寸固定时,分辨率越高则像素间距越小,显示就越清晰;分辨率越低则像素间距越大,显示就越模糊。分辨率固定时,屏幕尺寸越小则像素间距越小,显示就越清晰;屏幕尺寸越大则像素间距越大,显示就越模糊。
5、像素深度
像素深度,指的是每个像素用多少 bit 来表示,单位是bpp,bits per pixel。
用来表示一个像素的数据位越多,则这个像素的颜色值更加丰富、分的更细,颜色深度就更深。
常见的像素深度有这么几种:1bit、8bit、16bit、24bit、32bit 。
1bit:用1个二进制位来表示颜色,这种就叫单色显示。示例就是理发店门口的LED屏。
8bit:用8个二进制位来表示颜色,此时能表示256种颜色。这种叫灰度显示(纯白到纯黑分别对应255到0,中间的数值对应不同的灰),不是彩色显示,典型应用就是以前的黑白电视机。
16bit:用16个二进制位表示颜色,此时能表示65536种颜色。这种方式可以彩色显示,一般采用RGB565的颜色分布(用5bit表示红色、用6bit表示绿色、用5bit表示蓝色)。因为用来表示RGB颜色的bit数目不够多,导致红绿蓝三种颜色本身分得不够细致,因此彩色失真比较严重。
24bit:用24个二进制位来表示颜色,此时能表示16777216种颜色。这种表示方式和16位色原理是一样的,只是RGB三种颜色各自的精度都更高了,RGB各8位,叫RGB888。此时颜色比RGB565更加真实细腻,虽然说比自然界无数种颜色还是少了很多,但人眼几乎不能区分1677万种颜色和无数种颜色的差别,因此把这种RGB888的表示方法叫做真彩色(RGB565叫做假彩色)。
32bit:总共用32位二进制来表示颜色,其中24位表示红绿蓝三元色(还是RGB888分布),剩下8位表示透明度。这种显色方式就叫ARGB(A是阿尔法,表示透明度),现在PC机中一般都用ARGB表示颜色。
一般用32bit,也就是4个字节,来存储一个像素点信息。至于其中用多少bit来表示颜色,要看具体的设置,平常所见一般都是24位色(真彩色),此时高8位一般没用或者表示其他含义,用00或者ff来填充以便内存对齐。
6、颜色序
将24bit的二进制数分为3组,高8位、中间8位、低8位,这三组二进制数,哪个表示R,哪个表示G,哪个表示B呢?
颜色序表述的就是这个问题。
注意,颜色序一般已经在LCD驱动中设置好了,我们写代码时要遵循这个设置。
7、点阵
点阵是指由像素点构成的阵列,一个屏幕就是一个点阵。