LCD即液晶显示器,控制原理是控制其中的电子枪,在n行*n列的屏幕上投射不同颜色从而形成图像。

编程步骤:

①打开LCD背光 设置LCD背光对应的GPIO的值。

②打开LCD电源 也可以自定义其他GPIO用作LCD电源开关。

③设置其他信号线 其他信号线包括VD0-VD23和VFRAME、VLINE、VCLK等。

④设置LCD的频率(VCLK) VCLK其实就是根据 每秒帧数帧行数行像素 计算出来的,帧行数和行像素需要包含空白数和同步数。

⑤设置其他相关参数 LCD相关的参数主要还有这几个: LINEVAL: LCD水平像素-1,如320-1 = 319 HOZVAL: LCD垂直像素-1,如240-1 = 239 HFPD: 行开始前的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值) HBPD: 行结束后的VCLK时钟数(LCD屏幕的Datasheet一般有推荐值) HSPW: 行之间水平同步的无效VCLK时钟数(LCD屏幕的Datasheet一般有推荐值) VFPD: 帧数据开始前的空白行数(LCD屏幕的Datasheet一般有推荐值) VBPD: 帧数据结束后的空白行数(LCD屏幕的Datasheet一般有推荐值) VSPW: 帧之间垂直同步的无效行数(LCD屏幕的Datasheet一般有推荐值)

⑥确定信号的极性 LCD控制器允许设置VCLK、VLINE、VFRAME等信号的极性(上升沿有效还是下降沿有效),需要对照LCD的Datasheet一一确认。

3.

4.

A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟信号; B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line; C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换; D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC

E:然而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样或者不一样,目的只是为了将图像持续的显示在LCD上)。那么这一副一副的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行; F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC

#define CLKVAL_TFT (7) #define LCD_XSIZE_TFT (320) #define LCD_YSIZE_TFT (240) #define SCR_XSIZE_TFT (320) #define SCR_YSIZE_TFT (240) #define HOZVAL_TFT (LCD_XSIZE_TFT – 1) #define LINEVAL_TFT (LCD_YSIZE_TFT – 1) /****/ #define VBPD (14) //垂直同步信号的后肩 #define VFPD (11) //垂直同步信号的前肩 #define VSPW (2) //垂直同步信号的脉宽

#define HBPD (37) //水平同步信号的后肩 #define HFPD (19) //水平同步信号的前肩 #define HSPW (29) //水平同步信号的脉宽 /****/

LCD各寄存器的配置。
先贴上LCD时序图:

则垂直同步信号的后肩 VBPD = Tvb-1=14 垂直同步信号的前肩 VFPD = Tvf-1 =11 垂直同步信号的脉宽 VSPW = Tvp-1 =2 水平同步信号的后肩 HBPD = Thb-1 = 37 水平同步信号的前肩 HFPD = Thf-1 =19 水平同步信号的脉宽 HSPW =Thp-1 =29
HOZVAL=320-1 LINEVAL=240-1 下面我们就具体计算一下行频(HSF)和场频(VSF):

HSF=VCLK÷[(HSPW+1)+(HSPD+1)+(HFPD+1)+(HOZVAL+1)] VSF=HSF÷[(VSPW+1)+(VBPD+1)+(VFPD+1)+(LINEVAL+1)] VCLK=HCLK÷[(CLKVAL+1)×2] 可得出clkval值即setclkval.

之前老是搞不清楚LCD驱动程序中的pixclock 的计算方法,闲杂清楚了,赶紧记录下来:

pixclock 的计算: DOTCLK = f frame × (X + HBP + HFP+HSPW ) × (Y + VBP + VFP+VSPW) ( 单位: MHz) pixclock = 1012 / DOTCLK= 1012 / (f frame × (X + HBP + HFP+HSPW ) × (Y + VBP + VFP+VSPW)) ( 单位:皮秒 )

f frame 为帧频率

有人介绍了有关其参数的计算,这样更能促进我们对其的理解。

方法如下: VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。

VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。

VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。VSPW=t2/t6=0.06 ms/31.77μs=2。

HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,VBPD=t7×VCLK=1.89 μs×25MHz=47。

HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz=”24″。

HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz=”94″。

外部引脚信号:

