OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8174|回复: 6

UCGUI汉字显示(通过外部FLASH W25QXX)

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2014-8-15
在线时间
47 小时
发表于 2017-4-18 23:54:59 | 显示全部楼层 |阅读模式
10金钱
最近在做一个实验,UCGUI通过外部FLASH来实现汉字显示。通过参考教程,修改了几个文件后,发现程序中显示的文字方位不对,变成了镜像的并且还旋转90度显示了。以为是字库问题,但是调用战舰里面的汉字显示函数后,可以正常显示。所以不知道怎么回事,下面把文件上传,请各路高手帮忙指点下。

第一行是UCGUI外部flash显示 第二排是正常的例程汉字显示

第一行是UCGUI外部flash显示   第二排是正常的例程汉字显示

UCGUI 汉字显示(外部FLASH).zip

3.47 MB, 下载次数: 497

最佳答案

查看完整内容[请看2#楼]

自己琢磨问题解决了,原来真的是字库的问题。当使用了UCGUI或者EMWIN进行字体创建的时候由于字体是按照从左到右的顺序创建的点阵字库。但是战舰标准库例程里面的例程汉字库是按照从上到下,从左到右的顺序创建的,所以如果我们使用EMWIN的时候字库请使用正点原子EMWIN扩展例程中给出的文件 ——————————送给遇到同样问 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2014-8-15
在线时间
47 小时
 楼主| 发表于 2017-4-18 23:55:00 | 显示全部楼层
自己琢磨问题解决了,原来真的是字库的问题。当使用了UCGUI或者EMWIN进行字体创建的时候由于字体是按照从左到右的顺序创建的点阵字库。但是战舰标准库例程里面的例程汉字库是按照从上到下,从左到右的顺序创建的,所以如果我们使用EMWIN的时候字库请使用正点原子EMWIN扩展例程中给出的文件                                                                                                 ——————————送给遇到同样问题的朋友
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2017-4-19 08:58:41 | 显示全部楼层
解码和字库生成的扫描方式不同,改改程序就行了
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2014-8-15
在线时间
47 小时
 楼主| 发表于 2017-4-19 09:50:43 | 显示全部楼层
2449164582 发表于 2017-4-19 08:58
解码和字库生成的扫描方式不同,改改程序就行了

我对比了一下fontupd和GUICharPEx中的字库解码函数,这里好像只是得出偏移地址不会影响显示的位置,而且使用Show_Str这个函数显示中文的话是可以正常显示的,说明字库没有问题吧。会不会是下面这段代码的原因呢?[mw_shl_code=c,true]/*********************************************************************
*
*       Public code
*
**********************************************************************
*/
/*********************************************************************
*
* GUIPROP_DispChar
*
* Purpose:
*   This is the routine that displays a character. It is used by all
*   other routines which display characters as a subroutine.
*/
void GUIPROP_X_DispChar(U16P c)
{       
        int BytesPerLine;
    GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
    const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_Context.pAFont->p.pProp;
    //ËÑË÷¶¨Î»×Ö¿aêy¾YDÅÏ¢
    for (; pProp; pProp = pProp->pNext)                                         
    {
        if ((c >= pProp->First) && (c <= pProp->Last)) break;
    }
    if (pProp)
    {
        GUI_DRAWMODE OldDrawMode;
        const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo;
        GUI_GetDataFromMemory(pProp, c);//è&#161;3&#246;×&#214;&#196;£êy&#190;Y
        BytesPerLine = pCharInfo->BytesPerLine;               
        OldDrawMode  = LCD_SetDrawMode(DrawMode);
        LCD_DrawBitmap(GUI_Context.DispPosX, GUI_Context.DispPosY,
                       pCharInfo->XSize, GUI_Context.pAFont->YSize,
                       GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag,
                       1,     /* Bits per Pixel */
                       BytesPerLine,
                       &GUI_FontDataBuf[0],
                       &LCD_BKCOLORINDEX
                       );
        /* Fill empty pixel lines */
        if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize)
        {
            int YMag = GUI_Context.pAFont->YMag;
            int YDist = GUI_Context.pAFont->YDist * YMag;
            int YSize = GUI_Context.pAFont->YSize * YMag;
            if (DrawMode != LCD_DRAWMODE_TRANS)
            {
                LCD_COLOR OldColor = GUI_GetColor();
                GUI_SetColor(GUI_GetBkColor());                               
                LCD_FillRect(GUI_Context.DispPosX, GUI_Context.DispPosY + YSize,
                             GUI_Context.DispPosX + pCharInfo->XSize,
                             GUI_Context.DispPosY + YDist);
                GUI_SetColor(OldColor);
            }
        }
        LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
                GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag;
    }
}[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-4-19 20:49:43 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-8-10
在线时间
12 小时
发表于 2019-9-27 15:45:41 | 显示全部楼层
我也遇到这个问题了,多谢分享
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6422
金钱
6422
注册时间
2018-6-27
在线时间
544 小时
发表于 2021-9-23 16:18:33 | 显示全部楼层
谢谢分享,学习学习。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-5 22:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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