硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7881|回复: 17
收起左侧

[emWin] 求助!关于xbf外置字库显示汉字(外部spi flash)  在控件上的使用

[复制链接]

1

主题

1

回帖

1

积分

新手上路

积分
1
QQ
发表于 2014-11-5 10:44:40 | 显示全部楼层 |阅读模式
近几天在调试xbf外置字库方式显示汉字,现在汉字可以单独显示,但是还不能再控件上使用。

具体的过程如下:
使用FontCvt工具,生成的xbf文件,包含3500汉字和ASCII字符,设置选项是Standrad,宋体,16Pixels。
生成的文件大小是400KB左右,下载到SST25VF080B(容量为1MB)。


接下来参考的是 这个帖子 http://www.armbbs.cn/forum.php?mod=viewthread&tid=3329 中的方法
新建一个文件 hz_16.c,内容如下:
  1. #include <stddef.h>
  2. #include "gui.h"
  3. #include "fonts.h"
  4. #include "bsp_flash.h"
  5. GUI_XBF_DATA  XBF_Data_hz16;        /* GUI_XBF_DATA structure in RAM */
  6. GUI_FONT      xbfFont_hz16;  /* GUI_FONT structure in RAM */
  7. static int _cbGetData(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
  8. {
  9.       if((pBuffer == NULL) || (NumBytes == 0))
  10.       {   return 1; }
  11.       SPI_Flash_Read(pBuffer, Off, NumBytes);
  12.       return 0;
  13. }
  14. void CreateXBF_Font(void)
  15. {
  16.        GUI_XBF_CreateFont(        &xbfFont_hz16,          /* Pointer to GUI_FONT structure */
  17.                            &XBF_Data_hz16,                             /* Pointer to GUI_XBF_DATA structure */
  18.                            GUI_XBF_TYPE_PROP,                          /* Font type to be created */
  19.                            _cbGetData,                                 /* Pointer to callback function */
  20.                            NULL);                                      /* Pointer to be passed to callback */
  21. }
复制代码
这里需要注意的一点就是 "GUI_XBF_TYPE_PROP"这个参数的值与你选择的字体类型有关
例如Standrad,对应的就是GUI_XBF_TYPE_PROP

在fonts.h中添加了两个函数的声明 和 两个结构体的声明 ,在主函数所在的文件中包含fonts.h


主程序的代码如下:
  1. int main(void)
  2. {
  3.     BSP_Init();
  4.     GUI_Init();
  5.     GUI_SetBkColor(GUI_WHITE);
  6.     GUI_SetColor(GUI_RED);
  7.     GUI_Clear();   
  8.    
  9.     CreateXBF_Font();                                      //创建XBF字体
  10.     GUI_UC_SetEncodeUTF8();                                //一定要设置这个
  11.     GUI_SetFont(GUI_FONT_6X8_ASCII);
  12.     GUI_DispStringAt("GUI Start Succ!", 7, 4);
  13.     GUI_SetFont(&xbfFont_hz16);                             //设置XBF字库为当前字体
  14.     GUI_DispStringAt("汉字显示测试OK!", 150, 250);             //
  15.     GUI_DispStringAt("123ABC四五六七.", 150, 280);
  16.    
  17.     GUI_SetFont(&GUI_Font24_ASCII);
  18.     GUI_DispStringAt("Hello world!",20,40);
  19.     while(1)
  20.     {
  21.         _DemoButton();
  22.     }
  23. }
  24. static void _DemoButton(void)
  25. {
  26.     BUTTON_Handle hButton;
  27.     GUI_SetFont(&GUI_Font8x16);
  28.     GUI_DispStringHCenterAt("Hello world!",160,90);
  29.    
  30.     hButton = BUTTON_Create(110,110,100,40,GUI_ID_OK,WM_CF_SHOW);
  31.     GUI_SetFont(&xbfFont_hz16);
  32.     BUTTON_SetText(hButton,"点我");
  33.     while(GUI_WaitKey() != GUI_ID_OK);
  34.     BUTTON_Delete(hButton);
  35.     GUI_ClearRect(0,50,319,239);
  36.     GUI_Delay(1000);
  37. }
复制代码
现在的现象是 两个英文字符串 和 两个中文字符串 都可以正常显示,按钮上的汉字无法显示。
有谁了解这个吗?请求指导。
回复

使用道具 举报

1

主题

1

回帖

1

积分

新手上路

积分
1
QQ
 楼主| 发表于 2014-11-5 11:39:10 | 显示全部楼层
已经解决了,
GUI_SetFont(&xbfFont_hz16);
BUTTON_SetText(hButton,"点我");
改为:
BUTTON_SetFont(hButton,&xbfFont_hz16);
BUTTON_SetText(hButton,"点我");
之后就可以在按钮上显示汉字了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2014-11-5 14:10:57 | 显示全部楼层

回 charles_moon 的帖子

charles_moon:已经解决了,
GUI_SetFont(&xbfFont_hz16);
BUTTON_SetText(hButton,"点我");
改为:
BUTTON_SetFont(hButton,&xbfFont_hz16);
....... (2014-11-05 11:39) 
楼主解决了就好。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2014-11-5 14:10:59 | 显示全部楼层
[s:151]  [s:151]
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2014-12-13 16:51:39 | 显示全部楼层
我现在也正准备把字库放到spiflash,求指导。
请教个问题,你的字库文件是怎么弄到spiflash的,。
谢谢
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
发表于 2014-12-17 00:30:40 | 显示全部楼层
请问楼主生成只有3500个汉字软件是怎么设置的?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2014-12-17 10:10:01 | 显示全部楼层

回 lishi1013 的帖子

lishi1013:请问楼主生成只有3500个汉字软件是怎么设置的?
 (2014-12-17 00:30) 
直接使用软件FontCvt生成就行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2014-12-17 10:11:56 | 显示全部楼层

回 xiaosir 的帖子

xiaosir:我现在也正准备把字库放到spiflash,求指导。
请教个问题,你的字库文件是怎么弄到spiflash的,。
谢谢 (2014-12-13 16:51) 
使用串口调试助手往spiflash下载就行,只是需要你写一个代码讲MCU接收到的数据写进去。或者从SD卡等存储介质复制进去。
回复

使用道具 举报

338

主题

2051

回帖

3070

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3070
发表于 2014-12-22 11:10:34 | 显示全部楼层

回 xiaosir 的帖子

xiaosir:我现在也正准备把字库放到spiflash,求指导。
请教个问题,你的字库文件是怎么弄到spiflash的,。
谢谢 (2014-12-13 16:51) 
求助万能的淘宝吧!
烧写25,或者24系列的flash ,eeprom可以买个烧录器,淘宝有简单的版本的只要二十元钱左右!
回复

使用道具 举报

338

主题

2051

回帖

3070

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3070
发表于 2014-12-22 11:11:30 | 显示全部楼层
有没有办法用GB2312的编码?
C文件都要修改为UTF8好麻烦。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2014-12-22 12:07:50 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:有没有办法用GB2312的编码?
C文件都要修改为UTF8好麻烦。。。。。 (2014-12-22 11:11) 
有的,看我们的emWIn教程第19章
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-4-18 08:58:30 | 显示全部楼层

回 eric2013 的帖子

eric2013:使用串口调试助手往spiflash下载就行,只是需要你写一个代码讲MCU接收到的数据写进去。或者从SD卡等存储介质复制进去。 (2014-12-17 10:11)
哈哈  这个思路也不错  我说我是如何把字库写到spi flash中的  

其实用的是一种变通的方法,mdk中有闪存编程算法这种东西,这样我们只要新建一个相应的spi flash对应闪存编程算法,并且虚拟一个地址段映射到这个spi flash上,就可以用mdk的工程把字库写到flash中去了
回复

使用道具 举报

0

主题

87

回帖

206

积分

高级会员

积分
206
发表于 2015-5-25 14:14:11 | 显示全部楼层
能给个例子工程文件吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2015-5-25 14:24:31 | 显示全部楼层

回 mingjie 的帖子

mingjie:能给个例子工程文件吗 (2015-05-25 14:14) 
http://www.armbbs.cn/forum.php?m ... 046&fpage=2
回复

使用道具 举报

0

主题

87

回帖

206

积分

高级会员

积分
206
发表于 2015-5-25 15:43:04 | 显示全部楼层
能详细讲解一下吗?  我用FontCvt软件生成一个xbf文件,命名为Font16_t.xbf      
然后直接拷贝

/* 宋体16点阵定义 */
#define   XBF_Font16BaseAdd   0x00000000
GUI_XBF_DATA XBF_Data16;
GUI_FONT     XBF_Font16;
void         *Fontfile16;

/*
*********************************************************************************************************
*    函 数 名: _cbGetData16
*    功能说明: XBF字体的回调函数, 16点阵
*    形    参: Off      - 地址偏移
*             NumBytes - 需要读出的字节数
*             pVoid    - 应用定义指针,一般用于带文件系统时的FIL类型变量
*             pBuffer  - 获取字体的点阵数据
*    返 回 值: 0 表示成功 1 表示失败
*********************************************************************************************************
*/
static int _cbGetData16(U32 Off, U16 NumBytes, void * pVoid, void * pBuffer)
{   
    /* 读取点阵数据 */
    sf_ReadBuffer(pBuffer, XBF_Font16BaseAdd + Off, NumBytes);
    return 0;
}
/*
*********************************************************************************************************
*    函 数 名: GUI_SetXBF
*    功能说明: 使用XBF字体
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void GUI_SetXBF(void)
{
    /* 创建16点阵字体 */
    GUI_XBF_CreateFont(&XBF_Font16,        /* GUI_FONT类型变量     */
                     &XBF_Data16,          /* GUI_XBF_DATA类型变量 */
                     GUI_XBF_TYPE_PROP,    /* 字体类型             */
                     _cbGetData16,         /* 回调函数             */
                     &Fontfile16);         /* 回调函数指针         */
}
主函数里

