基于嵌入式系统的LCD汉字显示
扫描二维码
随时随地手机看文章
引言
随着嵌入式技术的迅猛发展,人机交互界面也越来越显示出它的重要性。实际的LCD应用中要显示的汉字一般很有限,并不需要完整的汉字库,再加上完整字库在程序中要占用大量空间,因而非完整汉字库的研究就有了其自身的现实必要性。本文以AT91SAM7S256处理器的LCD显示模块为例,介绍了非完整汉字库的建立方法及其具体实现。
1 液晶显示原理
液晶显示器LCD (Liquid Crystal Display)主要用于文本、图形及图像信息的显示。液晶显示屏具有轻薄、体积小、耗电量低、无辐射、平面直角显示以及影像稳定不闪烁等特点。液晶是一种介于固态和液态之间的有机化合物。当被加热时,它会呈现透明的液态,而冷却的时候会结晶成混乱的固态。用于液晶显示器的是Nematic液晶,当向液晶通电时,液晶体分子便排列得井然有序,可以使光线容易通过;而不通电时,液晶分子便排列混乱,阻止光线通过。
??从整体来看,TN(扭曲向列型)单色液晶显示器液晶分子的排列就像螺旋形的扭转排列。光线从上向下照射时,通常只有一个角度的光线能够穿透下来,通过上滤光片导入上部夹层的沟槽中,再通过液晶分子扭转排列的通路从下滤光片穿出。一旦通过电极给这些液晶分子加电之后,液晶分子变成竖立的状态,这样光线就无法通过,结果在显示屏上出现黑色。这样会形成透光时(即不加电时)为白、不透光时(加电时)为黑,字符就可以显示在屏幕上了。
2 汉字信息的编码知识
2.1 汉字的编码标准
汉字系统对每个汉字预先规定输入计算机中的代码,即汉字的外部码。计算机为了识别汉字,要把汉字的外部码转换成内部码进行存储和处理。输出时,还将汉字的内部码转换成汉字的字形码。主要的汉字编码有以下几种:
1) 国标码:计算机与其他系统或设备之间进行汉字代码信息交换的标准汉字代码。它用两个字节代码来表示一个汉字。行、列各 94(0-93),用先行后列的两个 7 位二进制数表示。
2) 区位码:每个汉字(图形符号)用两个字节表示,每个字节只用低 7 位,即最高位为 0 的二进制码。汉字编码使用的高字节称为区码,低字节称为位码。区位码共 94 个区,每个区有 94 个位,组成一个 94*94 的矩阵。
3) 机内码:中文或西文信息在计算机系统中的代码表示称为机内码。是计算机对汉字进行存储、运算的实际代码。一般用连续两个字节表示汉字的内码且每个字节最高位为 1。
2.2 区位码、国标码和机内码之间的转换关系
(区位码的十六进制表示)+A0A0H=机内码。国标码+8080H =(区位码的十六进制表示)+A0A0H。国标码=(区位码的十六进制表示)+2020H。
3 完整汉字库下的汉字显示以及汉字英文混合显示
3.1 完整汉字库下的汉字显示原理
汉字的输出是将汉字的笔划离散化,用点阵来表示。点阵的中每个点位只有两种状态:有笔画(1)、无笔画(0)。描述汉字点阵信息的二进制代码集称为汉字的字模。所有汉字和符号的点阵信息就组成了汉字库。
点阵字库文件已经给使用者提供好了,关键在于如何取得汉字的图形,即汉字的点阵字模。首先看一下如何取得汉字的区位码。计算机在处理汉字和 ASCII 字符时 ,使每个 ASCII字符占用一个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上 32(20H),第二个字节的值为位号加上 32(20H)。为了与 ASCII 字符区别开,表示汉字的两个字节的最高位都是 1,也就是两个字节的值都又加上了 128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。具体算式如下:
qh=c1-32-128=c1-160, wh=c2-32-128=c2-160 或 qh=c1-0xa0, wh=c2-0xa0
其中 qh 、wh 为汉字的区号和位号,c1、c2 为汉字的第一字节和第二字节。
根据区号和位号可以得到汉字字模在文件中的位置:
location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。
字模的表示顺序为:先从左到右,再从上到下,依此类推,画满 16×16 个点。这样,一个 16×16 点阵的汉字总共需要 16*16/8=32 个字节表示。因此,当显示16×16 点阵的汉字时,只要根据区码和位码计算出该汉字点阵在ROM 中存放的起始地址,然后从此地址连续地取出 32 个字节的汉字点阵,并写入 LCD 模块对应的地址中,就可以显示出该汉字。
3.2 汉字英文混合显示
在应用中,常需要汉字和英文字符混合显示,在软件处理时需要判断显示的内容是汉字的编码还是英文字符的编码,如果是汉字编码则根据其机内码计算区位码,并根据区位码计算出该汉字在字模中的起始地址。显示16×16 点阵汉字的混合显示软件流程图如图1所示:
图1混合显示软件流程图
按照以上的显示原理可以编写出在完整汉字库下的汉字英文混合显示程序,具体程序代码在很多资料中都有,这里就不再赘述。
4 非完整汉字库的建立及汉字英文混合显示
4.1 非完整汉字库的建立
在很多的人机界面中,虽然显示的汉字数量较多,但实际无重复的汉字数却较少,而且不同的应用环境用到的汉字也有其自身的特殊性。如果是提供少量的互不重复的汉字,较好的做法如下:利用 DM Tool 字模转化工具生成所需要的汉字模,然后利用 123.exe 软件生成相应的机内码。接下来就可将以上所得到的汉字的机内码和其字模合在一起组成数组,如此反复就可以将所需要的所有汉字都形成数组,最后将这些汉字组成二维数组。如下所示:
const UINT16T DDSHZTable[][17] = {
{ //时
0xCAB1, //机内码
0x0010, 0x0010, 0x7c10, 0x4410, 0x47fe, 0x4410, 0x7c10, 0x4510,
0x4490, 0x4490, 0x7c10, 0x0010, 0x0010, 0x0010, 0x0050, 0x0020//字模
},
……
}
在定义上面的二维数组时不规定数组的大小,这样就可以方便地添加自己需要的汉字。要显示特定汉字的时候,只需要从数组中查找内码与要求汉字内码相同的即可获得字模。
4.2 软硬件设计
下面结合AT91SAM7S256处理器介绍LCD 模块的软硬件设计过程。
4.2.1 硬件电路设计
LCD 模块采用 PM04OX1,LED 背光。320*96 点阵,256 色显示,亮度控制:6位。背光LED :6支(串联),亮度控制 2位,背光电流 2.5mA~20mA。CN7,CN8: 连接LCD面板 PM042OX1; CN6: LCD背光电源;U6: Timing Controller,PVI-2003A; U8: VS_ASIC, MCU-LCD 接口转换逻辑。以下介绍 MCU-VS_ASIC-Timing Controller 硬件接口。连接 LCD 面板的接口信号包括: LCDCLK, R[5:0],G[5:0],B[5:0], VSHS 和 VSVS。其中 VSHS, VSVS 来源于 MCU 的PIO; LCDCLK来源于 MCU-SPI的 NPCS3; R[5:0],G[5:0],B[5:0]是 U8 根据 MCU-SPI 的VSCK(SPI-SCK)、VSDO(SPI-MOSI)、LCDCLK (SPI-NPCS3)和 VSVS 产生。
LED 驱动 (LED0~LED15) 是 U8 根据 MCU-SPI 的 VSCK(SPI-SCK)、VSDO(SPI-MOSI)、LCDCLK(SPI-NPCS3) 和 VSVS 产生。 LCD扫描方向选择:RP1、RP2 为 LCD 扫描方向选择,它们只能焊接其中的 1 只。LCD驱动原理框图如图2所示:
图2 LCD驱动原理框图
4.2.2 软件设计
通过 SPI-DMA 完成一个整行的扫描过程。在该过程中,DMA(直接存储器存取) 向 SPI(串行外设接口) 传输 400 个 8 位数据。一个完整周期需要有 104 行扫描。其中第 0 行扫描的前 3 个数据为 PMRAM 数据,其他数据无意义(可以是任何数)。第 1 行和第 103 行扫描的全部数据均无意义;第 2~102行为数据扫描,每一行数据中前 64 个和后 16 个数据无意义,中间 320 个数据为显示数据。
LCD驱动过程是由 SPI-DMA 操作配合 SPI-DMA 中断服务程序完成的。应当指出的是,在MCU相应的设备按要求初始化后,由于没有启动SPI-DMA,LCD驱动过程不能自动开始。因此显示初始化程序应当:
1) 设置SPI;
2) 设置TIMER1(可以启动TIMER);
3) 设扫描行指针n=0;
4) 设DMA传输数据格式(8位/次,400个数据);
5) 启动DMA。
以上过程在完成一行空扫描后, 进入连续的 LCD 扫描过程。
4.3 程序举例
以下列出了16x16方阵汉字显示的部分程序代码:
wm = *(s + i + 1); //计算位码
ISN = qm<<8;
ISN += wm; //机内码
ii=0; //先定位在第一个汉字
while((ISN!=DDSHZTable[ii][0]) && (DDSHZTable[ii][0] !=0xffff) )
ii++; //寻找与ISN相同的机内码,即寻找要显示的汉字
for( j = 0; j < 16; j ++ )
hzbuf[j] = DDSHZTable[ii][j+1];//取字模
for( y = 0; y < 16; y++ ){
for( x = 0; x < 16; x++,Hk++ ){
Hk = Hk % 16;
if( hzbuf[y] & (0x8000 >> Hk) ){
//确定y行x列是否有笔画
xx = x0 + x + ChiWords * 16;
LCDRam[y+y0][xx] = ForeColor;//显示像素
}
}
}
显示英文字符的原理及程序代码与汉字的类似,就不再赘述。
5 结束语
建立非完整汉字库最大的特点是可以按照现实需要柔性地显示汉字、软件编程容易、可混合显示汉字和英文字符。作为人机交互界面的重要部分它可被广泛应用于工业控制、医疗、科研以及教学等领域。