第26章 任意大小全字库生成和使用方法(GB2312编码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第26章 任意大小全来自百度文库库生成和使用方法 (GB2312 编码)
本章节为大家讲解 GB2312 编码全字库的生成和使用方法,有了本章节的知识,大家就可以生成项目 所需的点阵大小,不过仅支持等宽字体,非等宽字体显示效果不够好。另外,这里说成任意大小是方便大 家理解,生成点阵的大小是受限于用户所使用字体生成软件是否支持生成任意大小点阵字体,如果支持的 话且芯片资源够用,那么使用本章节提供的方法是没有问题的。 学习本章节前,务必保证已经学习了第 25 章,本章节是建立在第 25 章的基础上。 26.1 初学者重要提示 26.2 GB2312 编码全字库的生成方法 26.3 GB2312 全字库的地址计算 26.4 GB2312 全字库的移植方法 26.5 移植文件简易说明 26.6 实验例程说明(RTOS) 26.7 实验例程说明(裸机) 26.8 总结
/* 24*48 ASCII 字符 */
/* 48*48 字符 */
2016年11月24日
版本:2.0
第 9 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
/* 根据汉字内码的计算公式锁定起始地址 */ code2 = c >> 8; code1 = c & 0xFF;
安富莱 STM32-V6 开发板 STemWin 教程
26.3 GB2312 编码全字库的地址计算
下面是新生成字库的地址计算公式, 如果大家使用 26.2 小节所讲的方式生成了其它 GB2312 编码和 ASCII 编码点阵字体,计算公式都是一样的: 汉字点阵 GB2312 编码字库地址计算 GBCode 表示汉字内码。 MSB 表示汉字内码 GBCode 的高 8bits, LSB 表示汉字内码 GBCode 的低 8bits。 Address 表示汉字或 ASCII 字符点阵在芯片中的字节地址。 BaseAdd:说明点阵数据在字库中的起始地址。 48*48 点阵计算方法: BaseAdd=0x00009000; /* 这个即是 26.2 小节末尾用文件合并助手获得的地址 */
点击选项创建字库,弹出如下窗口:
2016年11月24日
版本:2.0
第 3 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
安富莱 STM32-V6 开发板 STemWin 教程
点击保存后,此软件会有一个生成进度:
生成完毕后,就可以在桌面上看到生成的文件 ascii.dzk。 第 4 步:生成 48*48 点阵的 GB2312 编码字体。 点阵字库生成器的配置如下:
26.1 初学者重要提示
再强调一点,学习本章节前,务必保证已经学习了第 25 章,本章节是建立在第 25 章的基础之上,学 完了本章节的内容,以后项目中生成所需的 GB2312 编码字体就很方便了。 对于不习惯前面章节讲解的 XBF 格式和 SIF 格式的 Unicode 编码全字库的用户来说,使用 GB2312 编码是很好的选择, 很适合初学者, 汉字操作方式与大家使用裸机代码 (没有使用 GUI) 时是一样的。 GB2312 编码的全字库文件可以存到任何外部存储介质中。本章节配套例子是将其存到 SPI Flash 里 面了。 使用 GB2312 编码也是有缺点的,相比前面章节使用 FontCvt 生成的 XBF 格式和 SIF 格式全字库, GB2312 编码全字库不支持抗锯齿效果,且仅支持等宽字体(仅支持等宽是因为当前新字体的创建方 法不支持非等宽字体) 。
26.2 GB2312 编码全字库的生成方法
第 25 章,为大家讲解了 12 点阵,16 点阵,24 点阵和 32 点阵的 GB2312 编码汉字和 ASCII 字符。 本章节以宋体, 48 点阵的 GB2312 编码汉字和 ASCII 字符为例给大家说明如何生成自己所需的点阵字体。
武汉安富莱电子有限公司 WWW.ARMFLY.COM
安富莱 STM32-V6 开发板 STemWin 教程
生成的 48 点阵字符,如果大家新生成了其它字体,方法是类似的。
26.5.1 文件 GUICharPEx.c 要修改的内容
对于这个文件,用户仅需修改函数: static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c) 这里依然是从 SPI Flash 里面读取点阵数据:
2016年11月24日
版本:2.0
第 7 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
点击保存后,桌面上会生成一个 font.bin 的文件:
安富莱 STM32-V6 开发板 STemWin 教程
注意,合并后的这个文件不要超过 8MB,因为本教程配套板子的 SPI Flash 大小是 8MB。这个文件的实 际大小大约是 2.46MB,没有超过 8MB。
oft = ((code1 - 0xA1) * 94 + (code2 - 0xA1)) * BytesPerFont + BaseAdd; } /* 读取点阵数据 */ sf_ReadBuffer(GUI_FontDataBuf, oft, BytesPerFont); }
汉字和 ASCII 点阵数据的起始地址计算公式就是前面 26.3 小节讲解的内容,这里仅做了 48 点阵字符,将 其余点阵的删掉了,特别注意一点,如果大家是用的前面 26.2 小节讲解的方法生成的点阵字体,获取点 阵数据的公式都是一样的。大家可以使用这种方式生成所需的 12 点阵,16 点阵,24 点阵,32 点阵,48 点阵等标准点阵字体。
Address = ASCIICode * 144+BaseAdd 144 表示每个 24*48 点阵的字符需要 144 个字节。 (虽然前面是采用 8859-1 编码生成的, 但计算公式依然是这个, 因为 8859-1 的 256 个编码的前 128 个字符就是 ASCII,后 128 是 ASCII 扩展部分)
2016年11月24日
版本:2.0
第 4 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
安富莱 STM32-V6 开发板 STemWin 教程
(注意,那个等宽等高的对勾选上或者不选上均可,选上的话,其中一个设置了,另一个也跟着相同的变 化,如果不选上,两个可以分别进行设置)
点击保存后,此软件会有一个生成进度,由于字符较多,此过程比较慢,需要耐心等待。
添加字库后,效果如下:
2016年11月24日
版本:2.0
第 6 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
安富莱 STM32-V6 开发板 STemWin 教程
输出窗口已经自动生成了对应字体的首地址。这个地址要保存好,后面要用到。 第 3 步:点击右下角的合并,会弹出一个窗口
2016年11月24日
版本:2.0
第 5 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
安富莱 STM32-V6 开发板 STemWin 教程
生成完毕后,就可以在桌面上看到生成的文件 hanzi.dzk。 第 5 步:合并文件 ascii.dzk 和 hanzi.dzk 打开文件合并助手(在第 23 章的 23.3 小节已经提供下载地址) ,加载生成的文件 ascii.dzk 和 hanzi.dzk。
特别注意,这个软件在上面的界面里设置字体大小,没有任何效果,应该是软件的 bug,不过不影响 使用,因为有别的地方可以设置。 第 3 步:生成 24*48 点阵的 ASCII 字符。 由于这个软件不支持生成 ASCII 字符,生成 ISO 8859-1 字符也是可以的,关于 8859-1 字符在前面
/* 点阵数据缓存, 必须大于等于单个字模需要的存储空间*/ #define BYTES_PER_FONT 512 static U8 GUI_FontDataBuf[BYTES_PER_FONT]; /* ********************************************************************************************************* * 函 数 名: GUI_GetDataFromMemory * 功能说明: 读取点阵数据 * 形 参: pProp GUI_FONT_PROP 类型结构 * c 字符 * 返 回 值: 无 ********************************************************************************************************* */ static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c) { U16 BytesPerFont; U32 oft = 0, BaseAdd; U8 code1,code2; char *font = (char *)pProp->paCharInfo->pData; /* 每个字模的数据字节数 */ BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; if (BytesPerFont > BYTES_PER_FONT) { BytesPerFont = BYTES_PER_FONT; } /* 英文字符地址偏移计算 */ if (c < 0x80) { if(strncmp("A48", font, 3) == 0) { BaseAdd = 0x00; } oft = c * BytesPerFont + BaseAdd; } /* 汉字和全角字符的偏移地址计算 */ else { if(strncmp("H48", font, 3) == 0) { BaseAdd = 0x00009000; }

