文章目录
前言
- 了解LCD显示器的接口和及时序
- 掌握S3C2410LCD控制器的使用方法
- 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像
一、LCD和LCD控制器
LCD显示器
LCD种类
LCD(Liquied Crystal Display),即液晶显示器,是一种采用了液晶控制透光技术来实现色彩的显示器。它与传统的CRT显示器相比有很多的优点:轻薄、能耗低、辐射小等。市场占有率很高。LCD有很多种类型,比如STN、TFT、LTPS TFT、OLED等,各有各的优缺点。
STN(超扭曲向列),有CSTN和DSTN之分,是4种LCD屏种最低端的一种,仅有的优点就是功耗低,在色彩鲜艳度和画面亮度上相对于TFT和其他LCD屏存在明显不足,在日光下几乎不能显示,而且响应时间也很长,简直是不能来播放视频,动画等。
TFT(薄膜晶体管)可以大大缩短屏幕响应时间,其响应时间已经小于80ms,并改善了STN连续显示时屏幕模糊闪烁,有效提高了动态画面的播放力,呈现话main色彩饱和度、真实效果和对比度都非常不错,完全超过了STN,知识功耗高。
LTPS(低温多晶硅)由TFT衍生的新一代的技术产品,可以获得更高的分辨率和更丰富的色彩。
OLED(有机发光二级管)各种物理特性都具备领先优势,色彩明亮,可视角度大,非常省电等
**注意:**这本书都是十年以前的了,最新信息还是大家网上收集资料
LCD的接口
CPU或显卡发出的图像数据是TTL信号,LCD本身接收的也是TTL信号。由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力也比较差,后来又提供了多种接口,比如LVDS,TDMS,GVIF,P&D,DVI和DEP等。它们实际上只是将CPU或显卡发出的TTL信号编码成各种信号以便传输,在LCD那边将接收到的信号进行解码得到TTL信号。
由于数字接口标准尚未统一,所以使用LCD时需要根据手册了解具体的接口定义。也是基于数字接口标准尚未统一的原因,市场上大多LCD都采用模拟信号接口,LCD需要先通过ADC将模拟信号转换为数字信号才能显示。
但是不管采用何种数字接口,本质的TTL信号是一样的
对于STNLCD
STN LCD的数据传输方式有3种:4位单扫,4位双扫,8位单扫。所谓**“单扫”是指对于一整屏的数据,从上到下,从左到右,一个一个的发送出来。“双扫”**是指将一整屏的数据分为上下两部分,同时地从上到下,从左到右,一个一个的发送出来。“4位”、“8位”是指发送数据时使用多少个数据线;需要注意的是,4位双扫方式也是用到8根数据线,其中4根用于上半屏数据,另外4根用于下半屏数据。
除数据信号外,还有其他控制信号,所有TTL信号如下:
对于TFT LCD
TFT LCD的TTL信号与STN类似,只是其数据信号多达24根,对应像素值中的每一位。
S3C2410LCD控制器
LCD控制器的特性与结构
S3C2410LCD控制器被用来向LCD传输数据,并提供必要的控制信号,比如VFRAME,VLINE,VCLK,VM等。可以支持STN LCD和TFTLCD。其特性如下(BPP表示bit per pixel,即每个色素使用多少位来表示其颜色)
STN LCD
- 支持3中扫描方式:4位单扫,4位双扫,8位单扫
- 支持单色(1BPP),4级灰度和16级灰度屏
- 支持256色(8BPP)和4096色(12BPP)彩色STN屏(CSTN)。
TFT LCD
- 支持单色,4级灰度,16级灰度
- 支持46K和16M色非调色板显示模式
S3C2410LCD控制器提供了驱动STNLCD,TFTLCD所需要的信号,另外还提供了颇外的信号以支持SEC公司生产的TFTLCD。这3类信号中很大部分是复用的
S3C2410控制器的内部结构如下所示
REGBANK是LCD寄存器组,含17个寄存器及一块265x16的调色板内存。用来设置各项参数。而LCDCDDMA,则是LCD控制器专用DMA信道,可以自动地从系统总线上取得图像数据,这使得显示图像时不需要CPU的干涉。VIDPRCS将LCDCDDMA中的数据组合成特定的格式(比如4位单扫,4位双扫,8位单扫等),然后从VD[23:0]发送给LCD屏。同时TIMEGEN和LPC3600负责产生LCD屏所需要的控制时序。例如VSYNC,HSYNC,VCLK,VDE等然后从VIDEO MUX送给LCD屏。其中LPC3600专用于SEC TFT LCD。
LCDCDDMA中有两个FIFO:FIFOH容量为16个字,FIFOL的容量为12个字。当使用”双扫方式时”,FIFOH,FIFOL分别传输上半屏、下半屏数据;当使用"单扫"的方式,只用到FIFOH。当FIFO为空时或者其中已经有其他数据已经减少到设定的阙值时,LCDCDDMA自动地发起DMA传输从内存中获得数据。
显示器上数据的格式
对于屏幕上的一整幅图像,它的数据是如何组织的?无论是CRT还是LCD显示器,它们都有一个共同的概念。
一幅图像被称为一帧,每帧由多行组成,每行由多个像素组成,每个像素的颜色使用若干位的数据来表示。对于单色显示器,每个像素使用1位来表示,被称为1BPP;对于256色显示器,每个像素使用8位来表示,称为8BPP。
显示器从屏幕左上方开始,一行一行地取得每个像素的数据并显示出来,当显示到一行的最右边时,跳到下一行的最左边开始显示一行;当显示完所有行后,跳到左上方开始下一帧。显示器沿着"Z"字型的路线进行扫描,使用HSYNC,VSYNC信号来控制扫描路线的跳转,HSYNC表示“跳转到最左边的时候了”,VSYNC表示“跳到最上面的时候了。”
在工作的显示屏上,可以看见在四周黑色的边框。上方的黑框是因为显示完所有行的数据时,显示器还没扫描到最下方(VSYNC信号还没给出),需要经过若干行之后第一行数据才有效:下方的黑框是因为显示完所有行的数据时,显示器还没扫描到最下方(VSYNC信号还没发出),这时数据已经无效;左边的黑框是因为当发出HSYNC信号时,需要经过若干像素之后第一列数据才有效;右边的黑框是因为显示完一行的数据时显示器还没扫描到最右边(HSYNC信号还没给出),这时数据已经无效。显示器只会依据VSYNC、HSYNC信号来取得、显示数据、并不理会数据是否有效,何时发出有效数据由显卡决定。
VSYNC信号出现的频率表示一秒钟能显示多少帧图像,称为垂直频率或场频率,这就是我们常说的“显示器频率”;HSYNC信号出现的频率称为水平频率。
显示器上,一帧数据的存放位置与VSYNC、HSYNC信号的关系如图所示
年代比较久远了,大家理解理论知识就行。
“有效数据”的行数、列数、即分辨率,它与VSYNC,HSYNC信号之间的距离等都是可以设置的,这是由显卡来完成的,这些设置在下面的操作中会看到。
TFTLCD的操作
先了解TFTLCD的时序,这使得我们在设置各个寄存器时有个形象的概念。每个VSYNC信号表示一帧数据的开始;每个HSYNC信号表示一行数据的开始;无论这些数据是否有效;每个VCLK信号表示正在传输一个像素的数据,无论它是否有效。数据是否有效只不过说对CPU的LCD控制器来说,LCD根据VSYNC,HSYNC,VCLK不停的读取总线数据、显示。
关于时序可参考下图:
- VSYNC信号有效时,表示一帧数据的开始
- VSPW表示VSYNC信号脉冲宽度为(VSPW+1)个HSYNC信号周期,即(VSPW+1)行,这(VSPW+1)行数据无效。
- VSYNC信号脉冲之后,还要经过(VBPD+1)个HSYNC信号周期,有效行的行数据才出现。所以,在VSYNC信号有效之后,总共话要经过(VSPW+1+VPBD+1)个无效行,它对应上面视图的上方边框。
- 随后即连续发出(LINEVAL+1)行的有效数据
- 最后是(VFPD+1)个无效的行,对应到下方的边框。
显示器上的颜色组合
这里不太建议大家来学习,百度认识一下就行
16M(24BPP)色,64K(16BPP)色,256(8BPP)色
使用TFT LCD时LCD控制寄存器的寄存器设置
LCD控制寄存器中REGBANK的17个寄存器可以分为6种,如下:
对于TFTLCD一般情况下只需要设置前两种寄存器:在8BPP模式下,如果想快速地输出一帧单色的图像,可以借助TPAL寄存器。
LCD控制寄存器LCDCON1
用于选择LCD类型,设置像素时钟,使能LCD信号的数据等。格式如下
LCD控制寄存器LCDCON2
用于设置垂直方向各信号的时间参数,格式如下
LCD控制寄存器LCDCON3
用于设置水平方向各信号的时间参数,格式如下
LCD控制寄存器LCDCON4
对于TFT LCD,这个寄存器只用来设置HSYNC信号的脉冲宽度,位[7:0]的数值称为HSPW,表示脉冲宽度为(HSPW+1)个VCLK周期
LCD控制寄存器LCDCON5
用于设置各个控制信号的极性,并可以从中读取到一些状态信息,格式如下
帧内存地址寄存器 LCDSADDR1~LCDSADDR3
帧内存可以很大,而真正要显示的区域被称为视口,它处于帧内存中。这3个寄存器用于用于确定帧内存的起始地址,定位视口在帧内存中的位置。
LCDSADDR1寄存器
LCDSADDR2寄存器
LCDSADDR3寄存器
临时调色板寄存器TPAL
如果输出一帧单色的图像,可以在TPAL寄存器中设定这个颜色值,然后使能TPAL寄存器,这种方法可以避免修改整个调色板或帧缓冲区。
二、TFTLCD显示实例
程序设计
从一个串口中输出一个菜单,从中选择各种方法进行测试,比如画线,画圆,显示单色,使用调色板等。
代码解析
- lcddrv.c封装了对LCD控制器、调色板的访问函数,可以设置LCD显示模式,开启/关闭LCD,设置调色板等。
- framebuffer.c直接操作帧缓冲区,实现画点,画线,画同心圆,清屏等函数
- lcdlib.c调用函数前两个文件提供函数在LCD上进行各种操作。
程序结构如下
总结
代码设计还是很难的,所以有兴趣的同学可以深入的了解。其实对于我们做应用开发的来说,晓得怎么用就行,毕竟让我们直接操作寄存器,还是比较痛苦的。