欢迎转载,转载请注明出处(http://hi.baidu.com/bigrainbow)
S3C44B0X内置LCD控制器灰度显示和256色彩色显示机理分析
【内容提要】关于S3C44B0X(ARM7TDMI)内置LCD控制器的编程在网上已经有很多文章讲述过了,尤其是杭州立宇泰公司的网站上对 44B0X内置LCD控制器有两篇文章讲述的非常详细。但是很少有文章描述灰度显示和256色彩色显示的细节的,这虽然不影响LCD控制器的一般使用,但是了解这种显示机理对于理解UCGUI中对颜色的处理还是很有帮助的。本文主要介绍了44b0x内部LCD控制器是如何在屏幕上显示出灰度效果和256色彩色效果的。有一部分是翻译的44b0x的用户手册,有一部分是自己的体会,不一定正确,大家指正!
【正文】
44b0x的LCD控制器可以支持灰度屏,在datasheet里面提到灰度显示时会使用Time-based Dithering Algorithm(基于时间的抖动算法,用来减少画面闪烁)和FRC(Frame Rate Control)(帧比率控制,用来实现灰度显示)。
FRC(Frame Rate Control)
就是通过改变帧比例来实现灰度显示。例如,对于显示16级灰度中的3级灰度,就把显示的象素点在开始的3帧点亮,在接下来的13帧中熄灭。通过 3/16的帧比率来实现灰度显示这只是举例,实际上在44b0的LCD控制器中3级灰度对应的帧比率是1/4,这些帧的显示控制全部由硬件根据灰度值查表完成,软件只需设置该点的灰度值(0~15)即可。还需要注意的是,16级灰度并不是按照1/16、2/16、3/16均匀分布的,而是有一个标准值。这个值在44b0中是固定了的。16级灰度,有8个抖动寄存器,这8个寄存器存放了从第7级灰度(DP1_2)到第14级灰度(DP6_7)这8级的抖动方式,把其中6个取反,就是第1级到第6级灰度的抖动方式,0级灰度和15级灰度不需抖动。
Time-based Dithering Algorithm
Pre-dithered Data (Gray Level Number)预抖动数据=灰度值
DP1_2
DP4_7
DP3_5
。。。。。。。。
这些寄存器中存放的就是抖动的方式,44b0都有推荐值。比如DP1_2,设定为1010 0101 1010 0101 (0xA5A5)也就是第N帧显示1010,N+1帧显示0101,N+2帧显示1010,N+3帧显示0101,就实现了1/2抖动率。按照 datasheet的说明分析,这应该是对大面积(至少4 pixel同一灰度)才能实现。为什么不用1111 0000 来实现呢?据说这样全部一起改变时闪烁感最明显。
因此通过Time-based Dithering Algorithm和FRC可以实现随机(我认为是伪随机,其实就是设定好的一串序列)改变一片同灰度区域内不同象素的亮灭,但是又能保证每个点在一定的周期内的抖动比率是相同的。这样既保证了灰度相同,又保证了相同灰度象素(相邻)不会同时熄灭,最大程度消除闪烁感。(个人认为这种算法对于图像边缘的闪烁可能无能为力,比如不足4个同灰度象素点的区域)
这个算法应该是专门研究图形学的人搞出来的,用于改善视觉效果。整个过程并不需要软件干预,完全是硬件自动判断完成的。从中体现出来的设计思想还是值得品味的。
分析完44b0灰度显示的机制,再看看256色显示。256色模式下,一个字节描述一个象素。
D7 D6 D5 D4 D3 D2 D1 D0
R R R G G G B B
RRR对应红色的LUT,查到一个4位的值,这个值对应于16级深浅(红)颜色中的某1级
由于一共只有3位,因此一共只能查找出这16级中的8级。
同理GGG一共可以查找到16级深浅(绿)颜色中的8级,BB一共可以查找到16级深浅(蓝)颜色中的4级。
由256色LCD的结构可知,每个象素点(pixel)对应有3个点(dot),这三个dot分别为红绿蓝,可以理解为彩色LCD每一行有 3*Y_SIZE个dot,其中每3个dot一组,共同发光形成一个颜色象素(pixel)。256种颜色是如何得到的呢?LCD控制器根据 RRRGGGBB查到的各自的颜色等级,分别对LCD上某一个pixel的R点以16级灰度显示的方式改变红光的强度(取8级中的1级),对G点以16级灰度显示的方式改变绿光的强度(8级中的1级),对于B点以16级灰度显示的方式改变蓝光的强度(4级中的1级),这样实现8*8*4=256色的显示。也就是说,在彩色显示的过程中,同样使用了在灰度显示里提到的抖动算法和FRC。这也验证了原来调试LCD时显示一幅照片,仔细看屏幕会发现颜色都有快速细小的变化(由于抖动或者无法实现抖动),但是单独显示红、黄、蓝、白等颜色却没有闪烁现象的,这也证实了对于这些颜色,都不需要抖动,因为这几种颜色,对于RGB三原色单独来说,占空比都为1或者0。
这是44b0x的LCD控制器实现彩色显示的方式,这种LUT(颜色查找表,lookup table)方法也叫调色板。但是这里44B0X硬件寄存器实现的LUT与ucgui里提到的调色板并非同一概念,后面我会陆续写一些文章来介绍 ucgui使用的调色板和颜色转换表。
相关知识(来自互联网)
什么是真彩色、伪彩色和调配色?
答:在RGB色彩空间,图像深度与色彩的映射关系主要有真彩色、伪彩色和调配色。
真彩色(true-color)是指图像中的每个像素值都分成R、G、B三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为真彩色。例如图像深度为24,用R:G:B=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为28=256种。图像可容纳224=16 M种色彩。这样得到的色彩可以反映原图的真实色彩,故称真彩色。
伪彩色(pseudo-color)图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色。用这种方式产生的色彩本身是真的,不过它不一定反映原图的色彩。在VGA显示系统中,调色板就相当于色彩查找表。从16色标准VGA调色板的定义可以看出这种伪彩色的工作方式。
伪彩色一般用于65K色以下的显示方式中。标准的调色板是在256K色谱中按色调均匀地选取16种或256种色彩。一般应用中,有的图像往往偏向于某一种或几种色调,此时如果采用标准调色板,则色彩失真较多。因此,同一幅图像,采用不同的调色板显示可能会出现不同的色彩效果。
调配色(direct-color)的获取是通过每个像素点的R、G、B分量分别作为单独的索引值进行变换,经相应的色彩变换表找出各自的基色强度,用变换后的R、G、B强度值产生的色彩。
调配色与伪彩色相比,相同之处是都采用查找表,不同之处是前者对R、G、B分量分别进行查找变换,后者是把整个像素当作查找的索引进行查找变换。因此,调配色的效果一般比伪彩色好。
调配色与真彩色比,相同之处是都采用R、G、B分量来决定基色强度,不同之处是前者的基色强度是由R、G、B经变换后得到的,而后者是直接用R、G、B决定。在VGA显示系统中,用调配色可以得到相当逼真的彩色图像,虽然其色彩数受调色板的限制而只有256色。
对于一个256色(BPP=8)的800*600分辨率的图像而言,若R、G、B分别采用一个字节描述,则需要 800*600*3=1440000Byte的存储空间,使用颜色表则只需800*600*1+256*3=480768Byte的存储空间。
以下是一个256色的颜色索引表的例子
——————————————————————————————
index R G B
0 14 125 69
1 75 159 251
2 159 22 37
3 0 0 0
4 255 255 255
... ... ... ...
... ... ... ...
255 48 69 55
(三基色的比例搭配是我瞎编的)
——————————————————————————————
很显然,对于256色的图形,当使用颜色索引表的时候,对于每个像素我们只需用一个字节存储其在索引表中的index值即可,如此看来一副800*600像素的256色的图形的存储只需要 800*600*1个Byte,存储该索引表也只需256*3个Byte而已。
同样对于这样一个256色的800*600分辨率的图形,如果采用直接的三基色存储的话,则对于任何一个像素我们都需要去用三个字节记录它的R、G、B三个分量的值。比如说,某个像素的颜色和上述索引表的index为2 的那种颜色一样,对于索引表方式,我们只需记住该点的颜色为2即可,这当然用一个字节就可以存储了(因为只有256种,这是其中的第2种);但是如果我们对于该点采用直接记录其三个基色分量的存储方式的话,我们便需要记录这样一组数据( 159,22,37),显然这应该用三个字节分别存储(虽然每个分量确实不是各自都有256中不同值,但是为了简单起见实际中我们还是会用一个字节去记录一个分量)。
建议浏览如下的参考资料:
S3C44B0的LCD控制器原理简述
http://www.hzlitai.com.cn/article/yejin-article/example/20061013277.html
S3C44B0X与彩色LCD的接口与控制
http://www.hzlitai.com.cn/article/yejin-article/cphard/20061013404.html
《S3C44B0X与彩色LCD的接口与控制》的补充——关于像素点的位数
http://www.hzlitai.com.cn/article/yejin-article/cphard/20061013405.html
S3C44B0X中文数据手册LCD接口(第十二章)
http://www.hzlitai.com.cn/article/ARM7-artilcle/cphard/20061013361.html