安富莱 STM32-V6 开发板 STemWin 教程
第 1 步:下载多国语言点阵字库生成器,http://bbs.armfly.com/read.php?tid=21469 。 第 2 步:打开此软件,打开后的效果如下:
默认已经是宋体,如果要选择其它字体可以点击左上角的“选择字体” ,弹出如下界面:
26.5.2 文件 GUI_UC_EncodeNone.c 要修改的内容
这个文件不需要做任何修改,与第 25 章的 25.4.2 小节的内容相同。
26.4 GB2312 全字库的移植方法
移植方法在第 25 章的 25.3 小节已经详细讲解,这里不再赘述。
26.5 移植文件简易说明
移植文件已经在第 25 章的 25.4 小节已经详细讲解, 这里主要为大家讲解如何修改这些文件来支持新
2016年11月24日
版本:2.0
第 8 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
2016年11月24日
版本:2.0
第 2 页 共 40 页
武汉安富莱电子有限公司 WWW.ARMFLY.COM
第 24 章的 21.4.2 小节进行了讲解。
安富莱 STM32-V6 开发板 STemWin 教程
(注意,左上角的字体大小设置和下面宽和高的点阵大小设置是有区别的,这里字体大小 36 对应的 实际点阵大小是 24*48,这两个选项都是要用户进行设置的) 点击创建后:
Address =( (MSB – 0xA1) * 94 + (LSB – 0xA1))*288+ BaseAdd; 288 表示每个 48*48 点阵的字符需要 288 个字节。 ASCII 字符地址计算 ASCIICode:表示 ASCII 码( 8bits) BaseAdd:说明该套字库在芯片中的起始地址。 Address: ASCII 字符点阵在芯片中的字节地址。 24x48 点 ASCII 计算方法: BaseAdd=0x00 /* 这个即是 26.2 小节末尾用文件合并助手获得的地址 */
相关文档
最新文档