菜单

文件浏览器及数码相框 -2.2-字符点阵及汉字库

2019年2月19日 - www6165com

参考资料:

    在应用程序中,一般经过将 FrameBuffer
设备映射到进度地址空间的法门使用,比如下边的顺序就打开 /dev/fb0
设备,

return 1;

HZK16字Curry的16×16汉字一共须求2伍十七个点来体现,约等于说必要3八个字节才能达到突显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;
}

对像素举行瞄颜色

fclose(fphzk);

而是,在单片机上突显汉字也设有多少个难点。首先,单片机能源有限,大家不大概为了展现汉字占用太多的财富;其次,汉字存储读取比较繁琐,使用不便宜;第2,汉字是透过点阵展现出来的,往往与LCD写入措施不一致,那就得举办更换和调整。

 

显示器输出‘a’,“中”

printf(“\n”);

    }

叁 、最终乘以32是因为汉字库文应从该地点起的32字节音讯记录该字的字样消息(前面提到1个中国字要有叁十一个字节突显)

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

};

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

HZK16字库是顺应GB2312标准的16×16点阵字库,HZK16的GB2312-80支撑的方块字有6763个,符号68三个。其中一流汉字有37伍十个,按声序排列,二级汉字有3007个,按偏旁部首排列。大家在有的利用场面根本用不到这么多汉字字模,所以在利用时就可以只领到部分字体作为己用。

 

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01

    }

评释:壹 、区码减1是因为数组是以0为起始而区号位号是以1为伊始的

 

}

1.② 、汉字地址码
  汉字地址码是指汉字字模库(那里主要指整字形的点阵字模库)中储存各汉字字形消息的逻辑地址码。汉语系统中的汉字字模库有两种,它们分别存放在RAM(或EPROM)中和磁盘上。故汉语系统中的汉字地址码有三种,一种采纳内存地址数来代表(对应RAM和EPROM中的字库),别的一种选择盘地址来代表(对应于磁盘中的字库)。由于汉语系统的汉字字模库中汉字字形消息排列的规则,使得普通话系统的汉字字模库中的汉字字形消息排列种类的条条框框,使得汉语系统的汉字地址码与汉字机内码之间存在着一个大致的函数关系。

1. 30天操作系统协助中文。

字符点阵彰显

printf(“0x%02X,”, buffer[k]);

       chip=2;

代码如下:

可以重新写回显示器: #dd if=fbfile
of=/dev/fb;

fphzk = NULL;

area_l=*int8_p-0xa0; //机内码低字节减去0xa0拿到区码

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

HZK16
字库是顺应GB2312标准的16×16点阵字库,HZK16的GB2312-80支撑的方块字有6763个,符号68三个。其中一流汉字有37伍十五个,按
声序排列,二级汉字有300九个,按偏旁部首排列。大家在一部分施用场所根本用不到这么多汉字字模,所以在利用时就能够只领到部分字体作为己用。

}

3自定义小字库的炮制

要求:原操作系统代码里只是支撑了拉脱维亚语突显,需求做的是贯彻对那一个种类的方块字全角协助。

 

{

//显示

hzk16的牵线以及不难的行使方法

 

fgets((char*)word, 3, stdin);

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

HZK16字Curry的16×16汉字一共须要26几个点来展现,约等于说必要叁拾贰个字节才能落得展现3个普通汉字的目标。

可以用命令: #dd if=/dev/zero of=/dev/fb
清空显示器. 尽管突显情势是 1024×768-8 位色,

int main(void)

平抑篇幅,那里唯有给出流程图(假定事先将所需汉字写到了一个文书文件),如图1所示。

第⑥步,要专注,HZK16是上下两片段,差距于日文的左右两部分的社团。

 

}

else if((pos>=192*1024)&&(pos<256*1024)) //在第⑤片27512芯片

完结思路:

 

