在嵌入式显示设备中如果有足够大的flash,我们就可以用数百KB空间来存储一个HZK16字库文件用于显示16*16汉字,免得还要自己提取字模。
HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个.
其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列.
我们在一些应用场合根本用不到这么多汉字字模, 所以在应用时就可以只提取部分字体作为己用.
HZK16字库里的16×16汉字一共需要256个点来显示, 也就是说需要32个字节才能达到显示一个普通汉字的目的.
我们知道一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE.
A1-A9为符号区, B0到F7为汉字区. 每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域).
一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号.
其中, 每个区记录94个汉字, 位号为该字在该区中的位置. 所以要找到"我"在hzk16库中的位置就必须得到它的区码和位码.
区码:汉字的第一个字节-0xA0 (因为汉字编码是从0xA0区开始的, 所以文件最前面就是从0xA0区开始, 要算出相对区码)
位码:汉字的第二个字节-0xA0
这样我们就可以得到汉字在HZK16中的绝对偏移位置:
offset=(94*(区码-0xa1)+(位码-0xa1))*32
如何知道一个汉字的区码和位码呢,可以用一个小程序来计算:
#include <stdio.h> #include <stdlib.h> int main(void) { unsigned char code[2] = {0}; puts("请输入一个汉字:"); gets((char*)code); printf("区码:%d 位码:%d",code[0],code[1]); return EXIT_SUCCESS; }
知道区位码就可以计算出字模数据在字库文件中的绝对偏移地址:
#include <stdio.h> #include <stdlib.h> int main(void) { int posi; unsigned char code[2] = {0}; puts("请输入一个汉字:"); gets((char*)code); printf("区码:%d 位码:%d\n",code[0],code[1]); posi = ((code[0] - 0xa1) * 94 + code[1] - 0xa1)*32; printf("偏移值为: %d\n", posi); return EXIT_SUCCESS; }
有了文件,又有了偏移量,我们就可以对文件进行读取,取出一个汉字所需要的32字节字模数据,并将该字模显示出来了:
#include <stdio.h> #include <stdlib.h> int main(void) { long int offset; unsigned char code[2] = {0}; unsigned char buffer[32]; //存储一个汉字所用的32个字节 unsigned char i,j; FILE *fp = NULL; puts("请输入一个汉字:"); gets((char*)code); printf("区码:%d 位码:%d\n", code[0], code[1]); //显示区位码 offset = ((code[0] - 0xa1) * 94 + code[1] - 0xa1) * 32; //计算绝对偏移地址 printf("偏移值为: %ld\n", offset); fp = fopen("hzk16.dat", "rb"); //二进制只读方式打开,261KB if (fp == NULL ) //如果打开失败 { printf("打开字库失败\n"); return 0; } fseek(fp,offset,0); //根据偏移寻找到该字字模的第一个字节 for (i = 0; i < 32; ++i) { //连续读取32个字节 buffer[i] = fgetc(fp); } for (i = 0; i < 32; ++i) { //将32个字节顺序打印 for (j = 0; j < 8; ++j) { if (buffer[i] & 0x80) { printf("@@"); }else{ printf(" "); } buffer[i] <<= 1; } if (i % 2) { printf("\n"); //如果i%2==1说明该字节是靠后的那个字节,显示完后要换行 } } return EXIT_SUCCESS; }
此时,HZK16通过C代码解析出来了。但是采用这种字库毕竟有局限,如“囧”字,是无法显示出来的,很多没有收录的新字在显示时还是不得不采用字模方式:
值
相关推荐
hzk16.c ucgui 汉字显示 源码
dat点阵汉字库16X16 HZK16.dat 免费下载,可以生成点阵二维数组,任您自由发挥
HZK16字库是专为 OLED 显示屏设计的一款字符库,对于使用单片机进行文本显示的应用来说,它是不可或缺的重要组成部分。OLED(Organic Light-Emitting Diode,有机发光二极管)显示屏因其高对比度、低功耗和薄型设计...
`show_chinese.c`很可能是一个C语言编写的源代码文件,用于演示如何在屏幕上显示HZK16字体库中的中文字符。在这样的代码中,开发者通常会使用低级的图形操作函数,如像素设置或内存映射,来逐个绘制字符的点阵图形。...
点阵字库是一种在计算机和嵌入式系统中表示字符的方式,尤其在资源有限的设备上,如早期的计算机、电子显示屏或者现在的微控制器。在本案例中,我们讨论的是一个12*12点阵的中文字库,文件名为"HZK12.bin"。这个字库...
电子-HZK16.c,单片机/嵌入式STM32-F0/F1/F2
汉字字库是计算机系统中用于显示和打印汉字的重要组成部分,其中HZK16、HZK24和HZK32代表不同的字号大小。这些字号分别对应于汉字在屏幕或打印机上显示时的点阵大小,点阵是构成汉字图形的基本元素。在早期的计算机...
在DEV C++5.3开发环境下测试通过HZK16,HZK24,HZK32正常读,通过控制台显示出读出来的字库实例,在网上找了很多,很多不能调试通过,花些时间去调试,程序简单,可读性强,这里可以节省大家的时间
通过调用HZK16,来模拟LED显示点阵汉字的效果。可以同时写任意三个字符。软件可能还不完善,如有bug请及时提出。本人现在为在南京的实习生,渴望获得项目的实践机会,若能给予,感激不尽。邮箱zhanghtt@126.com
本文将深入探讨标题和描述中提到的"字库文件(HZK12 HZK16 ASC II)",以及它们在单片机应用中的作用。 首先,让我们了解什么是字库文件。字库文件,也称为字体库,是一系列预定义字符的集合,这些字符通常以图形...
在实际应用中,这些C源代码可以被嵌入到各种嵌入式系统中,如微控制器(MCU)驱动的电子设备,如电子表、电子词典、工业设备的显示屏等。使用时,需要将字模文件烧录到设备的闪存中,然后在运行时动态加载和显示相应...
HZK16汉字库是一种广泛应用于早期嵌入式系统和计算机软件中的汉字编码库,它以16x16像素的点阵格式存储了大量汉字,适用于显示或打印汉字的低分辨率环境。这个库包含了丰富的汉字字符集,使得在资源有限的设备上也能...
hzk12字库的C数组文件 可以直接调用
在C#中实现点阵汉字,我们首先需要一个字库文件,如HZK16.dat。这个文件通常包含所有汉字的点阵信息,每个汉字的点阵信息被编码为二进制数据。在C#中,我们可以使用`FileStream`类读取这个二进制文件,然后用`...
点阵字库是一种在计算机图形显示中用于呈现字符的特殊数据结构,主要应用于低分辨率的显示设备或嵌入式系统中。在这个压缩包中,包含了多种格式和尺寸的点阵字库,包括ASC系列和HZK系列,适用于不同的应用场景。 1....
HZK16汉字库是一种常用的16×16点阵汉字库,它符合GB2312标准,适用于多种嵌入式系统及PC应用程序中汉字的显示。HZK16支持的汉字数量为6763个,包括3755个一级汉字和3008个二级汉字,以及682个符号。一级汉字按照...
系统中常用的几个字体库文件---ASC16、ASC32-122、HZK16,应用在单片机LED汉字显示。代码部分可以参考网上的
在处理HZK16.dat这类字库文件时,开发者可能需要编写特定的程序来解析和显示其中的字符。这涉及到读取文件,解码点阵数据,并将其转化为屏幕上的像素。为了提高效率,一些优化技术可能会被采用,比如使用位图操作来...