在许多单片机应用系统中,经常要用到汉字,以便进行输出显示,此时需要建立单片机的专用字库,而人工向单片机输入所需汉字是非常费时费力的工作。因此需要从大字库中分离出小字库,自我生成一个专用的小字库。
1. 汉字的区位码与内码
国家标准的汉字字符集(GB2312-80)在汉字操作系统中是以汉字库的形式提供的。汉字库结构有统一规定,即将汉字库分成94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号(用两个字节),这就是所谓的区位码。区位码的第一个字节表示区号,第二个字节表示位号,因而只要知道了区位码,就可以知道该汉字在字库中的地址。每个汉字在字库中是以点阵字模形式存储的,当用存储单元存储该字模信息时,将需要32字节。在计算机内,英文字符是用一个字节的ASCII码表示的,而对于众多的汉字,需用两个字节才能代表,国家为此制定了统一标准,称为国标码。又规定国标码在机内表示汉字时,将每个字节的最高位置1。这些国标码的两字节最高位加1后的代码称为机器内的汉字代码,简称内码。
2 内码转换为区位码与取字模
汉字内码与区位码有固定的转换关系,即若汉字内码为十六进制数aaff,则区号qh和位号wh分别为 qh=aa-0xa0;wh=ff-0xa0。 由于在中文DOS下,输入汉字时,其相应的内码即已在程序中存在,如同在西文DOS下,输入英文字符时,其对应的ASCII也在程序中存在一样。因而得知汉字内码,将其转换为区位码,这样就可以找出该汉字字模在字库中存放的地址,由此地址调出该32字节汉字的内容(字模)。
在以上知识的基础上,单片机利用C语言建立小字库的方法是这样的:在UCDOS下打开标准字库→取出所需汉字字模→生成专用小字库文件。但是,单片机不能识别C语言建立的专用小字库文件。 因此,需要把C语言建立的专用小字库转换成MCS51单片机能识别的存储模式。下面是转换过程所需的C语言语句: //C语言建立小字库文件
fp16 fread(&buffer,char_16,1,fp16);//取字模
for(j=0;j<= char_16-1;j )//设置循环次数(一个汉字字模为32字节)
{ fprintf(fp22,“db”);//MCS51语句定义符(fp22为MCS51能识别的库文件)
if(buffer[j]<=0xf buffer[j]>=0xa)//若一个字节左边 是字母(≥10),前面加0
{ fprintf(fp22,“%x”0); } printf(fp22,“%x”,buffer[j]);//写汉字字模(一次一个字节)
fprintf(fp22,“h\n”);//最后加上H,然后换行 }
在DOS环境下,把利用C语言建立的单片机小字库文件fp22与单片机汇编程序合在一起,通过单片机开发器写入EPROM。可以看出,每个汉字字模都由程序自动写入EPROM,既节省时间,又避免了字模人工输入时可能产生的错误。