增添中文字库,HZK16选用实例

增添中文字库,HZK16选用实例

代码如下:

大家知晓二个GB231二汉字是由多少个字节编码的,范围为A一A一~FEFE。A壹-A九为符号区,B0到F柒为汉字区。每二个区有9五个字符(注意:那只是编码的准许限制,不肯定都有字型对应,比方符号区就有大多编码空白区域)。下边以汉字“小编”为例,介绍如何在HZK1陆文本中找到它对应的33个字节的字样数据。

表116点阵汉字字库存储方式

三、最后乘以3二是因为汉字库文应从该岗位起的3二字节消息记录该字的字样音讯(前边提到多少个汉字要有三10个字节展现)

 1 void lcd_put_chinese(int x, int y, unsigned char *str)
 2 {
 3     unsigned int area = str[0] - 0xa1;
 4     unsigned int where = str[1] - 0xa1;
 5     unsigned char *dots = hzk_mem + (area * 94 + where) * 32;
 6     unsigned char byte;
 7     int i,j,b;
 8 
 9     for(i=0; i < 16; i++)
10         for(j=0; j < 2; j++)
11         {
12             byte = dots[i*2 + j];
13             for(b=7; b >=0; b--)
14             {
15                 if(byte & (1<<b))
16                 {
17                     /* 显示 */
18                     lcd_put_pixel(x + j * 8 + 7 - b, y + i, 0xffffff);//白
19                 }
20                 else
21                 {
22                             /* 不显示 */
23                     lcd_put_pixel(x + j * 8 + 7 - b, y + i, 0);//黑
24                 
25                 }
26             }
27         }
28 
29 }

区位码(10进制) 内码(16进制)
区号 位号 高字节 低字节
1—9 1—94 A1—A9 A1—FE
10—12 1—94 AA—AC A1—FE
13—15 1—94 AD—AF A1—FE
16—87 1—94 B0—F7 A1—FE

图片 1

能够另行写回显示器: #dd if=fbfile
of=/dev/fb;

                                                 hzk1陆汉字库的简练读写程序

位码:位号(汉字的第三个字节)-0xa0

int fb;

                               图形LCD模块ACM192玖四ASB的汉字展现

运作结果,大家在euc.txt中投入一些中华夏族民共和国字。

     2、(94*(区号-1)+位号-壹)是2个汉字字模占用的字节数

select_chip(chip);   //选择第chip片27512芯片

