您的位置:网站首页 > 电器维修资料网 > 正文 >
双缓冲实现图形液晶的快速显示
来源: 日期:2013-11-19 19:16:59 人气:标签:
在液晶接口电路设计时,需要正确使用液晶控制器。典型应用时,特别是在嵌入式系统中,常常采用端口寻址的液晶控制器,如sed1335、t6963c等。这种寻址方式的好处是只占用很少的几个地址空间,并且控制方便。液晶控制器一方面通过外部总线和微处理器相连;一方面通过内部总线与显示缓冲ram相连;还有一些驱动的控制线和数据线与液晶相连。微处理器通过液晶控制器,采用地址译码方式来执行液晶控制、显示、绘制,以及存贮操作等指令。常用指令有:初始化,显示方式,移动光标,光标处的数据读和写等等。更改显示ram中的数据,也就更改了液晶屏的相应内容。
作为现在流行的显示器件,液晶有其固有的优越性,但也有严重不足之处。相对crt等显示器件而言, 主要缺陷是视觉效果差,亮度不足,视角偏小,响应速度慢(“拖尾”现象)。同时,根据前面的叙述,我们可以看到:由于硬件系统的局限性,显示ram通过内部总线与控制器相连,微处理器对液晶显示ram 的寻址采用了间接的端口译码方式,而不是速度更快的直接内存寻址。译码的延时会进一步减缓显示速度。表现在用户界面上,很可能出现刷新的延迟,屏幕的闪烁,以及余辉现象,都会引起视觉的不舒适。一方面降低了产品的档次,另外用户长时间操作时会导致眼睛的疲劳,产生厌倦情绪。
2. 基本介绍
无论是lcd还是crt,进行绘图,都是在“画布”上做清除旧位置的图和重新画新位置的图的操作。当程序执行速度不够快时,我们会看到清除的操作与重画的操作,这就造成了闪烁现象。解决这个问题的方法之一,就是把清除与重画的操作放在另一张“画布”上完成,等到画完后再复制到 后要显示的“画布”上。这种绘图方式就是双缓冲。
实际上,图形的双缓冲显示方式,对于windows程序设计员来说,一点也不陌生。以mfc绘图机制来说,cpaintdc就是要显示的画布,如果我们使用另外一个兼容的dc来做清除与重画的操作,再把整个dc的图像复制到cpaintdc,就可以避免屏幕闪烁的问题。对于多数嵌入式设备来说,由于mcu的处理速度要慢许多,因此在软件设计中,更需借鉴这种方法,以期提高显示速度, 大限度地降低液晶的显示缺陷。
3. 实现方法
双缓冲方式不仅可以提高液晶显示速度,还可以改善软件模块的封装性和可移植性。实现时,就是在系统存贮器中开辟一块显示ram 的镜像缓冲区域,此区域保存了预备显示图像的“快照”。当更改屏幕内容时,先更改镜像区域的内容;需要显示时,才把“快照”数据刷新到显示ram。这样对于用户界面而言,显示速度只取决于“快照”的送入速度。
下面,我们以两种常用的液晶控制器(t6963c和sed1335)为例,说明如何使用双缓冲的方式进行液晶的快速显示。为了简单起见,我们直接选用内藏驱动和控制器的典型图形液晶显示模块。
1) 基于t963c的液晶显示模块smg24064b
smg24064b是显示点阵为240*64、控制器为t6963c的液晶显示模块,工作环境是5v/10ma,生产厂家为长沙太阳人。许多液晶生产厂家都有和这款相兼容的产品,如大连东显、深圳拓普微、台湾晶采等。其接口信号说明如下:
表1 smg24064b信号线说明
smg24064b应用时,可以采用总线方式或者模拟口线方式。双缓冲方式只能采用总线方式,通过端口译码来实现。下图是一种典型的接口电路。图中的gal实现地址译码,当然也可以采用74138等完成译码。译码输出信号连接到t6963c控制器的片选使能端ce,而数据命令选择端c/d可以接地址线a0。
图1 smg24064b与8031的总线连接
这样,就得到了两个译码端口,一个端口作为控制口,向t6963c送入命令;一个端口作为数据口,向t6963c送入数据。采用地址译码方式来执行液晶控制、显示、绘制,以及存贮操作等指令。
显而易见,240×64液晶的显示ram 空间为240/8×64=1920字节。而t6963c控制器内部自带8kb的ram缓冲区,其中显示缓冲区首地址寄存器对应的后续1920字节的内容就映射到lcd屏幕的相应位置。这样,我们从嵌入式系统mcu扩充的外部ram中分配1920字节作为镜像显示缓冲(软件编程也就是从外部ram中分配1920字节的数组),来实现双缓冲显示。对于应用系统而言,如果扩展的外部ram较大(如32kb)时,分配不到2kb的镜像显示缓冲,开销不算大;但却可以大大改善显示的速度。
这样,lcd的绘图程序,比如画点、画线、填充、字符串显示等,都是在镜像缓冲ram中操作的;只有两个程序,lcd的初始化程序initlcd(初始化液晶,设置液晶的显示模式等)和显示程序displaylcd(把镜像缓冲数据刷新到t6963c内的显示ram缓冲),与底层硬件相关。下面是显示程序displaylcd的实现流程:
1、 设置液晶显示的起始0地址(数据口写入数据0x00和0x00,命令口写入数据0x24);
2、 设置液晶连续写模式(命令口写入数据0xb0);
3、 把镜像缓冲中的1920个数据连续送入数据口(数据口写入显示数据);
4、 中止液晶连续写模式(命令口写入数据0xb2)。
上述命令指令含义请参见液晶模块或者控制器相关资料。显示程序只在要 终显示的时候才调用,它决定了显示速度,我们可以专门对它进行优化,或者用汇编代码完成,实现 快的显示速度。
当然,如果系统扩展的ram空间足够时,我们还可以采用三缓冲的方式,也就是在系统ram中分配两块镜像区域。一块缓冲保存当前显示图形数据,另一块保存下一个图形数据,然后交替地把缓冲区的数据送入显示ram,完成显示。这种方式适用于以下情况:用户界面的更新多数只是局部更新,因此通过比较两块缓冲数据的不同,显示时只需要送入当前缓冲中不相同的部分数据,可以进一步提高显示速度。
2) 基于sed1335的液晶显示模块edm320240-2
edm320240-2是显示点阵为320*240、控制器为sed1335的液晶显示模块,ram的显示容量为32kb,生产厂家为大连东显。许多320*240的液晶,如dmf50081、lm32019p/t等,都可采用sed1335控制器。 实际上,对于较大的图形液晶,通常采用sed1330/1335系列控制器。此控制器功能强大,具有丰富指令集,与mpu接口有较强的i/o缓冲器,可以管理64k显示缓冲区。具备文本/图形显示特性。可以显示文本区和三个图形显示区的内容(通过软件初始化实现),其中三个图形显示区l1、l2、l3可以单独显示,也可以合成显示。如下图所示:
图2 edm320240-2的图形显示区
显而易见,320×240的图形液晶显示缓存至少需要320/8×240=9600字节。而利用三区显示特性时,通过内部总线需要扩充显示ram为9600×3=28800字节。因此,对于液晶模块厂家来说,硬件设计时通常扩充了32k的显示ram,如62256。实际上,多数时候我们只用单区来显示就足够了。
在嵌入式应用中,如果需要液晶显示程序有较好的移植性,并且系统ram足够大,足够分配9600字节的镜像缓冲的话,那么, 好就象上面的t6963c应用示例一样处理吧。分配9600字节的镜像缓冲后,所有的画点、画线、位图等操作,都是在镜像缓冲ram中完成,你只需要在显示的时候,把镜像缓冲ram中数据送到显示区。
如果应用系统没有足够的ram,也不要紧。我们可以巧妙地应用sed1335提供的特性,把显示区l1,l2当成双缓冲,同样实现双缓冲的显示,一样可以使得屏幕画面变化时没有延时和闪烁现象。不过,此时的画点画线操作都与硬件相关,软件模块的移植性不够好。
具体叙述如下:首先关闭显示区l1,l2,l3;在显示区l1上完成“快照”(即画点画线操作),然后打开l1,即单独显示l1;画面变化时,就把变化后的画面“快照”到l2。当需要刷新显示时,关闭l1,打开l2即可。下次再关闭l2,打开l1。如此交替反复。
当然,sed1335具备3个显示区,有效利用可以完成更加有趣的应用,在此不多谈。下图为定时刷新显示的示意图:
图3 edm320240-2的图形显示
4. 结束语
采用这种方法,具有很多好处:
1. 显示内容更改快。表现在用户界面上,几乎感觉不到刷新和闪烁。
2. 软件模块封装好。菜单编程模块和刷新显示模块分开。菜单编程模块与具体硬件无关,只对镜像ram操作。刷新模块才和硬件相关。软件的更改和移植方便。
3. 可以轻松完成许多特技效果,如画面的滚动,平移推拉,交错,百叶窗等。
4. 由于用户界面保存于镜像ram中,还方便实现远程诊断等功能。
综上所述,双缓冲方式不仅可以实现液晶的快速显示,尽可能地避免屏幕闪烁,延迟,余辉等现象,还可以实现许多有趣和特殊的显示。这种思想也适用于文本型液晶的快速显示,同样也适用于crt等其他有较大显示容量的显示器件。运用之妙,在乎各人了。
【看看这篇文章在百度的收录情况】
相关文章
- 上一篇: 选购传感器类型的解析
- 下一篇: 诠释LED灯条的灯数、色温、亮度