stdlf
分类:
2010-01-30 00:37:02
眼看3月份就要结束了,这个月埋头于UCGUI的移植和应用程序的编写,这里荒芜了很长时间,实在是罪过。不过总算是有所收获,以前一直很疑惑的一些问题终于弄明白了。虽然对这些问题的研究有时候已经超越了硬件工程师的开发范围,甚至已经不是一个技术问题了(比如对显示颜色的探究),但是在学生时代,多开阔一些视野,扩大知识面总是有好处的。每每弄清楚一个现象的来龙去脉,总会让我觉得很满足,很有成就感,之前的枯燥单调也值了。。。。
技术交流版开了好久了,一直没有任何文章,整个博客尽是一些无病呻吟的生活随想,显得这个博客太酸,这里陆续贴出这个月的一些心得体会,和技术同仁分享。。。欢迎转载,转载请注明出处()
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色。
建议浏览如下的参考资料:
S3C44B0的LCD控制器原理简述
S3C44B0X与彩色LCD的接口与控制
《S3C44B0X与彩色LCD的接口与控制》的补充——关于像素点的位数
S3C44B0X中文数据手册LCD接口(第十二章)