ST MCU Finder
安装免费手机应用,mg线上娱乐乐游棋牌:
寻找理想的ST MCU

mg线上娱乐乐游棋牌: [GUI] 让uGUI使用emWIN的XBF中文字库

申博太阳城AB亚洲馆时时彩计划软件
211|3
楼主
本帖最后由 liklon 于 2020-6-27 22:10 编辑

BabyOS的GUI功能模块是基于uGUI开源代码,但是uGUI带的字库只支持英文字符的显示。这样精简的GUI,如果能显示中文就完美了。
提到中文字库,字库从哪里来?是否有统一的标准?
emWIN使用的汉字字库可以通过软件(FontCvtST.exe)生成,十分方便。那么就让uGUI也支持emWIN的汉字字库,这样大家就不用纠结字库的来源。
XBF字库简单介绍(汉字编码为unicode):
     XBF文件的前18个字节是文件信息,从18个字节后开始,每6个字节为一组,是字库中字符的索引信息。
     字符的索引信息所在的地址是:(unicode - 0x0020) * 6 + 18 + base_addr      (unicode是字符的unicode编码,base_addr是存储基地址)
     索引信息包含两个信息:4个字节的字模数据地址,2个字节的字模数据长度
     字模数据包含了三个信息:字符的宽度(2个字节),每行数据对应的字节数(2个字节),字模(字模数据长度 - 4个字节)
     我们将字模获取到后便可以再屏上显示了。
值得注意的是,MDK汉字编码为UTF-8,而字库是unicode编码,所以在使用汉字字库时,将BabyOS算法目录中utf转unicode的c文件添加至工程。
然后修改ugui.c的如下几个函数:
  1. UG_PutString
  2. UG_ConsolePutString
  3. _UG_PutText
  4. 增加unicode显示的函数:
  5. void UG_PutCharUnicode(uint32_t v, UG_S16 x, UG_S16 y, UG_COLOR fc, UG_COLOR bc )
  6. {
  7.     uint8_t i = 0, j = 0, k = 0;
  8.     uint8_t tmp_data = 0;
  9.     XBF_Info_t info;   
  10.     XBF_Data_t _data;
  11.     uint32_t info_addr = 0;
  12.     info_addr = _XBF_FILE_ADDR + ((v - ' ') * 6) + 18;
  13.     UG_ReadXBF(info_addr, (uint8_t *)&info, sizeof(XBF_Info_t));           //读取索引信息
  14.     UG_ReadXBF(info.addr, (uint8_t *)&_data, sizeof(XBF_Data_t));          //读取字模信息
  15.     if((gui->font.char_height * _data.x_byte + sizeof(XBF_Data_t)) == info.len)
  16.     {
  17.         for(k = 0;k < (info.len - sizeof(XBF_Data_t));)
  18.         {
  19.             for(i = 0;i < _data.x_byte;i++)
  20.             {
  21.                 UG_ReadXBF(info.addr + sizeof(XBF_Data_t) + k + i, &tmp_data, 1);
  22.                 for(j = 0;j < 8;j++)
  23.                 {
  24.                     if((i * 8 + j) >= _data.x_len)
  25.                     {
  26.                         break;
  27.                     }
  28.                     if((tmp_data << j) & 0x80)
  29.                     {
  30.                         gui->pset(x + i * 8 + j,y + k / _data.x_byte, fc);
  31.                     }
  32.                     else
  33.                     {
  34.                         gui->pset(x + i * 8 + j,y + k / _data.x_byte, bc);
  35.                     }
  36.                 }
  37.             }
  38.             k += _data.x_byte;
  39.         }
  40.     }  
  41. }
复制代码

下面演示如何基于BabyOS使用uGUI。


