我总结了emWin实现中文显示的几种方案,如下表
实现方案编码方式存放媒介优点缺点适用范围建议
C格式Unicode内部Flash1、支持抗锯齿1、占用内部Flash适用于生成特定几个中文汉字
XBF格式Unicode任何存储介质1、支持抗锯齿
2、存放于任何储存介质1、采用UTF-8方式调用,需要把文件另存为UTF-8格式
2、需要将Unicode编码转化为UTF-8格式适用于非总线接口方式寻址的存储设备
SPI Flash、SD 卡、NAND Flash
SIF格式Unicode总线方式寻址的存储设备
SDRAM、SRAM、NOR Flash1、支持抗锯齿
2、比XBF方式稍快1、采用UTF-8方式调用,需要把文件另存为UTF-8格式
2、需要将Unicode编码转化为UTF-8格式适用于总线接口方式寻址的存储设备
SDRAM、SRAM、NOR Flash
矢量格式UnicodeSDRAM1、支持无损缩放1、消耗CPU和SDRAM资源巨大适用于要求字体矢量方式显示
移植全字库GB2312
GBK任何存储介质1、汉字操作方式与不用使用 GUI一样
2、对比XBF和SIF方式,不需把文件另存为UTF-8格式
3、存放于任何储存介质1、不支持抗锯齿
2、仅支持等宽字体适用于不习惯XBF和SIF操作方式
emWin 本身是不支持 GB2312 编码字符显示的,本文记录的是emWin“移植全字库(GB2312或GBK编码)”方案,即创建一种字体类型来实现GB2312 编码字符的显示,所采用的方式是早期 UCGUI3.98 时期遗留下来,但对那种方法进行了修改,以适合高版本 emWin5.xx 的使用。
1、将原emWin中文件夹【HanZi】复制到目标文件路径…\emWin\HanZi,如图1
图1
2、将原emWin中文件夹【fonts】复制到目标文件路径…\User\fonts,如图1
图2
3、在工程中建立文件夹及添加文件路径,添加完成,如图3
图3
4、修改emWin头文件【GUI_Type.h】,添加代码,如图4
图4
5、在文件【MainTask.h】中添加emWin字体的外部声明(这里使用的是宋体16),如图5
图5
6、把需要用到汉字的控件调用【&GUI_FontHZ16】,如LISTVIEW控件用到汉字显示,写成LISTVIEW_SetFont(hItem, &GUI_FontHZ16);并且屏蔽emWin自带的UTF-8界面方案,如代码1
/* 使能UTF-8解码用于汉字显示 */
//GUI_UC_SetEncodeUTF8();
代码1
注:在stm32h7上使用“移植全字库”方案一定要修改一个地方,具体见http://www.mazirong.com/?p=5308。原因是stm32h7硬件设计上的bug,不支持内存不对齐访问。
至此,编译0错误0警告,下载运行,可以在emWin上愉快的使用中文汉字了!如图6
图6