打印
[技术问答]

汉字在LCD字库中的偏移地址计算、显示方法

[复制链接]
472|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abotomson|  楼主 | 2023-5-29 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

GB2312收录简化汉字及符号、字母、日文假名等共7445 个图形字符,其中汉字占6763 个。GB2312 规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,即所谓的区码。第二个字节为“低字节”,即所谓的位码。GB2312―80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1~0xfe,低位也是0xa1~0xfe;汉字从0xb0a1开始,结束于0xf7fe。GB2312将代码表分为94个区,对应第一字节(0xa1~0xfe);每个区94 个位(0xa1~0xfe),对应第二字节。两个字节的值分别为区号值和位号值加32(20H),因此也称为区位码。01~09区为符号、数字区,16~87区为汉字区(0xb0~0xf7),10~15区、88~94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16~55区,按汉语拼音字母/笔形顺序排列:第二级汉字是次常用汉字计3008 个,置于56~87 区,按部首/笔画顺序排列。故而GB2312 最多能表示6763 个汉字。

而GBK内码完全兼容GB2312,同时支持繁体字,总汉字数有2万多个,编码格式如下,每个GBK 码由2 个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。其中与GB2312相同的区域,字完全相同。把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE~0X81+1),每个区内有190 个汉字(0XFE~0X80+0X7E~0X40+2),总共就有126x190=23940 个汉字。点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数乘以190。这样,就可以得到在这个字库里面定位汉字的方法:

当GBKL<0X7F 时:Hp=((GBKH-0x81)×190+GBKL-0X40)×(sizex2);

当GBKL>0X80 时:Hp=((GBKH-0x81)×190+GBKL-0X41)×(sizex2);

其中GBKH、GBKLL 分别代表GBK 的第一个字节和第二个字节(也就是高位和低位),size 代表汉字字体的大小(比如16 字体,12 字体等),Hp 则为对应汉字点阵数据在字库里面的起始地址。

对于GBK 字库和GB2312 字库,他们的解码部分部分略有不同,这个区别主要是由于他们的编码方式不同引起的,对于GBK 字库,解码的方式如下:

qh=*code;

ql=*(++code);

if(ql<0x7f)

    ql -= 0x40;

else

    ql -= 0x41;

qh -= 0x81;

foffset =((unsigned long)190*qh + ql)*(size * 2);


对于GB2312 字库,解码的方式如下:

qh=*code;

ql=*(++code);

ql -= 0xa1;

qh -= 0xa1;

foffset =((unsigned long)94*qh + ql)*(size * 2);

其中qh、ql 分别代表GBK 的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),foffset 则为对应汉字点阵数据在字库里面的起始地址。


自己取模若干汉字的偏移地址计算

1:定义汉字字模数据结构

2:利用取模软件(如PCtoLCD2002)获取汉字点阵数据

3:编写程序获取汉字点阵输出到LCD显示汉字

Example:

1、16*16汉字字模的数据结构

// ------------16*16汉字字模的数据结构定义 -------------------//

struct typFNT_GB16                 // 汉字字模数据结构

{

   unsigned char Index[3];               // 汉字内码索引      

   char Msk[32];    // 16*16的汉字需要的点阵数据为16*16/8=32字节

};

2、16*16汉字点阵信息,注意格式

// 取模软件:PCtoLCD2002                                                        

// 汉字库: 取模方式列行式,阴码,点阵16,索引32,取模方向顺向,宽高16        


const struct typFNT_GB16 codeGB_16[] =          // 数据表

{

"时",

0x00,0x00,0x7C,0x44,0x47,0x44,0x7C,0x45,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x90,0x90,0x10,0x10,0x10,0x10,0x50,0x20,/*"时",3*/

"间",

0x20,0x13,0x10,0x40,0x47,0x44,0x44,0x47,0x44,0x44,0x47,0x40,0x40,0x40,0x40,0x40,0x00,0xFC,0x04,0x04,0xE4,0x24,0x24,0xE4,0x24,0x24,0xE4,0x04,0x04,0x04,0x14,0x08,/*"间",4*/

"日",

0x00,0x1F,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xF0,0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0x00,0x00,/*"日",5*/

"期",

0x22,0x22,0x7F,0x22,0x3E,0x22,0x3E,0x22,0x22,0xFF,0x00,0x24,0x22,0x43,0x81,0x00,0x00,0x7C,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x7C,0x44,0x84,0x84,0x14,0x08,0x00,/*"期",6*/

"星",

0x00,0x1F,0x10,0x1F,0x10,0x1F,0x01,0x11,0x1F,0x21,0x21,0x4F,0x01,0x01,0x7F,0x00,0x00,0xF8,0x08,0xF8,0x08,0xF8,0x00,0x00,0xFC,0x00,0x00,0xF8,0x00,0x00,0xFE,0x00,/*"星",0*/

"一",

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",1*/

};

