关键词不能为空

当前您在: 主页 > 英语 >

HZK16应用示例

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-16 20:42
tags:

-

2021年2月16日发(作者:抒怀)



C51


中,


HZK1 6


汉字库的使用


(mydows's


Blog


转载


)


定义如下:



unsigned


char


str[]=


< p>


在运行时


str


被初始化 为


2


个字节长度,内容为


< p>




GBK

< p>
码,为:


0xCE


(区


码 ),


0xD2


(位码)。


< p>
使用如下换算公式得到






HZK16


文件中的地址,


从该位置开始的顺序


32



节为




< br>的字模。




ADD=< /p>


【(区码


-0xa1


< br>×


0x5e


+


(位码


-0xa1


)】


×


0 x20


按照上面的计算方法,



我< /p>



的字模地址:


0x216E0


。他的


C


语言字模为:


0x04,


0x80,0x0E,0xA0,0x78,0x90,0x08,


0x90,0x08,0x84,0xFF,0xFE,0x08,0x80,


0x08,0x90,0x0A,0x90,0x0C,0x60,0x18,


0x40,0x68,0xA0,0x09,0x20,0x0A,0x14,


0x28,0x14,0x10,0x0C














HZK16


字库是符合


GB2312


标 准的


16×16


点阵字库


,HZK16



GB2312-80


支持的汉字有< /p>


6763


个,符号


682


个。其中一级汉字有


3755


个,按声序排列,二


级汉字有


3008


个,按偏旁部首排列。我 们在一些应用场合根本用不到这么多汉


字字模,所以在应用时就可以只提取部分字体作为 己用。



HZK16


字库里的


16×16


汉字一共需要


256


个点来显示,


也就是说需要


32


个字节


才能达到显示一个普通汉字的目的。



我们知道一个


GB2312


汉字是由两个字节编码的,


范围为


A1A1~FEFE



A1-A9


为符


号区,


B0



F7


为汉字区。每一个


区有


94


个字符


(注意 :这只是编码的许可范


围,不一定都有字型对应,比如符号区就有很多编码空白区域)。 下面以汉字


“我”为例,介绍如何在


HZK16


文件中找到它对应的


32


个字节的字模数据。



前面说到一个汉字占两个字节,


这两个中前一 个字节为该汉字的区号,


后一个字


节为该字的位号。其中,每个 区记录


94


个汉字,位号为该字在该区中的位置。


所以要找到






hzk16


库中的位置就必须得到它的区码和 位码。


(为了区别使


用了区码和区号,其实是一个东西,别被我 误导了)



区码:区号(汉字的第一个字节)


-0xa0


(


因为汉字编码是从


0xa0

< br>区开始的,


所以文件最前面就是从


0xa0


区开始,要算出相对区码


)



位码:位号(汉字的第二个字节)


-0xa0



这样我们就可以得到汉字在


HZK1 6


中的绝对偏移位置:



offset =(94*(


区码


-1)+(


位码


-1))*32



注解:

< br>1


、区码减


1


是因为数组是以< /p>


0


为开始而区号位号是以


1


为开始的




2



(94*(


区号


-1)+


位号


-1)


是一个汉字字模占用的字节数




3


、最后乘以


32


是 因为汉字库文应从该位置起的


32


字节信息记录该字

< p>
的字模信息(前面提到一个汉字要有


32


个字节显 示)



有了偏移地址就可以从


HZK1 6


中读取汉字编码了,剩下的就是文件操作了,就


不说了,要看 代码(汉字)就是下面的:



hzk16


汉字库的简单读写程序




,是


一个最简单的


c


语言程序。




hzk16


汉字库的简单读写程序




hzk


汉字点阵




int i,j,k;


unsigned char incode[3]=




要读出的汉字



unsigned char qh,wh;


unsigned long offset;


//


占两个字节


,


取其区位号



qh = incode[0] - 0xa0;/ /


获得区码



wh = incode[1] - 0xa0; / /


获得位码



offset = (94*(qh-1)+(wh-1))*32; / *


得到偏移位置


* /



FILE *HZK;


char mat[32];


if((HZK=fopen(


{


printf(


exit(0);


}


fseek(HZK, offset, SEEK_SET);


fread(mat, 32, 1, HZK);


//


显示



for(j=0;j<16;j++)


for(i=0;i<2;i++)


for(k=0;k<8;k++)


if(mat[j][i]&(0x80>>k))


/*


测试 为


1


的位则显示


*/


{


printf(


}else{ printf(


}



fclose(HZK);


fclose(fp);




图形


LCD


模块


ACM19264ASB


的汉字显示



1


引言



在基于单片机的智能系统中,


汉字显示模块是很重要的一个组成部分,

< br>它应


用广泛、操作容易、调试简便。


< br>然而,在单片机上显示汉字也存在几个问题。首先,单片机资源有限,我们


不能为 了显示汉字占用太多的资源;


其次,


汉字存储读取比较繁琐,< /p>


使用不方便;


第三,


汉字是通过点阵显示 出来的,


往往与


LCD


写入方式不一样 ,


这就得进行转


换和调整。



值得注意的是,基于单片机的汉字显示不能在字符


LCD


上实现。使用图形


LCD


有很多优点,不仅能显示汉字 ,而且可以实现汉字动态移动和上下滚屏,实


现汉字与图形的混合显示,同时功耗低。< /p>



2


基于单片机的汉字显示原理



2.1


汉字字模


汉字一般是以点阵式存储的,如


16×16,24×24


点 阵(即汉字的字模),


每个汉字由


32


字节(


16


点阵)或


72


字节(


24


点阵)描述。根据汉字的不同字



,


也可分为宋体字模、楷体字模、黑体字模等 等。



汉字的字模其实是汉字字形的图形化。对于


16


点阵字模,就是把汉字写在


一个


16×16


的网格内,汉字的笔画能过某网格时该网格就对应

< br>1


,否则该网格


对应


0



这样每一网格均对应


1



0



把对应


1


的网格连起来看,


就是这个汉字。


汉字就是这样通过字节表示点阵存储在字库中的。



为了方便查 找所需汉字的点阵,每个汉字都与一个双字节的内码一一对应。


通过汉字的内码可以计算 出它的点阵起始字节。现以


16


点阵为例说明。



先由内码计算出它在汉字库中的区位码,计算公式为:



区码


=


内码第一字节-


160


位码


=


内码第二字节-


160


再由区位码可以得到它在汉字库中字模第一个字节的位置


:


(


区码×94+位码)×32 于是,


可以向后连续读出由


32


个字节组成的该字的

< br>点阵数据。



2.2


汉字显示


汉字占用资源太多(如


16


点阵,每个汉字就需

< p>
32


字节),因而通常把汉字


库放在


EEPROM


里,需要显示某个汉字时,先算出它的区位码,再求出点阵起始


位置,



EEPROM


中顺序调出该字的点阵数据,


存在缓冲区里,


最后依次 送往


LCD


显示,描出该字。需要说明的是汉字存储方式与


LCD


显示方式有一定差别。


< p>
本文使用另一种显示方法,


即事先将程序用到的汉字、

符号和数码


(为了节


省显示空间,可以将数码压成


8×16


点阵),编成一个文本文件,用一段小程序

做出相应小的汉字库,


这个小字库的汉字点阵数据取自于一般汉字库。


再经过转


换和调整,得到新的汉字库,最后把新字库固化在

< br>EEPROM


中。单片机只需按序


号读出点阵字节,


送往


LCD


即可显示所需汉字。

< p>
减轻了单片机的负担,


去除了繁


琐的查找内码、求 起始位置、转换、调整等工作,提高了系统可靠性。




116


点阵汉字字库存储方式




3


自定义小字库的制作



典型的汉字库可选用


UCDOS


下的字库,如


16


点阵字库


HZK16

。需要


256K



间,用了较大的


EEPROM


,又不方便读取,而实际应用中需要的汉字又非常 少,


因而我们可以自己制作小的汉字库,


在这个小字库里只包含 系统需要的汉字。



样,一方面节省读取时间,另一方面大大地 节省了资源。



限于篇幅,这里仅仅给出流程图(假定事先将所 需汉字写到了一个文本文


件),如图


1


所示。




将整个汉字字库存放在


EPROM



E2PROM


内,程序根据要显示汉字的机内码


来调用汉字字模。



某些高端单片机,如


Motorola



M68300


系列


32


位单片机,寻址范围可达


8M


,液晶显示常用的


16×16


汉字库二进制数据文件为两百多


k


,将汉字字库存


入大容量的


E2PR OM


,通过地址线可寻址到汉字库中的每一个汉字。



在计算机中对汉字的识别是通过机内码来实现的,


汉字标准机内码为两字 节


代码。汉字在汉字库中是按照区位来排列的,每一区中有


94


个汉字,每个汉字


都对应唯一的区号和在本区的位号,


汉字输入法中就有区位码方法,


实际上,



字机内码和区位码有标准的对应关系,某个汉字在字库中的区号加上


0xa0


等于


其机内码的高字节,位号加上

0xa0


等于其机内码的低字节,因此很容易通过程


序计算 出要显示的汉字在汉字库中的区位号,即得到了其在汉字库中的偏移地


址。



由于


E2PROM


中存储 了整个汉字库,只须在硬件上设定存放汉字库的存储器


片选地址,


直接将汉字作为字符数组付给汉字显示函数,


通过机内码计算出区号

< br>和位号,


即可方便地对汉字字模进行调用了。


与前两种方 法相比,


无须事先提取


字模和设定其地址用于程序调用,


因此在进行程序升级,


涉及到汉字显示时,



用更改汉字字模数据。




汉字的字模与显示


--


汉字的代码体系







-


-


-


-


-


-


-


-



本文更新与2021-02-16 20:42,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/659896.html

HZK16应用示例的相关文章