1.使能功能模块
UGUI配置中配置LCD的物理尺寸。字体方面:选择FONT_XBF。编译器的中文编码方式:MDK使用UTF-8,所以配置文件里面选择了UTF-8。
XBF字库文件有1M多,默认是存储再SPIFLASH中,配置文件中指定XBF存储的基地址,这里配置的是0.
将字库文件放在SD卡中,再从SD卡拷贝至SPIFLASH,BabyOS一键移植FatFS:1.使能FS功能模块,选择FATFS 2.勾选SD卡,填写SD卡容量
2.添加第三方代码FatFS3.添加SPIFLASH和SD卡驱动4.将SD卡中的字库文件拷贝至SPIFLASH4.1字库生成方式
选择字体和字号
保存为XBF文件
  1. if(0 == bFS_Init())                //初始化FatFS
  2. {
  3.     /*     copy font12.xbf        */
  4.     _CopyFontFile(&fil, "1:font12.xbf");   //执行拷贝
  5. }
  6. ?
  7. static int _CopyFontFile(FIL *pf, char *fname)    //每次拷贝4K字节
  8. {
  9.     int retval, ret = 0;
  10.     int fd = -1;
  11.     uint32_t font_size;
  12.     int i = 0;
  13.     uint32_t r = 0;
  14.     bCMD_Erase_t cmd;
  15.     fd = bOpen(SPIFLASH, BCORE_FLAG_RW);
  16.     if(fd < 0)
  17.     {
  18.         b_log_e("open err\r\n");
  19.         return -1;
  20.     }
  21.     retval = f_open(pf, fname, FA_READ);
  22.     if(retval == FR_OK)
  23.     {
  24.         font_size = f_size(pf);
  25.         b_log("filesize:%d\r\n", font_size);
  26.         for(i = 0;i < font_size;)
  27.         {
  28.             f_read(pf, TmpBuf, 4096, &r);
  29.             if(r)
  30.             {
  31.                 b_log("r:%d\r\n", r);
  32.                 cmd.addr = i;
  33.                 cmd.num = 1;
  34.                 bCtl(fd, bCMD_ERASE_SECTOR, &cmd);
  35.                 bLseek(fd, i);
  36.                 bWrite(fd, TmpBuf, r);
  37.             }
  38.             if(r < 4096)
  39.             {
  40.                 b_log("end...\r\n");
  41.                 break;
  42.             }
  43.             i += 4096;
  44.         }
  45.         f_close(pf);
  46.     }
  47.     else
  48.     {
  49.         ret = -1;
  50.         b_log("open err:%d\r\n", retval);
  51.     }  
  52.     bClose(fd);
  53.     return ret;
  54. }
复制代码


5.显示字符串
  1. bGUI_Init(TFT, -1);               //初始化GUI模块
  2.   UG_FillScreen(C_BLACK);           //填充背景色
  3.   UG_PutString(0, 0, "你好hello");   //显示6.main函数......
  4.   bInit();
  5. #if COPY_FONTFILE  
  6.   if(0 == bFS_Init())
  7.   {
  8.     /*     copy font12.xbf        */
  9.     _CopyFontFile(&fil, "1:font12.xbf");
  10.   }
  11. #else
  12.   char test[4] = "你 ";
  13.   b_log("%x %x %x\r\n", test[0], test[1], test[2]);
  14. ?
  15.   bGUI_Init(TFT, -1);
  16.   UG_FillScreen(C_BLACK);
  17.   UG_PutString(0, 0, "你好hello");
  18. #endif  
  19.   while (1)
  20.   {
  21.     bExec();
  22.   /* USER CODE END WHILE */
  23. ?
  24.   /* USER CODE BEGIN 3 */
  25. ?
  26.   }
  27.   /* USER CODE END 3 */
  28. ......
复制代码


BabyOS master分支 http://www.076.cao823.com/notrynohigh/BabyOS   


沙发
| 2020-6-28 08:26 | 只看该作者
谢谢分享,,,,,,babyos是什么操作系统?
板凳
| 2020-6-28 10:21 | 只看该作者
zeshoufx 发表于 2020-6-28 08:26
谢谢分享,,,,,,babyos是什么操作系统?

娃子系统,

开个玩笑。
地板
| 2020-6-28 16:20 | 只看该作者
我也没听过,babyos是个什么东西呢?
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

申博太阳城AB亚洲馆时时彩计划软件 永利游戏开户直营 返回顶部 返回列表
东莞开设赌场最新案件网上娱乐场 84tyc.com 王者威尼斯人MG 168彩票app下载直营网 巴黎人北京PK10时时彩q群
必赢BBIN电子 896sun.com 白金会棋牌优惠 澳门24小时娱乐城KG开元棋牌 523sb.com
295tyc.com tyc566.com kcd26.com 888集团MG电子 心博天下棋牌上网导航
沙龙游戏现金直营网 939msc.com 时时彩官网现金网登入 73sblive.com 蓝博AP 爱棋牌