基于ST7920控制器的液晶显示波形方案研究
2015-11-07四川职业技术学院电子电气工程系四川遂宁629000
刘 宸(四川职业技术学院电子电气工程系,四川 遂宁 629000)
基于ST7920控制器的液晶显示波形方案研究
刘宸
(四川职业技术学院电子电气工程系,四川遂宁629000)
文章详细介绍了以ST7920为控制器的中小尺寸12864液晶实现波形显示的多种方案,提出了两种改进算法,并讨论各方案的优缺点.总结出应根据不同应用场合的需求来选择对应的方案.
ST7920;12864;液晶;波形
由于LCD液晶显示器件具有电压低、功耗小、显示信息量大、使用寿命长等优点,被广泛应用于仪器仪表的人机交互界面.同时,在很多领域中使用的便携式数字化设备越来越多以单片机为控制核心、用LCD作为显示终端.12864点阵液晶是中小尺寸液晶的典型代表,应用广泛.而运用12864液晶显示动态波形,在近几年的电子设计大赛中有这样的题目要求,在发明杯和创新创业大赛中的一些项目也有这样的实际需求,比如:心率监测仪、数控电源、甚至数字示波器等.利用液晶显示动态波形能观察各种不同信号的幅度随时间变化的波形曲线,还可以用它显示各种不同的电量,如电压、电流、频率、相位、幅度等.
1 点阵液晶的种类
12864液晶种类繁多,从液晶的颜色来分,有黄绿底黑字屏,蓝底白字屏,灰底黑字屏等,从显示方式来分有STN、FSTN、DFSTN等.但对于开发者而言,最重要的是液晶控制器的类型.常用的控制器有四种,每一种都有自己的特点,当然指令也各不相同.开发者不搞明白液晶类型,肯定是无从下手.
ST7920类:这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式.该类液晶支持68时序8位和4位并行通信以及串行通信.在电子市场中占有较大比例,但在仿真软件PROTEUS中没有该类液晶的仿真模型,因而不支持仿真.常见的QC12864B就属于ST7920 类.
KS0108类:这种控制器指令简单,但不带字库,需用户自己编制字库.支持68时序8位并行通信.支持在PROTEUS中仿真运行.
T6963C类:这种控制器带西文字库.有文本和图形两个图层,并且支持两个图层的叠加显示.支持80时序8位并行通信.
COG类:常见的控制器有S6B0724和ST7565,这两个控制器指令兼容.支持68时序8位并行通信,80时序8位并行通信和串行通信.COG封装类液晶的特点是结构轻便.
其中PSB是ST7920类液晶的标志性引脚;CS1 和 CS2是 KS0108类引脚的标志性引脚;FS是T6963C类液晶的标志性引脚.可以根据这些引脚来判断液晶的类型.
2 液晶显示波形的方案
实时显示采集信号的波形,就是根据时间轴和采集值幅度在液晶上画点和画线,随着时间的推移,每隔单位时间就需要显示采集信号的一个点.显示的点在时间轴上是连续的,但信号的幅值不一定是连续的,当前后两个连续时间点的幅值不连续时,为了显示效果更优,则需要开发者人为地把这两个点之间的空白以竖线显示出来.
2.1KS0108控制器液晶方案
从程序的简化来说,最好选择KS0108控制器的液晶方案,虽然ST7920控制器的也有画图方式,但是用它显示动态波形会浪费很多数据处理的时间。究其原因,是因为KS0108控制器的显示RAM字节是纵向排列,对应液晶点阵的列,显示波形时,时间轴对应液晶的128列,信号幅值对应纵向排列的8个字节,画点程序处理就相当简单,算法是先定位页(63-DATA)/8,再输出数据0X01<<(DATA%8)即可.但缺点是采用KS0108控制器的液晶不带字库,显示字符不方便,而且只能并行传输数据,如果应用场合的处理器引脚资源有限,则不能实现.因此本文主要研究支持串行模式的ST7920控制器液晶方案.
收稿日期:2015-05-25
作者简介:刘宸(1982-),男,四川遂宁人,四川职业技术学院讲师.研究方向:电子系统设计.
2.2ST7920控制器液晶方案
2.2.1读取旧显示数据
ST7920控制器的液晶显示器,显示RAM是横向排列的,液晶更改GDRAM只能横向16位改,即写数据必须横向写两个字节的数据,高8位和低8位. ST7920控制器型液晶图形显示坐标如图1.
图1 ST7920控制器型液晶图形显示坐标
为了不把当前点附近的16位数据丢失,要画点和画线,就必须读取当前点所在位置的旧显示数据,再与当前点合成为新数据.而读取旧显示数据,大体上分两种方案:
方案A:读取液晶中的数据,当前点所在位置的旧显示数据(16位).
方案B:在单片机内存中开辟1K字节的空间(128*64/8bit=1024字节),用作虚拟LCD12864的GDRAM,所以不用读液晶,读的是内存中的备份数据.
ST7920绘图时候一般都选择在并行模式,因为绘图时需要回读液晶中GDRAM的数据,在串行模式下,经试验不能回读数据.因此要选择方案A则必须选择并行模式.并行模式下需占用11个I/O引脚(RS、RW、E和8个引脚的并行端口),然而在串行模式下绘图只占用 3个 I/O引脚(CS、SID和SCLK),其中CS可以直接硬件连接VCC保持高电平,则甚至只用2个I/O引脚.所以,如果应用场合受限于I/O口资源,则应该选择方案B,但缺点是需要开辟1024个字节的内存空间,增加了内存开销,真所谓鱼与熊掌难以兼得.
方案A的缺点是:(1)采用并行模式,占用引脚资源比方案B多;(2)当要补充画竖线时,该列的幅度差值有N个点,则需要画点N次,导致每列画点的耗时不同.
此外还可以采用Bresenham画线算法,画出任意两点间连成的直线,但对于我们这里的需求,画波形而言,只需要画竖线,因此还是面对同样的缺点,即每列画点的耗时不同。若在慢速采集的场合,采集速度慢于显示速度,每列画点耗时不同的影响就可以忽略不计.
2.2.2针对方案B的优化
在特定应用场合,比如单片机使用的是MSP430 G2553,它的RAM只有512字节,或者AT89S52单片机,仅有256字节,根本不够开辟1K字节内存空间来备份数据.以下针对方案B的优化方案可以解决此问题.
方案B-1:虚拟LCD12864的GDRAM时,不需要在单片机内存中开辟1K字节的空间,只需要存储当前点位置的16位宽和64行的旧显示数据,即64 行*16列/8=128字节.为什么是所有行,因为竖线最多可能有64行,要输出的数据就应该包含所有行的数据.程序中,由于要留一行显示必要的文字,因此只剩48行供波形显示,其程序要点是:
b=0x8000;//16位数据首位置
x&=0x70;//得到显示的数据的首位在数组中的位置,因为液晶是在0,16,32,48,64,80,96,112列写数据,所以在这8个点开始改t[48]数据,也可写成:x=x/16;x=x*16;或者x=x>>4<<4;均可实现,获得数据首位置
for(i=0;i<16;i++)//t[48]为16位存储空间,根据ad采集值数组wave[x]更改t[48]数据,打点且连了两点间的竖线
{
m=wave[x+i];n=wave[(x+i+1)%128];//得到前后两点的高度
if(m>n){j=m;m=n;n=j;}
j=0;
while(j while(j<=n){t[j]|=b;j++;}//从小值到大值,m到n打黑点,连成竖线 while(j<48){t[j]&=~b;j++;}//高于ad值,打白点,不显示 b>>=1;//指向16位数据的下一位 } 程序中合成数组t[48]的过程中,要改48行16位中的全部点,所以要改写16*48次数据,处理数据较多.再此基础上进一步优化,提出以下方案. 方案B-2:先计算该点在16位数据的相对位置,根据ad值,只改写t[48]的16位数据中的当前这一位,改写48行数据,只改当前点这一列.再将数组t[48]输出.程序要点是: if(x%16==0){for(i=0;i<48;i++)t[i]=0;}//每隔16点,清空数据 i=x%16;//取得相对位置 b>>=i;//指向该列 m=wave[x-1];n=wave[x];//得到前后两点的高度 if(m>n){j=m;m=n;n=j;} j=0; while(j while(j<=n){t[j]|=b;j++;}//从小值到大值,m到n打黑点,连成竖线 while(j<48){t[j]&=~b;j++;}//打白点,不显示 此方案改写数组的次数是方案B-1的16分之1,速度更快,单片机处理耗时减少,但由于单片机的耗时比写数据到液晶的耗时相对小得多,所以实际显示效果优化有限.但对于快速采集的场合,显示速度慢于采集速度,此时方案B-1也有优势,写当前点时会附带着把之前未显示出来的点显示出来了,而方案B-2则只改写显示当前列,之前若未来得及显示的点则无法再显示出来.基于此,提出以下方案. 方案B-3:可以每当够16位点时才写一次液晶,优点是写液晶的次数减少,显示速度约为方案B-2的16倍,但缺点是观看示波效果时会有顿挫感.程序示例: if(x%16==0)outwave(x-1);//每当够16位时才写一次液晶显示16列*48行,但也需要根据ad暂存数组wave[x]的值改16位t[48]数据. 在选择波形显示方案时,要综合考虑:控制器是否支持串行模式、处理器的I/O引脚资源、内存占用量、信号频率、AD采集速度等,所以开发者应该根据不同应用场合的需求结合各方案的特点来舍取,选择对应的方案. [1]李明生.电子测量与仪器[M].北京:电子工业出版社,2010. [2]谢兴红,林凡强,吴雄英.MSP430单片机基础与实践[M].北京:北京航天大学出版社,2008. 责任编辑:张隆辉 TN 141.9 A 1672-2094(2015)04-0158-033 结语