大家知道一个GB231二汉字是由七个字节编码的,范围为A1A一~FEFE。A1-A9为符号区,B0到F7为汉字区。每3个区有玖多少个字符(注意:那只是编码的准许范围,不肯定都有字型对应,比方符号区就有好些个编码空白区域)。上边以汉字“作者”为例,介绍怎么样在HZK1陆文本中找到它对应的33个字节的字样数据。

 

    {

1. 30天操作系统扶助普通话。

字符点阵显示

                                                      汉字库的选拔 

offset=(94*(区码-1)+(位码-1))*32

 

在PC机的文件文件中,汉字是以机内码的花样积累的,各个汉字占用七个字节:第一个字节为区码,为了与ASCII码不相同,范围从十陆进制的0A一H开头(小于80H的为ASCII码字符),对应区位码中区码的首先区;第一个字节为位码,范围也是从0A一H开始,对应某区中的第贰个位码。那样,将汉字机内码减去0A0AH就得该汉字的区位码。

要求:原操作系统代码里只是支撑了意大利语显示,供给做的是得以达成对那一个系统的汉字全角扶助。

 

for(j=0;j<16;j++)
        for(i=0;i<2;i++)
            for(k=0;k<8;k++)
               
if(mat[j][i]&(0x80>>k)) /*测试为一的位则体现*/
                    {

 有了摇头地址就足以从HZK1陆中读取汉字编码了

刷写8*16字符点阵


区码:区号(汉字的率先个字节)-0xa0
(因为汉字编码是从0xa0区始发的,所以文件最前边正是从0xa0区开端,要算出相对区码)

 

再由区位码能够拿走它在汉字库中字模第三个字节的职位:

申明:一、区码减1是因为数组是以0为开端而区号位号是以1为起初的

1 lcd_put_ascii(int x, int y, unsigned char c )
 2 {
 3     unsigned char *dots = (unsigned char *)&fontdata_8x16[c*16];
 4     int i, b;
 5     unsigned char byte;
 6     
 7     for(i = 0; i < 16; i++)
 8     {
 9         byte = dots[i];
10         
11         for(b = 7; b >= 0; b --)
12         {
13             if(byte & (1<<b))
14             {
15                 /* 显示 */
16                 lcd_put_pixel(x + 7 - b, y + i, 0xffffff);//白
17             }
18             else
19             {
20                         /* 不显示 */
21                 lcd_put_pixel(x + 7 - b, y + i, 0);//黑
22             
23             }
24         }
25     }
26     

#define int8 unsigned char

HZK1陆字Curry的1陆×1陆汉字1共必要二五1几个点来呈现,也正是说须求三拾贰个字节技艺完结显示2个平时汉字的目标。

这么大家就足以获取汉字在HZK16中的相对偏移地点:

值得注意的是,基于单片机的汉字突显不能够在字符LCD上贯彻。使用图形LCD有过多独到之处,不仅能呈现汉字,而且能够完毕汉字动态移动和上下滚屏,完成汉字与图片的叶影参差展现,同时耗电低。

这么大家就足以获得汉字在HZK1陆中的相对偏移地点:

memset (fb_mem, 0, 1024*76八);
//这一个命令应该只有在root能够实施

    }   

参考资料:

 

汉字占用财富太多(如1陆点阵,每一种汉字就需3二字节),由此平日把汉字库放在EEPROM里,要求体现有些汉字时,先算出它的区位码,再求出点阵初叶地方,从EEPROM中逐条调出该字的点阵数据,存在缓冲区里,最后依次送往LCD显示,描出该字。需求证实的是汉字存储格局与LCD显示格局有自然差距。

HZK16字库是契合GB231二标准的1六×16点阵字库,HZK1六的GB231二-80支撑的汉字有67陆一个,符号6八一个。个中超级汉字有3753个,按声序排列,二级汉字有300几个,按偏旁部首排列。大家在1部分采用场所根本用不到这么多汉字字模,所以在行使时就可以只领到部分字体作为己用。

 

else if((pos>=64*1024)&&(pos<128*10贰四)) //在第一片2751二芯片

第4步,要注意,HZK1陆是上下两有些,分裂于日文的左右两有个其他布局。

8*1陆像素的字符点阵

    }

hzk1陆的牵线以及轻巧的选用办法

 

杰出的汉字库可选拔UCDOS下的字库,如1陆点阵字库HZK1陆。要求25六K空间,用了异常的大的EEPROM,又不方便人民群众读取,而实际利用中需求的方块字又卓殊少,因此我们能够和谐制作小的汉字库,在这一个小字Curry只含有系统要求的方块字。那样,1方面节省读取时间,另一方面大大地节约了财富。

  1. 询问HZK编码,通晓一下顺应GB231二典型的普通话点阵字库文件HZK1六;
  2. 下载中文GB231二的二进制点阵文件;
  3. 将HZK1陆.fnt文书放入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将原先装载nihongo.fnt的语句替换到装载HZK1陆.fnt就能够;
  5. 修改bootpack.c文件,将事先分配的装载塞尔维亚语字体的内部存款和储蓄器增添,载入字库的文件名;
  6. 在haribote/graphic.c中增多帮忙汉字的代码,增添3个函数用于呈现汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测试程序。
  9. 注意:日文的编码是分为左半片段和右半部分,而小编辈选取的HZK16是分为上半部分和下半部分的。

并经过 mmap 系统调用实行地址映射,随后用
memset 将显示屏清空(那里假设显示形式是 拾二四x768-陆人色形式,线性内部存款和储蓄器形式):

有了舞狮地址就能够从HZK1陆中读取汉字编码了,剩下的正是文本操作了,就隐瞒了,要看代码(汉字)正是上面的:“hzk16汉字库的粗略读写程序 ”,是三个最轻便易行的c语言程序。

2、(94*(区号-一)+位号-1)是2个汉字字模占用的字节数

 

二.2汉字展现

 

HZK1陆字库里的1陆×1陆汉字壹共须要257个点来突显,约等于说需求三十八个字节约能源力落成展现2个雅淡无奇汉字的目的。

概念如下:
unsigned char str[]=”我”
在运维时str被初步化为1个字节长度,内容为“小编”的GBK码,为:0xCE(区码),0xD二(位码)。
使用如下换算公式获得“小编”在HZK1六文书中的地址,从该地方上马的顺序32字节为“作者”的字样。
    ADD=【(区码-0xa1)×0x5e + (位码-0xa1)】×0x20
鲁人持竿下边包车型大巴企图方法,“俺”的字样地址:0x21陆E0 。他的C语言字模为:0x0四,0x80,0x0E,0xA0,0x7八,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

目前谈到一个中华夏族民共和国字占几个字节,那两个中前2个字节为该汉字的区号,后二个字节为该字的位号。当中,各个区记录玖伍个汉字,位号为该字在该区中的地方。所以要找到“作者”在hzk1陆库中的地点就非得获得它的区码和位码。(为了区别使用了区码和区号,其实是3个事物,别被小编误导了)

 

    {

void putfont32(char *vram, int xsize, int x, int y, char c, char *font1, char *font2)
{
    int i,k,j,f;
    char *p, d ;
    j=0;
    p=vram+(y+j)*xsize+x;
    j++;
    //上半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font1[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
       /* for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    //下半部分
    for(i=0;i<16;i++)
    {
        for(k=0;k<8;k++)
        {
            if(font2[i]&(0x80>>k))
            {
                p[k+(i%2)*8]=c;
            }
        }
        if(i%2==0){
            for(k=0;k<4;k++){
                f=p[k];
                p[k]=p[7-k];
                p[7-k]=f;
            }
        }else{
            for(k=0;k<4;k++){
                f=p[k+8];
                p[k+8]=p[15-k];
                p[15-k]=f;
            }
        }
        /*for(k=0;k<8/2;k++)
        {
            f=p[k+(i%2)*8];
            p[k+(i%2)*8]=p[8-1-k+(i%2)*8];
            p[8-1-k+(i%2)*8]=f;
        }*/
        if(i%2)
        {
            p=vram+(y+j)*xsize+x;
            j++;
        }
    }
    return;
}

 

只是,在单片机上显示汉字也存在多少个难题。首先,单片机财富有限,大家不能够为了呈现汉字占用太多的能源;其次,汉字存款和储蓄读取比较繁琐,使用不便于;第壹,汉字是因此点阵展现出来的,往往与LCD写入措施不雷同,那就得进行更改和调动。

福寿绵绵思路:

 

//显示

此地别的的地点比较弄,第四步将大小修改一下,小编的是nihongo = (unsigned
char *) memman_alloc_4k(memman, 55*94*32);

各样字符由14个字节表示

                              }

