引言
液晶模块主要完成菜单界面的切换显示; 通信模块主要实现数据的接收与发送。本文以中文液晶显示模块CM320240-7为例, 给出了使用LCD显示模块CM320240-7来实现文本、图形和实时曲线显示的系统设计方法。
液晶显示的内容主要是一些用户关心的实时参数和状态, 其基本操作流程为: 初始化、清屏、显示。初始化主要是复位液晶, 等待对液晶进行操作; 清屏主要是清除掉液晶屏上所显示的内容, 为下一次显示的内容做准备; 显示主要是显示当前想要显示的内容。
1 中文液晶显示模块CM320240-7
中文液晶显示模块CM320240-7是一个中英文文字与绘图模式的点矩阵液晶显示模块, 其内建有12Kbyte的ROM字型码, 可以显示中文字型,数字符号, 英日欧文等字母。同时, 该模块还内建双图层的显示内存, 可支持文字与绘图两种混合显示模式。并可提供全角(16×16) 与半角(×8)文字显示模式。CM320240-7的最大特点就是在强光照射下, 用户依然可以清晰地看到屏幕上显示的内容, 因而非常适合在户外使用。
CM320240-7可以很方便地与ARM9相连接。它具有24个管脚, 其中有8位数据线(DB0~DB7),6 位控制线(RS-数据/命令控制, WR-读写控制,CS2-片选2, CS1-片选1, EN-使能端, /RST-复位端, ) , 4 位电源线( AVSS, AVDD, VSS,VDD), 2位状态线(BUSY-用以回应模块内部的执行使用状况, INT-用以回应模块内部的中断状况), 同时包括背光源正、负端(LED+、LED-),LCD驱动电源输入端和输出端(V0、VEE)。
2 字符和汉字的显示
对于点阵液晶显示器来说, 汉显菜单的设计就是如何通过编程将汉字按一定的格式在屏幕上显示出来。
在LCD上显示字符和汉字之前, 通常都需要先提取点阵码。由于要显示的汉字和字符非常多, 而且它们是任意的, 因而必须要有常用的字符和汉字字库。由于ASCⅡ字符字库比较小, 一般的字模软件就可以生成, 故笔者使用的软件是任意点阵字体生成器, 其操作界面如图1所示。
图1 任意点阵字体生成器的操作界面
任意点阵字体生成器软件界面风格简洁, 操作简便。常用汉字和字符的ASCⅡ码保存在以.dat为后缀的文件里。故以打开文件的方式就可取得汉字和字符的ASCⅡ码, 其操作语句如下:
fp_ST_16_08_ASC =fopen ( " /mnt/Nand1/ST_16_08_ASC.Dat" ," r")
有关在文本和图形显示方式下写入字符和汉字的方法, 在与显示有关的相关资料中已经介绍得很清楚。这里给出的是一个在本程序中用到的显示汉字的函数。通过这个函数, 可以将想要显示的任意汉字和字符显示在液晶屏幕的任意位置上。具体如下:
static void HanZi ( U32 x, U8 y, U8 *data, U8size, U8 reverse_log)
其中, x为横坐标, y为纵坐标, *data为数据内容, size为字体, reverse_log为反白标记。
3 图形曲线的显示
3.1 描点
对屏幕上每一个点进行绘制是绘图的基本条件。在用液晶显示器显示图形曲线时, 首先要给屏幕上的每一个点分配一个二维的坐标。对于CM320240-7所用的320×240点阵液晶, 其左上角第一个点的坐标为(0, 0), 右下角最后一个点的坐标为(319, 239)。这样, 根据二维坐标就可以计算出各点所对应的内存单元, 并给其赋值“1”。而中文液晶显示模块在显示图形的时候,一般是以字符映像(Bit Map) 的方式写入RAM,若RAM的某个位置被填满为“1”, 其LCD面板相对应的位置就会被显示出黑点。因此, 在RAM上所存储的像素资料, 就会对应到显示屏幕(LCD)上, 从而构成文字、符号或图形等显示效果。为了便于运算, 可将每8个点的状态存放在一个字节的内存单元中, 图2给出了显示数据从RAM到LCD显示的映射方式。由此可见, 全屏的320×240个点的状态将存放在(320 / 8) ×240=40×240个字节的内存单元中。
图2 显示数据从RAM到LCD显示的映射方式
填充某一矩形区域的函数为Box_full (U16x_1, U16 y_1, U16 x_2, U16 y_2) , 其中,(x_1, y_1), (x_2, y_2) 为所填充的矩形区域的左上角和右下角的坐标。描一个点就相当于填充一个点阵区域。
清除某矩形区域的函数为Box_eraser (U16x_1, U16 y_1, U16 x_2, U16 y_2) , 其中,(x_1, y_1), (x_2, y_2) 分别为所清除的矩形区域的左上角和右下角的坐标。消除一个点即清除一个点阵区域。通过这个函数可以很方便地清空某个矩形区域的内容, 例如清除图形区域, 或清除需要改变的数据区域等。
3.2 画线
曲线可以视为是由若干直线段首尾相连而成。绘制直线是绘制曲线的基础, 所以首先考虑直线的绘制方法。一般的斜线段也可以看作是由若干水平或垂直的线段首尾连接而成的, 而对于水平直线和垂直直线这两种特殊情况, 则相当于填充某矩形区域, 这可以用前面提到的Box_full() 函数来完成。因此, 曲线的绘制全部都可以转换为直线的绘制, 而其关键就在于确定各个水平或垂直线段首尾两个端点的坐标。下面将重点介绍绘制直线的算法。
处理曲线段首尾两个端点的方法相对比较简单, 即每个端点都沿X轴正向绘制2个相同Y值的像素点, Y为当前点所对应的纵坐标。对于两端点之间剩余的3个像素点, 可分以下三种情况进行讨论。
首先, 当y_0等于y_past时, 很显然, 两端点之间是一条水平线, 其线形如图3 (1) 所示。其函数描述为: Box_full (x_0-3,y_0,x_0+1,y_0)。
图3 几种情况下线段的绘制情形
其次, 如果y_0大于y_past, 此时将分为以下4种情况进行讨论:
第一, 当y_0-y_past=1时, 其情形如图3 (2)所示。其函数描述为:
Box_full (x_0-1,y_0,x_0+1,y_0) ;
Box_full (x_0-3,y_past,x_0-2,y_past) ;
第二, 当y_0-y_past=2时, 其情况如图3 (3)所示。函数描述为:
Box_full (x_0,y_0,x_0+1,y_0) ;
Box_full (x_0-3,y_0+1,x_0-1,y_0+1) ;
第三, 当y_0-y_past=3时, 其情况如图3 (4)所示。函数描述为:
Box_full (x_0-1,y_0+1,x_0-1,y_0+1) ;
Box_full ( x_0 -3,y_past -1,x_0 -2,y_past -1) ;
Box_full (x_0,y_0,x_0+1,y_0) ;
第四, 当y_0-y_past=4时, 其情况如图3 (5)和(6) 所示。函数描述为:
Box_full (x_0,y_0,x_0+1,y_0) ;
Box_full (x_0-1,y_0+1,x_0-1,y_0+1) ;
Box_full ( x_0 -3,y_past -1,x_0 -3,y_past -1) ;
Box_full (x_0-2,y_0+2,x_0-2,y_past-2) ;
而当y_0小于y_past时, 其分析方法与y_0大于y_past时相似, 这里不再重复。
评论
查看更多