2、查找汉字在点阵字库中位置

for(k=0;k<200;k++)     //k表示汉字的个数。查找200个汉字

{

if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1]))

//找到汉字u8 c[2]表示汉字的两字节

{

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

{

m=codeGB_16[k].Msk;//读取这个汉字的32字节点阵数据到//m[32]这个数组中,再根据这个数组中点阵信息显示汉字

      }   

}

}



使用特权

评论回复
沙发
tpgf| | 2023-6-8 17:08 | 只看该作者
汉字在字库中是以什么形式来存储的呢?

使用特权

评论回复
板凳
木木guainv| | 2023-6-9 08:34 | 只看该作者
tpgf 发表于 2023-6-8 17:08
汉字在字库中是以什么形式来存储的呢?

是不是以二级制码也就是ascii码元的形式存储的呢

使用特权

评论回复
地板
磨砂| | 2023-6-9 09:14 | 只看该作者
如果显示固定大小的文字,可以制作点阵字库

使用特权

评论回复
5
晓伍| | 2023-6-9 09:39 | 只看该作者
GBK 编码区分三部分:
1) 汉字区,包括:
GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。
2) 图形符号区,包括:
GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号
GBK/5:OXA840-A9AO,扩除非汉字区。
3) 用户自定义区:
即 GBK 区域中的空白区,用户可以自己定义字符

使用特权

评论回复
6
八层楼| | 2023-6-9 10:26 | 只看该作者
GB2312 最多能表示 6763 个汉字,这也不能满足要求啊

使用特权

评论回复
7
观海| | 2023-6-9 10:42 | 只看该作者
首先得到该汉字点阵码在FLASH里的存储偏移量,然后在加上该汉字库在FLASH里的存放起始地址,就得到了该汉字的点阵数据位置

使用特权

评论回复
8
chenjun89| | 2023-6-9 23:43 | 只看该作者
直接买带字库的显示屏

使用特权

评论回复
9
chenqianqian| | 2023-6-12 08:52 | 只看该作者
现在屏基本上都是自带字库的

使用特权

评论回复
10
febgxu| | 2023-7-5 12:18 | 只看该作者
pctolcd2002怎么使用              

使用特权

评论回复
11
uptown| | 2023-7-5 13:50 | 只看该作者
存储一个16×16点阵汉字,需要多少字节存储空间?

使用特权

评论回复
12
xiaoyaodz| | 2023-7-5 14:55 | 只看该作者
在一些LCD控制器中,汉字的偏移地址是根据汉字编码进行计算的。常见的编码方式有GB2312、GBK、UTF-8等。

使用特权

评论回复
13
qiufengsd| | 2023-7-5 15:14 | 只看该作者
字库中的每个点(像素)都会用一个字节来表示,因此需要逐点或逐行地将字节数据转换为LCD上的像素点。

使用特权

评论回复
14
bartonalfred| | 2023-7-5 15:28 | 只看该作者
请参考相关文档和示例代码以获取准确的偏移地址计算和显示方法。

使用特权

评论回复
15
hudi008| | 2023-7-5 15:37 | 只看该作者
所有汉字的字型以点阵字模的形式储存在哪里?

使用特权

评论回复
16
i1mcu| | 2023-7-5 15:46 | 只看该作者
对于GB2312和GBK编码,每个汉字由两个字节表示。通过汉字的区号和位号可以计算出汉字的偏移地址。例如,区号从0xA1到0xF7,位号从0xA1到0xFE,每个区有94个位。

使用特权

评论回复
17
abotomson|  楼主 | 2023-7-5 15:52 | 只看该作者
根据字库文件中的偏移地址,读取对应的字节数据,并将其传输给LCD控制器进行显示。

使用特权

评论回复
18
ingramward| | 2023-7-5 16:19 | 只看该作者
字库文件可以通过专门的字库生成工具生成

使用特权

评论回复
19
sdlls| | 2023-7-5 16:50 | 只看该作者
实际操作中可能需要根据具体的LCD显示屏和字库格式进行调整

使用特权

评论回复
20
deliahouse887| | 2023-7-5 20:49 | 只看该作者
根据字符编码,计算出相应汉字在字库中的偏移地址。例如,常用的GB2312编码将每个汉字编码为两个字节,高字节表示区号,低字节表示位号。通过这两个字节可以计算出对应汉字在字库中的偏移地址。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

1309

帖子

1

粉丝