点阵字模原理与读取

 点阵字模原理与读取

 

 

  一、字模生成原理

汉字的点阵字模是从点阵字库文件中提取出来的。例如常用的16×16点阵HZK16文件,12×12点阵HZK12文件等等,这些文件包括了GB 2312字符集中的所有汉字。现在只要弄清汉字点阵在字库文件中的格式,就可以按照自己的意愿去显示汉字了。

  下面以HZK16文件为例,分析取得汉字点阵字模的方法。
   HZK16文件是按照GB 2312-80标准,也就是通常所说的国标码或区位码的标准排列的。国标码分为 94 个区(Section),每个区 94 个位(Position),所以也称为区位码。其中01~09 区为符号、数字区,16~87 区为汉字区。而 10~15 区、88~94 区是空白区域。
  如何取得汉字的区位码呢?在计算机处理汉字和ASCII字符时,使每个ASCII字符占用1个字节,而一个汉字占用两个字节,其值称为汉字的内码。其中第一个字节的值为区号加上32(20H),第二个字节的值为位号加上32(20H)。为了与ASCII字符区别开,表示汉字的两个字节的最高位都是1,也就是两个字节的值都又加上了128(80H)。这样,通过汉字的内码,就可以计算出汉字的区位码。
  具体算式如下:
  qh=c1-32-128=c1-160 wh=c2-32-128=c2-160
  或   
  qh=c1-0xa0 wh=c2-0xa0
  qh,wh为汉字的区号和位号,c1,c2为汉字的第一字节和第二字节。
  根据区号和位号可以得到汉字字模在文件中的位置:
  location=(94*(qh-1)+(wh-1))*一个点阵字模的字节数。
  那么一个点阵字模究竟占用多少字节数呢?我们来分析一下汉字字模的具体排列方式。
  例如下图中显示的“汉”字,使用16×16点阵。字模中每一点使用一个二进制位(Bit)表示,如果是1,则说明此处有点,若是0,则说明没有。这样,一个16×16点阵的汉字总共需要16*16/8=32个字节表示。字模的表示顺序为:先从左到右,再从上到下,也就是先画左上方的8个点,再是右上方的8个点,然后是第二行左边8个点,右边8个点,依此类推,画满16×16个点。
对于其它点阵字库文件,则也是使用类似的方法进行显示。例如HZK12,但是HZK12文件的格式有些特别,如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字模每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,每个字模大小为24字节,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。 还有UCDOS下的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体)这些打印字库文件,每个字模占用24*24/8=72字节,不过这类大字模汉字库为了打印的方便,将字模都放倒了,所以在显示时要注意把横纵方向颠倒过来就可以了。
  这样我们就完全清楚了如何得到汉字的点阵字模,这样就可以在程序中随意的显示汉字了。

 

二、字模提取程序

如果在程序中使用的汉字数目不多,也可以不必总是在程序里带上几百K的字库文件,也许你的程序才只有几十K。这样可以事先将所需要显示的汉字字模提取出来,放在另一个文件里,按照自己的顺序读取文件就可以了。
  下面的程序说明了具体显示汉字的方法,以16×16汉字为例,使用HZK16文件。
在TC 2.0下运行上面程序,就在屏幕上打印出你想要显示的汉字,例如该程序运行后会在屏幕上显示: 你好,世界!
程序中每次将一个汉字的点阵字模存储于buffer[32]缓冲数组里面,因此我们可以编程从该缓冲数据组里面取出对应汉字的点阵模存储于另的一个数组里面,然后可以通过PC机串口发送给单片机,最后显示在LED点阵显示屏上。

 1  #include < stdio.h >
 2 
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字模是将汉字、英文字母等字符转换为点阵数据的过程,其实现方式因不同的字库和控制器而异。以下是一个简单的示例,假设使用的是16*16的字库,字库数据存储在ROM中,并通过8位并口接口的LCD进行显示,对应的RS、RW、E、D0-D7引脚分别为P0.0-P0.7: ```c // 定义一个16*16的数组,存储取出的汉字点阵数据 unsigned char matrix[16][16]; // 从ROM中取出汉字点阵数据,存储到matrix数组中(假设ROM地址为0x1000) unsigned char* font_rom = (unsigned char*)0x1000; // 假设字库数据存储在0x1000地址处 unsigned char* matrix_ptr = &matrix[0][0]; unsigned char character = '中'; // 要取模的字符 unsigned int offset = (character - 0x80) * 32; // 计算字库数据在ROM中的偏移量 for(int i = 0; i < 16; i++) { for(int j = 0; j < 2; j++) { unsigned char byte = font_rom[offset++]; // 从ROM中读取一个字节的数据 for(int k = 0; k < 8; k++) { *matrix_ptr++ = (byte & (1 << k)) ? 1 : 0; // 将字节中的每一位转换为0或1,并存储到matrix数组中 } } } // 将matrix数组中的点阵数据显示到LCD上 for(int wordl = 0; wordl < 16; wordl++) { for(int wordc = 0; wordc < 8; wordc++){ unsigned char data = 0; for(int k = 0; k < 8; k++) { data |= (matrix[wordl][wordc * 8 + k] << k); // 将matrix数组中的8个点阵数据合并成一个字节 } LCD_RS = 1; // RS为高,表示传输的是数据而非指令 LCD_RW = 0; // RW为低,表示写入数据 LCD_E = 1; // 使能LCD控制器 P0 = data; // 将数据写入Data口 LCD_E = 0; // 结束数据传输 } } ``` 以上代码仅供参考,实际使用时需要根据具体的字库和LCD控制器进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值