“左手倒影右手年”通过精心收集,向本站投稿了8篇VxWorks汉字显示解决方案,下面小编为大家带来整理后的VxWorks汉字显示解决方案,希望大家喜欢!
- 目录
篇1:VxWorks汉字显示解决方案
实现本地汉字显示的方案一定会涉及到WindML,只是不同的方案对WindML的依赖程度有所不同,一般有如下几种。
①利用WindML对双字节编码的支持,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉辽码到汉字显示。这种方法使用了系统机制,最根本的解决方法,并使WindML的其它上层组件很方便地实现汉字显示。
②自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节和单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到WindML上。
③完全自己开发一套点阵存储、点阵获取、点阵显示、汉字显示函数,使用者使用特定的汉字显示函数把汉字显示出来。该方法具有最大的灵活性,甚至不理睬WindML的任何机制,直接在上层组件里实现,但这种方法使程序的中英文混合显示变得复杂,程序可移植性也比较差。
本文将就第一种显示方案和第一种汉字显示方案详细论述WindML的双字节编码机制,并利用该机制构建WindML汉字显示框架,并论述Zinc如何使用该框架。这些机制和思路其实是任何方案都需要考虑的,对绕开WindML的方案也具指导和借鉴意义。
3 WindML的点阵参数
①每个字模都有一个占据的空间,该空间对于点阵字库里的每个字是一样大的,所有字符点阵的大小都不应该超过该空间,如果超过,显示时超出部分将被截掉。相关参数有:
maxAdvance――最大宽度(横向)大小,以点为单位。
MaxAscent,maxDescent――maxAscent+maxDescend是最大长度(即纵向)大小,两数的交界决定了一个baseline,maxAscent是baseline以上的长度,maxDescent是baseline以下的部分。Baseline对于定位具体字符点阵的打点起始位置非常重要,另外如果有一行来自同一个字符集的字符串,则这些字符的baseline是在一条线上的。maxAscent+maxDescent有时被称为字符表高度height,注意要与下面所述的字符高度区别开来。
②每个字符点阵也有一个范围大小,其大小与每个字符有关。该大小一般不会填满整个字模空间。相关参数有:
width――宽度。
height――高度。
ascent――点阵打点开始位置在baseline之上的偏移,如果是负
数,则点阵在baseline之下开始打点。
Ascent和height决定了点阵从字模的多少行开始打点,要打多少行。而列的打点起始位置,固定是0,即字模的最左边,所以只有width描述打点的宽度。
③字符横向和纵向都要有额外空间,以防止字符粘接重叠。相关参数有:
leading――行间距。
④对字符的一些变换选项,字符读取的标志等。相关参数有:
pixelSixe――平均行、列大小。
weight――行、列加粗属性。
italic――斜体属性。
spacing――字符行间距属性。
charSet――字符集标志。
faceName――字符集名称。
familyName――字符集的家族名称。
scalable――字符放大缩小比例。
WindML显示字符时,以maxAscent+maxDescend作为字符高度(不加leading),以width作为字符宽度(不以maxAdvance,不判断spacing);根据字符ascent和字符height取出字符点阵数据,进行weight、italic、scalable等运算(很多运算需要用户开发),然后输出到屏幕。
4 WindML的点阵存储结构和操作方法
WindML双字节编码显示的参数和实现思路集中体现在点阵存储文件的结构上,该文件的框架如下(这些文件在WIND_BASE/target/src/ugl/fonts/bmf目录下):
UGL_LOCAL const unsigned char UGL_FAR_DATA
page0Data[]=
{…
/*0x0023('#')*/
0,/*page*/
0x23,/*index*/
0,/*size(MSB)*/
20,/*size(LSB)*/
8,/*width*/
16,/*high*/
14,/*ascent*/
0x00,0x00,0x00,0x00,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0xfe,0x44,0x44,0x44,0x00,/*数据*/
/*0x0024和其它字符*/
…
/*结束*/
0,0,0,0
}/*西文扩展为双字节编码的点阵表*/
/*上表解析:
page+index就是该字符的ASCII编码,过扩成了双字节;
size(MSB)+size(LSB)是该字节的'点阵信息长度,注意实际描述体的长度是2(2字节page,index)+该长度+1(从0开始编大小,所以从1数据要加1),而ascent之后的真正点阵数据的大小是该大小减4;
width+height是该点阵资料的宽度和高度;
ascent是点阵处在baseline以上的偏移位置,baseline的位置要看整个字符表描述结构的定义;
data是按行扫描得到的点阵资料,是列递增把行显示效果排成一个连续空间后,按字节来描述每位的打点状态;如果行宽是8位的整数倍,不会把位补0去凑8位整数倍 。
字符点阵描述数据依次往下排列,直到以4个0标志结束。
*/
UGL_LOCAL const unsigned char UGL_FAR_DATA
Page1Data[]=
{ 0x81,/*page*/
0x40,/*index*/
0,/*size*/
36,/*size*/
16,/*width*/
16,/*hight*/
14,/*ascent*/
0x00,0x08,0xff,0xfc,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x10,0x1f,0xf8,0x00,0x10,
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x02,0x20,0x01,0x40,0x00,0x80,
/*其它字符*/
…
/*结束*/
0,0,0,0
}*/国标码对应的点阵表*/
/*上表解析:
数据含义与西文表类似,注意字码是双字节国标码*/
UGL_LOCAL const unsigned char *const pageArray[]
{ page0Data,
page1Data,
UGL_NULL
};/*总的点阵资料表*/
/*上表解析:
把分类的点阵资料表汇集成一张表,总表以UGL_NULL结束,注意各个分表是以0,0,0,0结束。
可以把汉字表按GB2312编码的page分类,构建多个汉字分表,然后把分表指针填入该表。当然,也可以做成一个汉字大表,把指针放在该表,甚至也可以把中西文点阵做成的中西文混合大表,然后把该表指针放在该数组里。
*/
const UGL_BMF_FONT_DESC uglBMFFont_Song_16=
{
/*UGL_FONT_DESC结束*/
{
{16,16}, /*点阵大小*/
{UGL_FONT_BOLD_OFF,UGL_FONT_BOLD_OFF},
/*宽度*/
UGL_FONT_UPRIGHT, /*斜体*/
UGL_FONT_PROPORTIONAL,/*行间距属性*/
UGL_FONT_UNICODE, /*字符集*/
“Song 16x16Dot”, /*字体名称*/
“Song” /*字体系列名称*/
}/*点阵名称等点阵属性表*/
/*UGL_BMF_FONT_DESC结构*/
/*点阵表的属性和位置*/
2, /*行间距*/
14, /*最大上偏移位置*/
2, /*最大下偏移位置*/
14, /*最大宽度*/
pageArray /*字形页*/
};/*点阵描述结构*/
/*上表解析:
首先是定义属性表,然后是定义字模和间距,并定义总的点阵描述表指针。
*/
最后定义的const UGL_BMF_FONT_DESC uglBMFFont_Song_16包含了该点阵的所有信息。只要能定位该结构,则任何能在该点阵表内匹配出字码的字都可以显示出来。WindML选择不同的点阵就是选择不同的该结构去做点阵寻址,其实现的大体过程如下:
①WIND_BASE/target/src/ugl/config/uglBmfCfge文件描述了整个系统能使用的字符集,如:
extern const UGL_BMF_FONT_DESC uglBMFFont_Courier_12;
extern const uglBMFFont_Song_16;/*就是上面的例子*/
const UGL_BMF_FONT_DESC * uglBMFFontData[]=
{
&uglBMFFont_Courier_12,
&uglBMFFont_Song_16,
NULL
};
②通过如uglDriverFind (UGL_FONT_ENGINE_TYPE,0,(UGL_UINT32*)&fontDrvId);的调用定位点阵驱动,即控制对点阵表访问、打点等操作的函数;
通过如uglFontFindString(fontDrvId,“familyName=Song;pixelSize=16”&systemFontDef);的调用定位点阵描述结构;
通过如fontSystem=uglFontCreate(fontDrvId,&systemFontDef));的调用绑接点阵和点阵驱动,并标识为fontSystem;
如此重复创建多个字符集的点阵标识。
③通过如:uglFontSet(gc,fontSystem);的调用设置当前字符集;
通过如uglTextDrawW(gc,iX,iY,iLength,caString);的调用在iX,iY的位置显示caString里的字码。
可见,只要开发者根据上述的存储结构开发出对应的字符点阵,然后把点阵描述结构加入到uglBMFFontData,便可以用系统的函数使用这些点阵了。在Dos/Windosw、Linux系统下一些应用程序,可以把操作系统的点阵导出为C文件或数组,把这些导出的文件加以调整,就可以得到VxWorks系统支持的格式。
5 Zinc对汉字的支持
只要WindML的汉字支持做成功,则可以按如下方法使Zinc支持汉字:
WIND_BASE/target/src/zinc/generic/i_ugldsp.cpp文件是WindML与Zic的接口文件,在ZafScreenDisplay::ZafScreenDisplay函数里使用上述的函数定义了Zinc要使用的字符集。把这些字符集改成汉字字符集,并且把Zinc配置成支持UNICODE的方式重新编译,则Zinc就自然支持汉字显示了。
6 注意事项和总结
在使用过程中,还要注意几个问题。
①Tornado对汉字的编译,如果把汉字定义为如short ca[]={'董',0x00}(把单个汉字定义在单引号),则编译生成的目标码是正序的国标码;如果定义为“董”(双引号定义出的汉字字符串),则编译生成的目标码是反序的国标码。这样,就必须约定一种定义以根据该约定产生的国标码来构建字符点阵表(以根据该约定产生的国标码来构建字符点阵表(需要改变表里面的字码顺序)。
②如果使用双引导定义汉字字符中,要注意该串数据是以一个字节0结束,使用uglTextDrawW要求是以字为单位,所以,需要在该字节串结尾补一个0(“000”即可)。
③有些字库表的字码是UNICODE的编码,尤其是使用一些操作系统的点阵导出程序生成的字库表。UNICODE编码与国际码有一一对应关系,可以把这样的字库表转换过来或者在程序里适当位置把要显示的内容转化为UNICODE再显示。
本文就嵌入式操作系统上作用汉字这一热门论题,论述了VxWorks上的图形实现方案、汉字开发方案,图形组件WindML对多字节码的支持特性,并在论述特性的同时,列举了宋体16点阵的框架,帮助汉字开发者理解点阵实现的细节。在论述WindML汉字操作函数之后,提出了在Zinc层实现汉字显示的方法和编程时注意事项。这套方案已经成功地实现,并在上海大众的导航产品、南京电力的电力控制产品等项目上获得成功的应用。文章的作者都在VxWorks操作系统上做了多年的开发和支持,感兴趣或需要帮助的朋友可通过donleo@china.com.cn与我们联系。
篇2:VxWorks汉字显示解决方案
摘要:论述VxWorks上WindML对多字节码的显示支持,着重讨论其存储结构和意义,并给出汉字显示的实现方法。
关键词:VxWorks操作系统 WindML组件 汉字点阵 国标编码
1 VxWorks操作系统图形显示方案
VxWorks作为嵌入式实时操作系统,在国内应用已非常广泛,但VxWorks原厂商没有直接提供完备的汉字显示解决方案。本文这个热点论题,通过对VxWorks显示组件的分析,具体给出一种汉字显示的方案。
VxWorks的汉字显示首先需要一种图形解决方案,只有工作在图形模式下才可能显示汉字。VxWorks有三种显示方案可供选择。
(1)WindML+Zinc
WindML是Wind River Mutli-media Library的简称,其中包含UGL(Universal Graphics Library)。该组件直接控制显示硬件,主要提供显示模式设置、标准输入输出控制、点线面作图等函数,编程接口很类似于Torbo C、Borland C里的图形库。Zinc基于WindML,提供了类Widnows风格的接口,有各种控件被封装于内,编程接口很类似于Windows编程。
(2)WindML+Jworks
Jworks提供Java的支持,在VxWorks上启动Java虚拟机来解释Java语言;图形开发编程接口是Java语言,Java虚拟机的图形实现基于WindML。
(3)Web Server+WindML+Jworks+Browser
Web Werver使显示编程接口成为编写网页,可以通过远程的Browser来访问而使设备具有远程显示接口,也可以在本机做Browser使设备具有本机显示接口。该Browser的实现需要WindML或Jworks的支持。
上述方案内,纯Web Server的方案不需要本地汉字显示,只要在网页上放国标码或Unicode码等,由远程的Browser去实现显示;其它方案基本上都需要WindML的支持,这是因为VxWorks系统里所有底层的显示操作都是通过WindML实现的。
篇3:VxWorks汉字显示解决方案
实现本地汉字显示的方案一定会涉及到WindML,只是不同的方案对WindML的依赖程度有所不同,一般有如下几种。
①利用WindML对双字节编码的支持,实现对汉字的'点阵存储、点阵获取、点阵显示的全过程,并使用WindML的双字节显示函数实现汉辽码到汉字显示。这种方法使用了系统机制,最根本的解决方法,并使WindML的其它上层组件很方便地实现汉字显示。
②自己开发点阵存储、点阵获取、点阵显示,改造WindML的双字节和单字节显示函数,使其能判断汉字码,一旦判断出汉字码,则使用自己开发的点阵获取、点阵显示等把汉字显示出来。该方法对点阵的操作更加灵活,适合非标准的点阵算法,或者当开发者已有成熟的点阵操作方法时,把该方法绑接到Win
[1] [2] [3] [4] [5] [6]
篇4:单片机系统中的汉字显示
单片机系统中的汉字显示
摘要:需要显示的汉字较多时,单片机系统中的汉字编码非常繁琐。本文介绍一种直接利用PC机的汉字内码作为单片机系统的汉字编码,以简化系统的设计。关键词:单片机 液晶显示器 29F040 汉字显示
引言
在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字。通常的汉字显示方式是先根据所需要的汉字提取汉字点阵(如16×16点阵),将点阵文件存入ROM,形成新的汉字编码;而在使用时刚需要先根据新的汉字编码组成语句,再由MCU根据新编码提取相应的点阵进行汉字显示。在这种显示方式中,如果使用的流字数量较大或语句较多时,利用汉字的新编码组成语句将是一件十分繁琐而枯燥的工作。针对这种情况,本文提出了一种十分简单的方式――直接利用PC机的汉字内码作为单片机系统的编码。下面以8031单片机系统为例阐述如下:
一、硬件组成
本系统中采用香港精电公司的内置T6963控制器[1]的240128T点阵图形液晶显示器。该显示器1行为240点,能容纳16×16点阵的汉字15个,总列数为128点,能显示8行汉字。为了使用MCU操作可使用1片512KB的存储器(如本系统中的29F040)用来存储全部的.国标16×16点阵汉辽、8×16的ASCII码点阵数据以及汉字语句编码数据。为了降低成本和减小体积,对于速度要求不是很高的场合也可采用大容量的串行数据存储器,如AT45DB041B。具体的硬件控制电路如图1所示(与汉字显示无关的电路略)。
由于29F040的容量为512KB,而5031微控制器只能管理64KB的数据间,所以可将29F040分成16页,每页32KB,占单片机系统数据空间的8000H~0FFFFH(剩余32KB为单片机系统的其他存储器和外设)。页码由单片机的P1.0~P1.3选择。液晶显示器的地址为7FF8H~7FF9H。
(本网网收集整理)
二、汉字显示原理及软件设计
UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国标汉字点阵文件和8×16的ASCII码点阵文件,以二进制格式存储。在文件HZK16中,按汉字区位码从小到大依次存有国标区位码表中的所有汉字,每个汉字占用32个字节,每个区为94个汉字。在文件ASC16中按ASCII码从小到大依次存有8×16的ASCII码点阵,每个ASCII码占用16个字节。
在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节:第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去0A0AH就得该汉字的区位码。
例如汉字“房”的机内码为十六进制的“B7BF”,其中“B7”表示区码,“BF”表示位码。所以“房”的区位码为0B7BFH-0A0A0H=171FH。将区码和位码分别转换为十进制得汉字“房”的区位码为“2331”,即“房”的点阵位于第23区的第31个字的位置,相当于在文件HZK16中的位置为第32×[(23-1) ×94+(31-1)]=67136B以后的32个字节为“房”的显示点阵。
在本单片机系统中,起始地址的高4位为页号,送P1口,低15位为数据区地址,送指针DPTR。利用“MOVX”指令连续取32个字节送LCD的相应位置,就能实现正确的汉字显示。
ASCII码的显示与汉字的显示基本原理相同。在文件ASC16中不存在机内码的问题,其显示点阵直接按ASCII码从小到大依次排列,只是每个ASCII码在文本文件中只占1个字节且小于80H,而且ASCII码为8×16点阵,所以在ASCII16文件中,每个ASCII码的点阵也只占16个字节。
首先提取16×16的国标汉字点阵和8×16的ASCII码点阵(如UCDOS软件中的HZK16和ASC16)并将其直接写入29F040。其中HZK16(共256KB)点0~7页。为了便于编程,ASC16虽然只有4KB,也单独占用第8页。其余剩下的空间用来存储汉字语句的编码。
由于240×128点阵的LED显示器每个只能显示15个汉字(16×16点阵汉字),即30个字节。所以可将需要显示的语句按30个字节为1行进行编写,不足30个字符的则补空格。在PC机上进行录入时,每行30个字符再加上回车键和换行符,实占32个字符。所录入的语句以纯文本形式存盘,再将该文本文件以二进制的形式写入29F040的第9页。那么,以后根据需要显示的语句行号便可以进行正确的显示。此,作者推出荐使用DOS版本的WPS软件的“编辑非文收文件”功能,它能清楚地显示每行是否有30个字符。
根据以上原则,显示1行汉字的具体程序框图如图2所示。
>
为方便读者,将已经在实际应用中中通过的汇编子程序列出如下(关于LCD控制器T6963的用户法请见参考文献1)。
LCDCOM EQU 7FF9H
LCDDAT EQU 7FF8H
;显示1行汉字子程序
;汉字语句位置编号DPTR;行号:R6 PRHZ:MOV 24H,DPH
MOV 25H,DPL
PUSH DPH
PUSH DPL
MOV A,DPH ;计算页号
RR A
RR A
ADD A,#9;从第9区开始存放每行字符的机内码
ORL A,#0F0H
MOV P1,A
LCALL RL245 ;行号乘以32(每行32个字符)
SETB 24H,7 ;数据地址位于8000H~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R0,#0E0H
MOV R7,#30 ;连续取出30个字符至0E0H内部数据存储器
PRHZ3:MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,PRHZ3
MOV 1DH,#30 ;显示0E0H后的一行字符(共30个)
MOV R5,#0 ;当前列R5
MOV R0,#0E0H
MOV A,#7FH ;是否为ASCII码?
CLR C
SUBB A,@R0
JC DPHZ1
MOV 26H,@R0
INC R0
MOV 24H,R6 ;ASCII码显示
MOV 25H,R5
LCALL PRASCII
SJMP PRHZ4
DPHZ1:MOV 24H,@R0 ;是汉字则将机内码送24H25H
INC R0
MOV 25H,@R0
INC R0
MOV A,25H
CLR C
SUBB A,#0A1H ;机内码转换为二进制的区码和位码
MOV 25H,A
MOV A,24H
CLR C
SUBB A,#0A1H
LCALLDPONHZ ;显示1个汉字
DEC 1DH
INC R5
PRHZ4:INC R5
DJNZ 1DH,PRHZ5
POP DPL
POP DPH
RET
PR0:MOV DPTR,#LCDCOM ;读状态
MOVX A,@DPTR
RET
PR01:LCALLPR0 ;读、写一数据前
JNB ACC.0,PR01
JNB ACC.1,PR01
RET
PR02:LCALL PR0 ;连续读前
JNB ACC.2,PR02
RET
PR03:LCALL PR0 ;连续写前
JNB ACC.3,PR02
RET
PR1:LCALL PR01 ;双字节参数R2,R3
MOV A,R2
LCALL PR14
PR11:LCALL PR01 ;单字节参数R3
MOV A,R3
LCALL PR14
PR12:LCALL PR01 ;无参数指令R4
MOV A,R4
SJMP PR15
PR14:MOV DPTR,#LCDDAT
PR15:MOVX @DPTR,A
RET
RL245:MOV R7,#5 ;24H25H左移5
RLL1:CLR C
MOV A,25H
RLC A
MOV 25H,A
MOV A,24H
RLC A
MOV 24H,A
DJNZ R7,RLL1
RET
;行位置R6(0~7),列位置R5(0~29),汉字区别24H,位码25H
DPONHZ:MOV A,24H ;显示1个汉字
MOV B,#94 ;每区94个汉字
MUL AB
ADD A,25H
MOV 25H,A
CLR A
ADDC A,B
MOV 24H,A
RR A ;获得32KB为1页的页号
RR A
ORL A,#0F0H
MOV P1,A ;页号送P1口
LCALL RL245 ;汉字序号乘以32
SETB 24H,7 ;因为存储器位于单片机系统的7FFFH~0FFFFH
MOV DPH,24H
MOV DPL,25H
MOV R2,#32 ;在该位置连续取出32个字节
MOV R1,#0C0H
DPHZ2:MOVX A,@DPTR
INC DPTR
MOV @R1,A
INC R1
DJNZ R2,DPHZ2
MOV R1,#0C0H
MOV A,R6 ;根据行列位置计算LCD指针
MOV B,#16
MUL AB
MUL B,#30
MUL AB
ADD A,R5
MOV 25H,A
MOV R2,A
CLR A
ADDC A,B
MOV 24H,A
MOV R3,A
MOV 26H,#16 ;将取出的点阵送LCD显示
PRHZ6:MOV R4,#24H
LCALL PR1 ;双字节参数R2,R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11 ;单字节参数R3
MOV A,@R1
MOV R3,A
INC R1
MOV R4,#0C0H
LCALL PR11
MOV A,#30
ADD A,25H
MOV R2,A
CLR A
ADDC A,24H
MOV R3,A
MOV 24H,A
DJNZ 26H,PRHZ6
RET
注:由于以上程序直接引自下面的应用实例,调用以上程序时请让寄存器组位于第2区,即R0对应10H。
三、应用实例
我们应用本文介绍的方法成功地进行了某医疗仪器的设计。该设计要求具有完整的中、英文字符提示和汉字处方显示,并尽可能地为今后的功能扩展和处方修改留有余地。目前仪器中用到的汉字约1200个,语句行为1300行左右,而且用户认为利用工控PC机设计成本过高,要求尽可能地降低成本。显然,对于该系统利用传统的汉字处理方式进行设计虽然能节省一定的存储空间,但庞大的汉字和语句重新编码工作却让人望而生畏,而且当处方修改须要用到新的汉字时相当麻烦。我们利用8031单片机系统和本文介绍的方法进行设计,整个硬件电路和底层程序设计只用了1周的时间,大大地缩短了开周期。而且由于本系统可调用所有的ASCII码和全部汉字库,所以对于功能的扩展和处方的修改十分方便。
篇5:不依赖高点阵字库实现屏幕汉字显示
不依赖高点阵字库实现屏幕汉字显示
在设计软件封面或菜单标题时,常需用到放大的汉字显示。通常采用的方法是一边从高点阵字库中读取汉字的字形码,一边加以变换在图形方式下绘点;但高点阵字库占有较大存储空间,例如 :2.13汉字系统中四种字体(宋、仿宋、黑、楷)的40X40点阵字库共占用近5M字节的硬盘空间。一般汉字操作系统中的.汉字显示都采用16X16点阵字库(仅占约260K字节);
而由于硬盘空间的限制,并不是每台微机上都装有高点阵字库。
如何使汉字放大显示程序不依赖高点阵字库而独立运行?本文提供一种方法,将需要放大显示的汉字串的字形码一次性从2.13I高点阵字库(40X40点阵)读入一个SUBHZK文件,以后每次显示放大汉字时只需从该文件读取字模信息,而SUBHZK比高点阵字库要小的多。这样,汉字显示程序运行时就彻底摆脱了高点阵字库(只需打开文件SUBHZK),可在西文方式或任何中文方式下运行。
程序采用Turbo C2.0编写,汉字放大显示程序DISPHZ运行时只需将SUBHZK和相应显示器的图形驱动程序(如CGA.BGI、EGAVGA.BGI)随DISPHZ.EXE放在同一目录下即可。
须注意的是,40X40点阵字模(字形码)实际上由40×36点阵组成,其汉字字形码排列格式为
@@T5S06100.GIF;图1@@
程序清单:
/*程序READGHZ.C:将需放大显示的汉字串的字形码从2.13系统40X40点阵字库读入
文件SUBHZK*/
#include
#include
int openhzk40(int);
FILE *fp,*fptr; /*定义全局文件指针*/
char *hzk-table[]={“c:\213\hzk40s”,“c:\231\hzk40f”,
“c:\213\hzk40h”,“c:\213hzk40k”};
main
{
unsigned char *string=“管理信息系统”;
/*需放大的汉字串*/
unsigned char inter-code ,zone-code,bit-code;
int locate,hzk-num,flag=0
char *p,dot-arrays[180];
if((fptr=fopen(“subhzk”,“wb”))==NULL){
printf(“Cannot open filen”);
exit(1);
} /*打开或创建文件SUBHZK */
openhzk40(1);
p=string;
while(*p)
{
inter-code=*p ;
if(inter-code>0xal)
if(flag==0)
{
zone-code=(inter-code-0xa0)&0x7f;/*汉字区码*/
flag=1;
}
eles
{
bit-code=(inter-code-0xa0)&0x7f;
/*汉字位码*/
flag=0;
locate=(zone-code-0x10)*94 bit-code-1;
/*汉字字模地址*/
fseek(fp,locate*180L,SEEK-SET);
/*置文件指针于汉字字模地址*/
fread(dot-arrays,sizeof(dot-arrays),1,fp);
/*读汉字字模于数组中*/
fwrite(dot-arrays,sizeof(dot-arrays),1,fptr);
/*写汉字字模到文件*/
}
}
fclose(fp);
fclose(fptr);
return 0;
}
int openhzk40(int hzk-num)
/*打开2.13系统40X40点阵字库文件*/
{
if((fp=fopen(hzk-table[hzk-num],“rb”))==NULL)
{
cputs(“Error on open fi
[1] [2]
篇6:汉字的动态编码与显示方案
摘要:综合几种常用单片机汉字显示方案,提出一种基于PC机预处理的汉字动态编码和动态字库的显示方法,较好地解决了存储空间、显示速度、软件开发维护几方面的相互矛盾;具有平台化的优点,同时,给出针对MCS51优化的汇编显示例程。
关键词:机内码 动态编码 字库
因为汉字本身的特点,显示汉字始终是计算机在我国应用普及的一个障碍。最初,为了能在PC机上显示、处理汉字,国人发明了一种硬件设备”汉卡“,后来各种各样的采用纯软件技术的中文DOS逐渐成熟,其中、西文软件的运行速度和性能还是有明显的差距。最终在软件进入支持UNICODE、真正实现国际化的WIN95以后,硬件跨入”奔腾“时代,才实现了汉字与西文的统一显示,但是这一切是以硬件资源的飞速发展为前提的。以国际GB2312为例,一、二级汉字库共收录了6000多个汉字,每个字按16×16点阵计算,字模需要占用32字节的存储空间,整个字库的规模在200k字节以上,高点阵(24点阵以上)和矢量字库以及Windows用的TrueType字体的字库规模都是几兆字节大小,这在早期的386时代是难以想象的。单片机因为使用灵活、结构简单、体积小、成本低而在工业和生活中得到广泛应用,也正是因此,它的硬件资源很有 限,寻址和计算机能力都远低于PC机,显示汉字更受限制。人们不满足单片机系统采用LED数码管的简单显示,根据单片机的特点,开发出了很多种汉字显示方法。
1 几种常用单片机显示汉字方法
(1)采用标准字[1]
这种方法仿器中文DOS的办法,将一个标准的汉字库装入ROM存储器,再根据汉字的机内码在字库中寻址,找到对应的字模,提取后送到显示器显示。因为采用了和PC机相同的编码(机内码),软件的开发和维护非常简单,基本上与写PC机软件差不多。而对单片机系统自身的要求则相对高多了,16×16点阵的字库需要256K字节,但是一般8位单片机的寻址能力只有64K字节,要进行存储器扩充,除增加很大一部分硬件成本外,还因为要进行存储器分页管理、地址切换,显示速度明显受影响,而且只能显示一种点阵字体。
(2)直接固化显示字模[2]
将要显示的语句中全部汉字的字模数据依次提取出来,顺序存放在存储器中,当显示时,直接取出字模数据送至显示器即可。这种方法占用空间少,程序实现简单,显示速度快;但是字模数据的提取和存储安排是一件委有繁琐的事件,要想大量显示汉字或进行程序修改几乎是不可能的,软件的可维护性很差。
(3)建立带索引的小字库[3]
将全部要显示的汉字统一建成一个小字库,字库分为2部分:索引素和字模表。索引表由若干定长记录组成,记录的内容为:汉字机内码、地址码、识别码。其中地址码是该汉字字模在字模表中的位置,识别码标志该汉字的点阵形式或字体等。字模表中按素引存放汉字字模。显示汉字时先根据待显汉字的机内码在索引表中寻找,找到对应索引记录后,读出地址码和识别码,再根据此从字模表中读出字模,送显即可。这种方法可根据实际使用对字库进行裁剪,硬件开销较小,但是要进行复杂的查询运算,字多了平均寻找时间就会变长,效率降低。
篇7:汉字的动态编码与显示方案
综上所述,我们发现:在方法1中,程序员工作量最少,但单片要机的软、硬件开销最大;方法2中,单片机的开销较少,但是编写和维护软件极为困难;方法3,介于二者之间。显然,存储空间、显示速度、软件开发维护件间存在着矛盾。受各种PC机模拟软件的启发,我们提出一种基于PC机预处理的汉字显示方法--汉字动态编码,在实际应用中较好地解决了这一问题。其基本原理如下:建立一种新的编码机制,这个汉字编码是动态的;一个编码不与某个汉字具体相联系,而仅代表某个汉字在字库中的位置(这个位置也是动态的);用该码代替程序里字符串(C语言)或数据段(汇编语言)内汉字的机内码,单处机显示程序可根据这个新的编码直接在专门建立的动态小字库中找到字模,不用进行复杂的寻址、查找等运算,如图1所示。
实现汉字动态编码的过程就是先进行汉字识别,然后建立编码字典、提取字模、建立动态字库、改写机内码。首先扫描一遍程序文件,识别其中的汉字,将它们按出现先后顺序或机内码的大小排序,重复出现的剔除,建立了一个编码字典;根据汉字在编码字典的位置(序号),可以对汉字按区码、位码进行编码,也可以采用其它的方法编码,总之序号与它的动态编码存在一一对应关系;根据字典中每个汉字的机内码依次从PC机的汉字点阵字库中提取字模,顺序存储,建立一个小规模的动态字库,这样每个汉字的字模在字库中的位置就与其在编码字典中的序号、动态编码一一对应了。最后,再扫描一遍程序文件,按照编码字典将每个汉字的机内码改写为对应的动态编码。因为程序文件中的汉字随时会增减,编码随之而变,字库的大小也随时在变。所以称之为动态编码和动态字库。
考虑一般应用场合,1000个左右的汉字即可满足要求,按照汉字动态编码方法所需的字库仅为32K字节大小,只需要1片27256即可,几乎不用增加什么硬件。这样,字库的大小可由汉字的多少控制,程序的编写和维护可以沿用中文系统下的习惯,仅需要编写好的单片机程序用PC机进行一次预处理,程序员从繁杂的汉字处理工作中解放出来,有效地降低了软件和硬件开发成本。
(本网网收集整理)
3 汉字动态编码的'具体实现
实现汉字动态编码的关键是建立编码字典和改写机内码。下面以是显示1行汉字”天上有个太阳,水中有个月亮“为例,说明动态编码的实现过程。
(1)汉字识别
汉字在PC机内的存储和处理是用机内码来实现的。每个汉字的机内码是唯一的,由2个字节组成,分区码和位码,为了和西文的ASCII码有区别,汉字机内码的区码和位码的取值都大于0A0H。我们要处理的源程序文件都是文本文件,存储的都是西文字符、控制符的ASCII码和中文字符的机内码,当扫描到文件中大于0A0H的字节内容时,即可判断该字节是汉字机内码的1个字节,而且肯定是成对出现,第1个字节是区别,第2个字节是位码,都大于0A0H,否则出错。
在C和汇编程序中表示字符的方式有所不同,但最终字符在文件中的存储格式是一样的。显示上面那行汉字,用C语言可以表示为:
char OneSent[]=”天上有个太阳,水中有个月亮“;
printfhz(OneSent);/*printfhz显示函数*/
用十六进制编辑器(我们用的是UEdit32)察看文件中C语言字符串定义语句为:
63 68 61 72 20 20 4F 6E 65 53 65 6E 74 5B 5D 20 3D 20 22 CC EC C9 CF D3 D0 B8 F6 CC AB D1 F4 A3 AC CB AE D6 D0 D3 D0 B8 F6 D4 C2 C1 C1 22 20 3B 0D 0A
用汇编语言可以表示为:
ONESENT:DB '天上有个太阳,水中有个月亮',00H
MOV DPTR,ONESENT
LCALL DISPLAY;DISPLAY是显示子程序
用十六进制编辑器察看上面用汇编语言定义字符串的那一条语句为:
4F 4E 45 53 45 4E 54 3A 44 42 20 27 CC EC C9 CF D3 D0 B8 F6 CC AB D1 F4 A3 AC CB AE D6 D0 D3 D0 B8 F6 D4 C2 C1 C1 27 2C 30 30 48 0D 0A
由此可以观察到情况确如前所述。
(2)建立编码字典
编码字典是在扫描的同时逐步建立起来的,每扫描到一个汉字(包括全角符号),即与字典中已有的字符进行比较,如没有重复,是新的字符就顺序存入字典,否则继续扫描,直至文件结属。由于每个字符都是从尾部添加的,它们的序号也是依次递增的,根据序号就可以进行动态编码了。由于显示的汉字一般都得在256个以上,即使进行动态编码,也需要用2字节编码来实现。以MCS51系列单片机和16×16点阵汉字做一优化编码示例:8051的地址指针DPTR是16位指针,由高、低2字节指针DPH、DPL组合而成,如果将存储器按0FFH(256)字节分布,修改DPH即可直接寻址到任一页,修改DPL可寻址该页的任一字节。一个16×16点阵汉字的字模是32字节大小,每页存储器正好能容纳8个汉字字模。可以优化设计动态编码的高字节指向字模的页地址(DPH),低字节指向字模在该页的首地址(DPL)。考虑地址空间的有效分配,将字库的地址放在0A000H以后(程序或数据存储器均可),动态编码的高字节要加上地址有效分配,将字库的地址放在0A000H以后(程序或数据存储器均可),动态编码的高字节要加上地址的页偏移量(大于等于0A0H);考虑汉字与西文字符的区别,动态编码的低字节也需要加上一个大于或等于0A0H的偏移量。设某汉字在编码字典中的序号为Num,则该汉字的动态编码为:
动态编码高字节=页偏移量+Num/8
动态编码低字节=偏移量+(Num%8)×32 (1)
偏移量一般可设为0A0H。当单片机显示某个汉字时,只需将其动态编码的高字节送DPH,低字节减0A0H后送DPL,即可得到对应字模的地址指针。
(3)提取字模、建立动态字库
汉字机内码与点阵字库的详细关系可参考有关资料,它们存在如下联系:
字模首地址=((机内码高字节-1)×94+(机内码低字节-1))×N (2)
注:N为一个汉字点阵字模的字节数。
按照编码字典内容,根据字模首地址,依次取出汉字字模,顺序写入一个二进制文件,即建成动态字库(其它方法略),用烧录器写入EPROM,就可以使用了。
(4)编码改写
机内码是PC机识别处理汉字用的,单片机只能处理我们建立起来的动态编码,还得把程序中汉字的仅机码根据编码字典改成对应的动态编码才行。由于在编写源程序的文本编辑器中看到的是经过系统处理过的字节,看不到汉字的机内码,也无法对其进行改写。根据”汉字识别“一节所述,不经过文本编辑器,直接将动态编码(十六进制数)定改磁盘文件对应位置即可,但是处理过后的汉字在文本编辑器里会显示出乱码。
(5)汉字显示
在明白了动态编码与动态字库中字模的关系后,可以完成按照PC机下汉字显示原理进行单片机下的程序设计,编写前面的函数printhz或子程序的DISPLAY,可参考相关资料[4]。
4 MCS51汉字显示例程
根据上述汉字动态编码方法,我们利用Borland C++编写了PC机预处理程序,将ASM51或C51源程序用PC机预处理后,建立了动态字库和改写了机内码,并且用ASM51写了一个针对MCS51进行优化的子程序DIS_CHAR。它显示一个西文或中文字符,实现过程如图2所示。
西文字符码的显示与流字显示基本相同,将西文字库(仅数字和字符部分)装入程序存储器中,根据ASCII码的值计算出字模首地址,将字符字模依次读出,再送显示即可。
此方案不但可用于单片机系统中,还可应用于任何无中文系统支持的嵌入式系统中。根据这个思路还可设计出不同字体、点阵混合的字库,支持包含2万多个字符的新国标编码,甚至矢量字体在单片机系统中的应用也成为可能。由于技术水平有限,此方案还存在一些不足之处,如改写编码后源程序中汉字显示为乱码,不知道改码处理是否正确,操作比较繁琐。如果能采用插件技术实现此方案,编辑器中能正常显示汉字,而输出已经是改码后的程序文件,则能很好地解决上述不足。在这里,我们抛码引玉,希望有兴趣的朋友一起合作,实现单片机中文显示的广义开发平台。
动态编码预处理的C语言源程序(在BC++3.1下调试通过)见网站补充版(收集整理)
篇8:汉字的动态编码与显示方案
汉字的动态编码与显示方案
摘要:综合几种常用单片机汉字显示方案,提出一种基于PC机预处理的汉字动态编码和动态字库的显示方法,较好地解决了存储空间、显示速度、软件开发维护几方面的相互矛盾;具有平台化的优点,同时,给出针对MCS51优化的汇编显示例程。关键词:机内码 动态编码 字库
因为汉字本身的特点,显示汉字始终是计算机在我国应用普及的一个障碍。最初,为了能在PC机上显示、处理汉字,国人发明了一种硬件设备”汉卡“,后来各种各样的采用纯软件技术的`中文DOS逐渐成熟,其中、西文软件的运行速度和性能还是有明显的差距。最终在软件进入支持UNICODE、真正实现国际化的WIN95以后,硬件跨入”奔腾"时代,才实现了汉字与西文的统一显示,但是这一切是以硬件资源的飞速发展为前提的。以国际GB2312为例,一、二级汉字库共收录了6000多个汉字,每个字按16×16点阵计算,字模需要占用32字节的存储空间,整个字库的规模在200k字节以上,高点阵(24点阵以上)和矢量字库以及Windows用的TrueType字体的字库规模都是几兆字节大小,这在早期的386时代是难以想象的。单片机因为使用灵活、结构简单、体积小、成本低而在工业和生活中得到广泛应用,也正是因此,它的硬件资源很有 限,寻址和计算机能力都远低于PC机,显示汉字更受限制。人们不满足单片机系统采用LED数码管的简单显示,根据单片机的特点,开发出了很多种汉字显示方法。
1 几种常用单片机显示汉字方法
(1)采用标准字[1]
这种方法仿器中文DOS的办法,将一个标准的汉字库装入ROM存储器,再根据汉字的机内码在字库中寻址,找到对应的字模,提取后送到显示器显示。因为采用了和PC机相同的编码(机内码),软件的开发和维护非常简单,基本上与写PC机软件差不多。而对单片机系统自身的要求则相对高多了,16×16点阵的字库需要256K字节,但是一般8位单片机的寻址能力只有64K字节,要进行存储器扩充,除增加很大一部分硬件成本外,还因为要进行存储器分页管理、地址切换,显示速度明显受影响,而且只能显示一种点阵字体。
(2)直接固化显示字模[2]
将要显示的语句中全部汉字的字模数据依次提取出来,顺序存放在存储器中,当显示时,直接取出字模数据送至显示器即可。这种方法占用空间少,程序实现简单,显示速度快;但是字模数据的提取和存储安排是一件委有繁琐的事件,要想大量显示汉字或进行程序修改几乎是不可能的,软件的可维护性很差。
(3)建立带索引的小字库[3]
将全部要显示的汉字统一建成一个小字库,字库分为2部分:索引素和字模表。索引表由若干定长记录组成,记录的内容为:汉字机内码、地址码、识别码。其中地址码是该汉字字模在字模表中的位置,识别码标志该汉字的点阵形式或字体等。字模表中按素引存放汉字字模。显示汉字时先根
[1] [2] [3] [4]
★ oa 解决方案
★ 解决方案的范文
★ 网络营销解决方案
★ 网络安全解决方案
★ 食品安全解决方案
★ 显示的近义词
★ 库房管理解决方案
VxWorks汉字显示解决方案(精选8篇)




