基于液晶控制芯片T6963的液晶模块动态绘图编程方法
扫描二维码
随时随地手机看文章
液晶是人机交互最重要的通道,液晶不光要显示文字信息,还要显示波形信息,所以,编写一套完善的函数库是必不可少的,其中应该包括显示ASCII码、字符串、整型数字、浮点数、汉字、画点、画线等一系列函数。
上层函数的建立离不开底层的驱动,最底层驱动应该是建立在液晶基本时序与指令的基础上。如图1,是液晶模块的基本时序图。
图1 DMF5001液晶模块基本时序图
根据时序图和控制指令,不难写出基本的读写函数。这些函数就是构建上层的基础。之后,还必须了解液晶的基本显示方式和充填方式。如图2,是液晶模块的缓冲区与显示屏的映射关系。T6963控制芯片内部有64KB的缓冲区,可以由程序划分为图形、文本、文本特征3类缓冲区,在不同缓冲区里写入不同数据,在液晶屏上将映射相应的信息,这也就是液晶模块显示信息的原理。
图2 DMF5001液晶映射方式
因为T6963内部含有ASCII码字库,所以要想显示字符信息,只需在文本区内填入相应的信息即可。
如果要显示汉字或图形,则必须先在单片机内部的ROM区建模,然后将这些信息写入液晶的图形缓冲区,在液晶控制模块的控制下,相应的信息就会映射在显示屏上,也就是我们看到的汉字或图形信息了。
如果要实时显示AD采集的波形图以及FFT处理后的频谱图,这里将就动态波形显示用到的技术加以详细介绍。
(1) 点的显示
波形的显示离不开“点”的显示,所谓“点动成线”也就这个道理,对于只有黑白两级灰度的液晶来说,画一个“点”就是将一个像素点亮。所以我们根据时序图,先建立在LCD屏上显示“点”的底层函数。在液晶屏上绘制“点”,有两点需要注意,一是缓冲区空间的大小,二是像素的充填方式。在DMF5001液晶模块中,“点”的绘制需要在图形缓冲区中进行。对于160×128像素的显示屏,图形缓冲区一共占用(160×128)/8=2560字节的空间,每一个字节对应一个地址,也就是一共有2560个地址。考虑到DMF5001图形的充填方式是从上到下,横向填充,加上控制指令本身就支持对一个像素亮灭的控制。所以很容易根据缓冲区的地址,控制液晶屏上某一个点的亮灭,也就是所谓的画“点”了。
(2) 坐标系的建立
显示波形,涉及到多个点的依次显示,前后两个点的显示位置需要被确定,因为只有这样,才能衡量被显示波形的变化程度。所以,在液晶屏上建立一个参考坐标系是很有必要的。由于图形缓冲区与液晶屏上的点是一一映射的,我们不妨先在液晶屏上按照思维习惯规划出一个坐标系,然后根据坐标系的坐标值,再反映射到实际的缓冲区中,这样,我们根据反映射之后的地址,就可以在液晶屏上对应地址显示“点”信息了。正如图3所示。
图3 液晶屏坐标系与图形缓冲区地址之间的映射
(3) 动态波形的形成
我们在液晶上看到的波形是动态的,也就是说波形应该是连续闪动变化的,这里涉及到一个扫描帧数的问题。我们知道人眼的视觉暂留时间是0.1s,也就是说如果图像在一秒钟内连贯变化25次(帧),整个过程看上去就是“动”起来的。对于本次作品的波形显示来说,帧数越高,实时性就越好,当大于25帧后,已经看不出明显的波形刷新过程了。但是由于实际控制器的工作速度有限,以及整个过程运算量很大,只要能保证4到5帧的刷新率,就可满足要求了,当然,这是以牺牲了实时性为代价的。
波形刷新在软件上的具体实现是比较容易的,因为坐标系已经被建立,所以显示区域的大小就是已知的,一旦某次显示区域被写满数据,就马上进行该区域的清除,这样就等于完成了一帧的扫描,往复进行,被显示的波形数据就“闪动”起来了。
(4) 显示数据的合理量化
AD模块采集的数据如果不经过处理而直接送入图形缓冲区用于显示,显示效果是很差的。这是因为液晶屏的高度和宽度都是有限的,也就是说屏幕的可视面积是有限的,加之我们人为规定了坐标系,实际显示的数据很可能会“溢出”坐标系。这就需要我们根据坐标抽的长和宽,合理的缩小(或放大)AD采集的数据。示意图如图4所示。
以本次设计为例,液晶屏原始波形显示区的坐标抽规划为:x轴有128个单位(像素),y轴有64个单位(像素),对于10位的AD,如果采集到最大电压信号值,得到1023的AD值,为了能在显示区域显示出这个信号点,需要进行1024/64=16倍的比例缩小。如果被测量太小,显示不明显,我们同理也可以进行比例放大,如果这时在屏幕上给出相应的放大或缩小信息,就等于实现了显示区域的伸缩扩展,我们可以通过合理的计算,得到一个最佳的显示比例,这也就是数字存储示波器上自动调节波形功能的技术雏形。
图4 显示数据的合理量化
(5) 优化显示效果
按比例缩小后的AD值是离散的,如果直接在屏幕上显示,看到的是一个个离散的点,视觉效果同样很差,所以有必要对这些离散的点进行插值补偿,让它们变得连续光滑。插值补偿的算法很多,不同的算法带来的补偿精度也不同,这里介绍一种最简单的补偿方法:每当显示了一个点,就用变量记录下这个点的坐标信息,当显示下一个点时,对比前后两个坐标的差距,用跟踪的方法,把两个坐标之间差的点补齐,这样,就等于用线把两个点连接在一起,波形看上去就光滑的多了。正如图5所示。
图5 波形优化前后的不同效果
(6) 时标轴左右滚动的实现
根据实际的设计要求,为了方便波形数据的查阅,还设计了可以左右滚动的时标轴。其实现原理是,分别将在文本区显示的自定义ASCII字符(这里是由“|”线构成的时标轴)与在图形区显示的波形在液晶屏上进行合成显示,这样两类信息在两类缓冲区中运算显示,互不干扰,具体的对应信息可以通过之前定义的坐标系换算得到。这里也再次显示出定义坐标系的必要和方便。整个过程示意图如图6所示。[!--empirenews.page--]
图6 时标轴左右滚动的实现
本次设计为DMF5001液晶模块编写了一整套的图形函数,充分满足了显示的需要。其中使用了一目了然的小图标来代表文字信息,更是将整个界面的友好程度提升了一个档次。以下是一些实际显示效果。
图7 波形显示效果图