for(i=0; i<8; i++){

for(i=0;i<32;i++)

运转结果,大家在euc.txt中进入一些汉字。

应用HZK16
字库,将它拷贝到内存中,使用时间接用数组指向某些汉字所在地方

HZK16字Curry的16×16汉字一共要求258个点来突显,相当于说需求33个字节才能达标显示1个平日汉字的目标。

位码=内码第贰字节-160

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

1 static const unsigned char fontdata_8x16[FONTDATAMAX] = {
 2 
 3     /* 0 0x00 '^@' */
 4     0x00, /* 00000000 */
 5     0x00, /* 00000000 */
 6     0x00, /* 00000000 */
 7     0x00, /* 00000000 */
 8     0x00, /* 00000000 */
 9     0x00, /* 00000000 */
10     0x00, /* 00000000 */
11     0x00, /* 00000000 */
12     0x00, /* 00000000 */
13     0x00, /* 00000000 */
14     0x00, /* 00000000 */
15     0x00, /* 00000000 */
16     0x00, /* 00000000 */
17     0x00, /* 00000000 */
18     0x00, /* 00000000 */
19     0x00, /* 00000000 */
20 
21     /* 1 0x01 '^A' */
22     0x00, /* 00000000 */
23     0x00, /* 00000000 */
24     0x7e, /* 01111110 */
25     0x81, /* 10000001 */
26     0xa5, /* 10100101 */
27     0x81, /* 10000001 */
28     0x81, /* 10000001 */
29     0xbd, /* 10111101 */
30     0x99, /* 10011001 */
31     0x81, /* 10000001 */
32     0x81, /* 10000001 */
33     0x7e, /* 01111110 */
34     0x00, /* 00000000 */
35     0x00, /* 00000000 */
36     0x00, /* 00000000 */
37     0x00, /* 00000000 */
38 
39         /*****
40     ****
41     ****
42     ****
43     ****
44     ****
45     ****
46     ****
47     *****/
48 
49     /* 255 0xff '' */
50     0x00, /* 00000000 */
51     0x00, /* 00000000 */
52     0x00, /* 00000000 */
53     0x00, /* 00000000 */
54     0x00, /* 00000000 */
55     0x00, /* 00000000 */
56     0x00, /* 00000000 */
57     0x00, /* 00000000 */
58     0x00, /* 00000000 */
59     0x00, /* 00000000 */
60     0x00, /* 00000000 */
61     0x00, /* 00000000 */
62     0x00, /* 00000000 */
63     0x00, /* 00000000 */
64     0x00, /* 00000000 */
65     0x00, /* 00000000 */
66 
67 };

04 80 0E A0 78 90 08 90 08 84 FF FE 08 80 08 90

0A 90 0C 60 18 40 68 A0 09 20 0A 14 28 14 10 0C

对ASCII字符,则read_hz(‘A’+0xa380);读取

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

    fd_hzk16 =  open("HZK16",O_RDWR);
    if(fd_hzk16 < 0)
    {
        printf("can't open HZK16 \n");
        return -1;
    }

    if(fstat(fd_hzk16, &hzk_stat))    //得到文件统计信息
    {
        printf("can't get fstat\n");
        return -1;

    }
    hzk_mem = (unsigned char *)mmap(NULL, hzk_stat.st_size, \
        PROT_READ, MAP_SHARED, fd_hzk16, 0);
    if(hzk_mem == (unsigned char *) -1)
    {
        printf("can't mmap hzk_mem\n");
        return -1;
    }

printf(“\n”);

pos=32*((int32)((area_h-1)*94)+area_l-1);
//总括在壹个总体的字库中的地点(256K)

  1. 打听HZK编码,驾驭一下适合GB2312标准的汉语点阵字库文件HZK16;
  2. 下载中文GB2312的二进制点阵文件;
  3. 将HZK16.fnt文本放入nihongo文件夹中;
  4. 修改主makefile文件和app_make.txt文件,将本来装载nihongo.fnt的言辞替换到装载HZK16.fnt即可;
  5. 修改bootpack.c文件,将事先分配的装载韩文字体的内存扩展,载入字库的文书名;
  6. 在haribote/graphic.c中加上帮衬汉字的代码,增加3个函数用于浮现汉字;
  7. 修改putfonts8_asc函数里if (task->langmode == 3)语句块;
  8. 测试程序。
  9. 注意:日文的编码是分为左半片段和右半部分,而小编辈应用的HZK16是分为上半部分和下半部分的。

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

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

 

那里其他的地点相比弄,第④步将大小修改一下,作者的是nihongo = (unsigned
char *) memman_alloc_4k(memman, 55*94*32);

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

}

                              }

