本帖最后由 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使用代码(追求效率的话可以把字体排序,然后使用二分法):
- typedef struct
- {
- uint8_t Index[2]; //汉字内码索引
- uint8_t Code[32]; //点阵数据
- }GB16_Font_t;
- const GB16_Font_t GB_16[] =
- {
- /*插入字库数据*/
- };
- int16_t findHzIndex(char *hz) /* 在自定义汉字库在查找所要显示的汉字的位置 */
- {
- for(uint8_t i = 0; i < sizeof(GB_16)/sizeof(GB_16[0]); i ++)
- {
- //先用遍历
- if( (hz[0] == GB_16[i].Index[0])&&
- (hz[1] == GB_16[i].Index[1]))
- {
- return i;
- }
- }
-
- return -1;
- }
复制代码
补充lcd调用code的一个函数示例:
- //一个汉字
- void Draw_OneHZ16(uint8_t x0, uint8_t row0, char *hz)
- {
- uint8_t i;
- int16_t hzIdx;
-
- hzIdx = findHzIndex(hz);
- if( hzIdx == -1)return;
-
- LCD_SetAddr( row0, x0);
- for( i = 0; i < 16; i ++)
- {
- AA*****T( GB_16[hzIdx].Code[i]);
- }
- LCD_SetAddr( row0+1, x0);
- for( i = 0; i < 16; i ++)
- {
- AA*****T( GB_16[hzIdx].Code[i+16]);
- }
- }
复制代码
上位机附件:
自定义字库.zip
(445.3 KB, 下载次数: 27)
2019-9-29 21:33 上传
点击文件名下载附件
C#
谢谢分享。
一周热门 更多>