VSYNC: 垂直同步信号,表示扫描1帧的开始。 HSYNC: 水平同步信号,表示扫描1行的开始。 VDEN:数据使能信号。 VD[23:0] : LCD像素数据输出端口。 VCLK:像素时钟信号。 寄存器参数: VSPW:垂直同步信号的脉宽,单位为1行(Line)的时间。 VFPD: 垂直同步信号的前肩,单位为1行(Line)的时间。 VBPD: 垂直同步信号的后肩,单位为1行(Line)的时间。 LINEVAL :垂直显示尺寸-1,即屏行宽-1。 HBPD:水平同步信号的后肩,单位为1VCLK的时间。 HFPD:水平同步信号的前肩,单位为1VCLK的时间。 HSPW:水平同步信号的脉宽,单位为1VCLK的时间。 HOZVAL:水平显示尺寸-1,即屏列宽-1。 由上图可知: 扫描一帧所需的时间: =((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。 扫描一行所所需的时间: = ((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。 而一个VCLK时间由LCD寄存器LCDCON1内的CLKVAL决定=HCLK/[2*(CLKVAL+1)]

因此扫描一帧所需的时间: T=[(VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1)] [(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)] HCLK/[2*(CLKVAL+1)] 即帧频率为:1/T 注意:以上的时序图为一般TFT的时序图。实际TFT对应的时序图时序可能不一样(比如极性,符号等)。

CRT 侧面看是个漏斗状的真空的东东, 根部就是电子枪, 打出的电子撞击前面的玻璃面上的荧光物质, 荧光物发光. 控制电子枪按规律射出电子, 逐行的打到荧光物质上, 打完一行(也即扫描完一行), 就回头扫描下一行….. 扫描完一个显示屏所有的行后, 就是一幅完整的画面了, 称为一帧(frame), 扫描过程如果非常快, 人眼看到是一幅完整画面, 但实际是一个个点发不同光组成的. 扫描得慢时, 就会觉得闪烁了(以前听老师讲课, 说在他们的年代, 能明显看到一行一行刷过的壮观场景).

一帧扫描完, 再回头从第一行开始继续扫描, 重复过程. 看到的就是持续在显示的画面了(实际上, 电子的运动轨迹是由磁场控制的, 电子枪没有机械的运动, 为好理解, 就当是电子枪做了机械运动吧).

多数显示器选择从左上角开始, 从左至右, 到了右边界, 再偏转到左边界的下一行, 这是所谓的”Z”型扫描. 类似地扫描完最后一帧时, 要偏转回左上角起始处, 准备扫描下一帧.

HSYNC 信号用于告诉电子枪该扫描下一行了, 即要转到下一行起始处了; VSYNC 信号告诉电子枪该显示下一帧了, 即该转回左上角起始处了; H for Horizontal, V for vertical. 在这里 Hsync, Vsync 两者各表示一种信号, 分别由 HSPW 及 VSPW 两个参数确定信号持续时间, 也就是脉冲的宽度.

在扫描一行中, 首先HSYNC 脉冲信号为高电平, 一发出此信号, 电子枪迅速移回左边界, 期间电子枪不发射电子.

在 HSYNC 信号持续时间上的某点, 电子枪开始再次向右扫描了, 等 HSYNC 信号结束, 表示该开始显示下一行的数据了, 电子枪又要开始发射电子. 在HSYNC 信号结束与开始显示数据之间, 可以插入一段延时(由 HBPD 参数控制)让显示屏仍然不显示有效数据(效果就是黑色), 是为显示屏左边框.
到 HFPD 结束, 电子枪才可以发射电子, 显示该行的有效数据.

显示完毕. 又该开始发出 HSYNC 信号了. 在一行中有效数据扫描完毕与 HSYNC 信号发出之间也插入一段延时 HFPD, 是为显示屏右边框,

之后, 就是重复过程了.因此, 显示一行时序为: HSPW -> HBPD -> 扫描数据 -> HFPD .

类似地, 垂直扫描一帧的时序:VSPW -> VBPD -> 扫描有效行 -> VFPD .

为什么要有边框(vbpd, vfpd, hbpd, hfpd)? 按上边贴出网页的说法: Usually, one doesn’t use that feature nowadays, as we have tunable monitors that allow stretching the mode to the physical limits of the monitor.

对于 TFT LCD, 但这些参数作用是同样的. 但如何确定 ? TFT 的 LCD 的 datasheet 中一定得标有.

如型号 WXCAT35-TG3 3.5 寸的液晶中有表如下:

对照下边的时序图(注: 时序图的 Vsync, Hsync 信号(红框圈出的)跟上边讲的有点出入, 信号都是低电平, 而非高电平, 因此编程时要设置信号反相, 如s3c244a 的 LCDCON5的INVLINE 及 INVFRAME 即是干这活的):

tvp 即 VSPW, tvb 即 VBPD, tvf 即 VFPD thp 即 HSPW thb 即 HBPD thf 即 HFPD

参考的时钟就是 CLK, 一个 CLK 时钟, 完成一个像素点的显示.计算帧频率(刷新频率)的方法就是所有的像素点跟边沿(边框,hbpd 之类),同步脉冲的时间相加, 结果就是显示完整一帧所需时间, 其倒数即是帧频率.