/* 创建XBF字体 */
GUI_SetXBF();
GUI_UC_SetEncodeUTF8();                                    //然后像使用其它字体一样,设置XBF字库为当前字体
GUI_DispStringAt("汉字显示测试OK!", 4, 20);         //用起来就是这么简单
GUI_DispStringAt("123ABC四五六七.", 4, 40);


不知道哪里需要修改
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2015-5-25 15:47:49 | 显示全部楼层

回 mingjie 的帖子

mingjie:能详细讲解一下吗 (2015-05-25 15:43) 
看我们60期emWin教程的XBF章节,
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932
只是这个章节是用外置SD卡,跟给你提供地址里面的例子只是字体存储方式不同。
回复

使用道具 举报

0

主题

87

回帖

206

积分

高级会员

积分
206
发表于 2015-5-27 10:23:01 | 显示全部楼层

回 eric2013 的帖子

eric2013:http://www.armbbs.cn/forum.php?mod=viewthread&tid=9046&fpage=2 (2015-05-25 14:24) 
我现在能显示汉字  但是只能显示一个汉字   
比如:
GUI_DispStringAt("汉字显示测试OK!", 150, 250);
GUI_DispStringAt("123ABC四五六七.", 150, 280);
只能显示“汉”  其他后面的都不显示    不知道怎么回事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107868
QQ
发表于 2015-5-27 15:42:00 | 显示全部楼层

回 mingjie 的帖子

mingjie:我现在能显示汉字  但是只能显示一个汉字  
比如:
GUI_DispStringAt("汉字显示测试OK!", 150, 250);
GUI_DispStringAt("123ABC四五六七.", 150, 280);
....... (2015-05-27 10:23) 
是GB编码的,还是XBF字体。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-16 21:00 , Processed in 0.356519 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表