开源个简易的汉字自定义字库工具

2019-12-10 18:16发布

本帖最后由 Ray______ 于 2019-9-29 22:12 编辑

完整汉字库比较大,MCU内部FLASH可能不适合放整字库,放字库到外部FLASH需要多一个芯片,还需要多几个步骤。
有时做带显示屏的产品时,可能需要用到的文字可能只有几十或者几百个,如果可以自定义字库存内部FLASH就比较省空间,操作和烧录也很方便。


所以自己用c#写了个简单的小工具输入文字生成对应的汉字点阵数组。
需要的功能不多,所以工具写的比较简单,固定了某个字体和大小(16*16),也没有做去重。
开放源码有需要的人可以根据需求简单改一点内容就ok,或者也可以把配置功能做进去。


图片:
demo.png (8.85 KB, 下载次数: 0) 下载附件 2019-9-29 21:57 上传

MCU使用代码(追求效率的话可以把字体排序,然后使用二分法):
  1. typedef struct
  2. {
  3.     uint8_t Index[2];   //汉字内码索引
  4.     uint8_t Code[32];   //点阵数据
  5. }GB16_Font_t;

  6. const GB16_Font_t GB_16[] =
  7. {
  8. /*插入字库数据*/
  9. };

  10. int16_t findHzIndex(char *hz)                     /* 在自定义汉字库在查找所要显示的汉字的位置 */                                                   
  11. {
  12.     for(uint8_t i = 0; i < sizeof(GB_16)/sizeof(GB_16[0]); i ++)
  13.     {
  14.         //先用遍历
  15.         if( (hz[0] == GB_16[i].Index[0])&&
  16.             (hz[1] == GB_16[i].Index[1]))
  17.         {
  18.             return i;
  19.         }
  20.     }
  21.    
  22.     return -1;
  23. }
复制代码

补充lcd调用code的一个函数示例:
  1. //一个汉字
  2. void Draw_OneHZ16(uint8_t x0, uint8_t row0, char *hz)
  3. {
  4.     uint8_t i;
  5.     int16_t hzIdx;
  6.    
  7.     hzIdx = findHzIndex(hz);
  8.     if( hzIdx == -1)return;
  9.    
  10.     LCD_SetAddr( row0, x0);
  11.     for( i = 0; i < 16; i ++)
  12.     {
  13.         AA*****T( GB_16[hzIdx].Code[i]);
  14.     }
  15.     LCD_SetAddr( row0+1, x0);
  16.     for( i = 0; i < 16; i ++)
  17.     {
  18.         AA*****T( GB_16[hzIdx].Code[i+16]);
  19.     }
  20. }
复制代码

上位机附件:
自定义字库.zip (445.3 KB, 下载次数: 27) 2019-9-29 21:33 上传 点击文件名下载附件
C#
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Excellence
1楼-- · 2019-12-10 18:23
只能生成16*16汉字?
谢谢分享。
Ray______
2楼-- · 2019-12-10 23:35
Excellence 发表于 2019-9-29 22:12
只能生成16*16汉字?
谢谢分享。

对的,图省事项目只用了16*16。
源码简陋比较容易改。
ruxz@263.net
3楼-- · 2019-12-11 05:08
 精彩回答 2  元偷偷看……
McuPlayer
4楼-- · 2019-12-11 08:41
楼主做得这个挺好,也提供了源码,点一个赞

一周热门 更多>