三个字节伍位来代表1行的8个像素是或不是被入选点亮

int16 area_l,area_h;//定义两个整型变量,用于存款和储蓄区码和位码

仿照写一个

int8
hz_buffer[32];//定义3二字节数组,用于存款和储蓄点阵字模,该字模为横排字模。

 

譬如说汉字“房”的机内码为十6进制的“B柒BF”,在那之中“B七”表示区码,“BF”表示位码。所以“房”的区位码为0B七BFH-0A0A0H=17一FH。将区码和位码分别转变为十进制得汉字“房”的区位码为“233一”,即“房”的点阵位于第三叁区的第二3个字的职位,相当于在文件HZK16中的地方为第一贰×[(23-1)
×94+(31-1)]=6713六B以往的三13个字节为“房”的显得点阵。

FrameBuffer的规律     FrameBuffer
是出未来 2.贰.xx 根本个中的一种驱动程序接口。

壹.2、汉字地址码
  汉字地址码是指汉字字模库(那里关键指整字形的点阵字模库)中蕴藏各汉字字形信息的逻辑地址码。中国语言管经济学系统中的汉字字模库有三种,它们分别存放在RAM(或EPROM)花潮磁盘上。故中文系统中的汉字地址码有二种,一种选择内部存款和储蓄器地址数来代表(对应RAM和EPROM中的字库),此外一种选取盘地址来表示(对应于磁盘中的字库)。由于中国语言文学系统的汉字字模库中汉字字形音讯排列的条条框框,使得中国语言经济学系统的汉字字模库中的汉字字形新闻排列连串的规则,使得中国语言医学系统的方块字地址码与汉字机内码之间存在着三个轻便的函数关系。

 

int八   chip;  //字模所在的芯片,可用7四HC13八之类的芯片译码。

用命令: #dd if=/dev/fb of=fbfile 
能够将fb中的内容保留下去;

   
 在实际中,由于现很少使用EPROM芯片,能够用并口、SPI,I2C接口的大容积Flash、EEPROM芯片。但I2C接口速度相当慢,显示汉字的快慢将会非常的慢,能够在一些相比较少字场馆使用;而SPI接口的存款和储蓄芯片速度非常的慢,接口容易,对于一般的选择场地依然得以满足的;对于大气用到的场面,能够运用并行接口,它具积攒空间大,读取速度快的特征,如运用AT2九多级的Flash存款和储蓄器,单片容积可以达到规定的标准256K上述,就不需求分开积攒,但其必要较多的IO口,接口复杂。所以应依赖实际来选拔存款和储蓄器。

动用HZK1陆字库,将它拷贝到内部存款和储蓄器中,使用时一直用数组指向有些汉字所在地点

*/

fb_mem = mmap (NULL, 1024*768,
PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

                                  汉字的字样与显示–汉字的代码体系
目 录
  一.一 汉字机内码
  1.贰 汉字地址码
  一.三 汉字交流码
  1.四 汉字字型码

 

       chip=2;

 使用#include <sys/stat.h>中的fstat()函数来总括HZK1陆文件音讯

                         }else{   printf(“%s”,’-‘);

 

贰基于单片机的方块字呈现原理

用命令:$ dd if=/dev/zero of=/dev/fb0
bs=10二四 count=768 清空显示屏;

  在汉字音讯管理系统中留存着冒尖汉字编码。一般的话,在系统的分歧地位,可依照其意况给汉字定以相应的编码,因为在汉字音信管理系统中留存着数种汉字编码。那么些编码构成了三个中夏族民共和国字的代码种类。

 

int8   *int8_p;//定义一个unsigned char 指针

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图