诸如此类大家就可以得到汉字在HZK16中的相对偏移位置:

unsigned char* fb_mem;

printf(“0x%02X};\n”, buffer[31]);

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

咱俩知道三个GB2312汉字是由八个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每八个区有9几个字符(注意:那只是编码的特许限制,不自然都有字型对应,比如符号区就有许多编码空白区域)。上边以汉字“小编”为例,介绍怎么着在HZK16文书中找到它对应的三贰十二个字节的字样数据。

并透过 mmap 系统调用举行地址映射,随后用
memset 将显示器清空(那里若是显示形式是 1024×768-7人色方式,线性内存情势):

for(j=0; j<2; j++){

1.③ 、汉字沟通码
  汉字沟通码是一种用于汉字新闻处理系统里头,可能与报导系统里面展开新闻置换的汉字代码。汉字交流码位于一台机械的说道和另一台机器(包含输出设备与记录设备)的输入之间。为了要达标系统装置之间或记录介质之间新闻置换的目标,汉字交流码必须使用联合的方式。近期境内总结机连串所接纳的正经音信处理交流码,是依照国家标准制定的,即GB一九八六—
《音讯处理沟通使用的7位编码字符集》;还制定了相应的代码伸张标准,即GB2311

《消息处理交流使用的七个人编码字符集的扩充方法》。因为汉字互换码应与GB一九九〇包容,并依照GB2311所规定的格局开展编制。由于汉字数量远远超乎7位编码所能表示的5000多少个常用汉字制定了交流码的国家标准,即GB2312

《音讯置换用汉字编码字符基本集》,其中每种汉字用对应于GB一九八九的七个七人码来代表。

图片 1

区码:区号(汉字的首先个字节)-0xa0   
(因为汉字编码是从0xa0区伊始的,所以文件最前头就是从0xa0区开首,要算出绝对区码)

for(j=0; j<2; j++){

汉字的字样其实是汉字字形的图形化。对于16点阵字模,就是把汉字写在多少个16×16的网格内,汉字的笔画能过某网格时该网格就对应1,否则该网格对应0,那样每一网格均对应1或0,把对应1的网格连起来看,就是那些汉字。汉字就是那样经过字节表示点阵存储在字库中的。

区码:区号(汉字的首先个字节)-0xa0
(因为汉字编码是从0xa0区伊始的,所以文件最前方就是从0xa0区初始,要算出相对区码)

在采用Framebuffer时,Linux是将显卡置于图形情势下的.

for(k=0; k<16; k++){

一些高端单片机,如小米的M68300系列叁1五人单片机,寻址范围可达8M,液晶突显常用的16×16汉字库二进制数据文件为两百多k,将汉字字库存入大容积的E2PROM,通过地方线可寻址到汉字库中的每多个中国字。

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

那般大家就可以赢得汉字在HZK16中的相对偏移地方:

if(*word == ‘\n’)

2.1中国字字模

面前说到3个中国字占多少个字节,那五个中前1个字节为该汉字的区号,后多少个字节为该字的位号。其中,每一种区记录9六个汉字,位号为该字在该区中的地方。所以要找到“作者”在hzk16库中的地点就亟须获得它的区码和位码。(为了差异使用了区码和区号,其实是3个东西,别被小编误导了)

 

fread(buffer, 1, 32, fphzk);

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

8*16像素的字符点阵

return 0;

    {

framebuffer的配备文件一般是
/dev/fb0、/dev/fb1 等等。

}

2根据单片机的方块字突显原理

    lcd_put_ascii(var.xres / 2, var.yres / 2, 'a');
    printf("中: chinese code: %02x %02x\n", str[0], str[1]);
    lcd_put_chinese(var.xres / 2 + 32, var.yres / 2, str);

for(;;){

                                                      汉字库的接纳 

 

fphzk = fopen(“hzk16”, “rb”);

    {

相关文章

发表评论

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

网站地图xml地图