-
在
C51
中,
HZK1
6
汉字库的使用
(mydows's
Blog
转载
)
定义如下:
unsigned
char
str[]=
我
在运行时
str
被初始化
为
2
个字节长度,内容为
“
我
”
的
GBK
码,为:
0xCE
(区
码
),
0xD2
(位码)。
使用如下换算公式得到
“
我
”
在
HZK16
文件中的地址,
p>
从该位置开始的顺序
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
个,按声序排列,二
p>
级汉字有
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)+(
位码
p>
-1))*32
注解:
< br>1
、区码减
1
是因为数组是以<
/p>
0
为开始而区号位号是以
1
为开始的
2
、
(94*(
区号
-1)+
位号
-1)
是一个汉字字模占用的字节数
3
、最后乘以
32
是
因为汉字库文应从该位置起的
32
字节信息记录该字
的字模信息(前面提到一个汉字要有
32
个字节显
示)
有了偏移地址就可以从
HZK1
6
中读取汉字编码了,剩下的就是文件操作了,就
不说了,要看
代码(汉字)就是下面的:
“
hzk16
汉字库的简单读写程序
”
,是
p>
一个最简单的
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
位码
=
内码第二字节-
p>
160
再由区位码可以得到它在汉字库中字模第一个字节的位置
:
(
区码×94+位码)×32 于是,
可以向后连续读出由
32
个字节组成的该字的
< br>点阵数据。
2.2
汉字显示
汉字占用资源太多(如
16
点阵,每个汉字就需
32
字节),因而通常把汉字
库放在
EEPROM
里,需要显示某个汉字时,先算出它的区位码,再求出点阵起始
位置,
从
EEPROM
中顺序调出该字的点阵数据,
存在缓冲区里,
最后依次
送往
LCD
显示,描出该字。需要说明的是汉字存储方式与
p>
LCD
显示方式有一定差别。
本文使用另一种显示方法,
即事先将程序用到的汉字、
符号和数码
(为了节
省显示空间,可以将数码压成
8×16
点阵),编成一个文本文件,用一段小程序
做出相应小的汉字库,
这个小字库的汉字点阵数据取自于一般汉字库。
再经过转
换和调整,得到新的汉字库,最后把新字库固化在
< br>EEPROM
中。单片机只需按序
号读出点阵字节,
p>
送往
LCD
即可显示所需汉字。
减轻了单片机的负担,
去除了繁
琐的查找内码、求
起始位置、转换、调整等工作,提高了系统可靠性。
表
116
点阵汉字字库存储方式
3
自定义小字库的制作
典型的汉字库可选用
UCDOS
下的字库,如
16
点阵字库
HZK16
。需要
256K
空
间,用了较大的
EEPROM
,又不方便读取,而实际应用中需要的汉字又非常
少,
因而我们可以自己制作小的汉字库,
在这个小字库里只包含
系统需要的汉字。
这
样,一方面节省读取时间,另一方面大大地
节省了资源。
限于篇幅,这里仅仅给出流程图(假定事先将所
需汉字写到了一个文本文
件),如图
1
所示。
将整个汉字字库存放在
p>
EPROM
或
E2PROM
内,程序根据要显示汉字的机内码
来调用汉字字模。
某些高端单片机,如
Motorola
的
M68300
系列
32
位单片机,寻址范围可达
8M
,液晶显示常用的
p>
16×16
汉字库二进制数据文件为两百多
k
,将汉字字库存
入大容量的
E2PR
OM
,通过地址线可寻址到汉字库中的每一个汉字。
在计算机中对汉字的识别是通过机内码来实现的,
汉字标准机内码为两字
节
代码。汉字在汉字库中是按照区位来排列的,每一区中有
94
个汉字,每个汉字
都对应唯一的区号和在本区的位号,
汉字输入法中就有区位码方法,
实际上,
汉
p>
字机内码和区位码有标准的对应关系,某个汉字在字库中的区号加上
0xa0
等于
其机内码的高字节,位号加上
0xa0
等于其机内码的低字节,因此很容易通过程
序计算
出要显示的汉字在汉字库中的区位号,即得到了其在汉字库中的偏移地
址。
由于
E2PROM
中存储
了整个汉字库,只须在硬件上设定存放汉字库的存储器
片选地址,
直接将汉字作为字符数组付给汉字显示函数,
通过机内码计算出区号
< br>和位号,
即可方便地对汉字字模进行调用了。
与前两种方
法相比,
无须事先提取
字模和设定其地址用于程序调用,
因此在进行程序升级,
涉及到汉字显示时,
不
用更改汉字字模数据。
汉字的字模与显示
--
汉字的代码体系
目
录