OpenEdv-开源电子网

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

探索者+7寸电容屏移植emwin外部字库问题

[复制链接]

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
发表于 2014-11-18 12:54:12 | 显示全部楼层 |阅读模式
5金钱

根据“钢铁侠EMWIN5.22移植”改了以后,字体显示乱码,本人对EMWIN不是太了解。求高手。。。。。



代码如下:
static void GUI_GetDataFromMemory(const GUI_FONT_PROP GUI_UNI_PTR *pProp, U16P c)
{
   unsigned char qh,ql;
   unsigned char num;
   unsigned char i;      
    unsigned long foffset;
   unsigned char t;
   unsigned char *mat;
    unsigned char size;//字体大小
    U16 BytesPerFont;
    U32 oft;
    char *font = (char *)pProp->paCharInfo->pData;
    BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; //每个字模的数据字节数
    if (BytesPerFont > BYTES_PER_FONT){BytesPerFont = BYTES_PER_FONT;}
  if((GUI_pContext->pAFont == &GUI_FontHZ12)) size=12;
  else if((GUI_pContext->pAFont == &GUI_FontHZ16)) size =16;
  else if((GUI_pContext->pAFont == &GUI_FontHZ24)) size =24;
  
//if(BytesPerFont== &GUI_FontHZ16) //GUI_SetFont
  {
   if (c < 0x80)                                                                       //英文字符地址偏移算法
   {
   //num=(unsigned char)c-' ';//得到偏移后的值
         for(t=0;t<size;t++)
        {
      // oft = base + (c - 0x20) * BytesPerFont; //计算出字码在flash中的偏移地址 
      //if(size==12)temp=asc2_1206[num][t];  //调用1206字体
      // GUI_FontDataBuf[t] = acFont8x16[c-0x20][t]; //直接取出字模
      GUI_FontDataBuf[t]=asc_for_emwin1608[c-0x20][t];   //调用1608字体
     }
   }else                                                                         
   {
   
     ql=c/256;
         qh=c%256;
     if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非 常用汉字
     {        
      for(i=0;i<(size*2);i++)*mat++=0x00;//填充满格
      return; //结束访问
     }         
     if(ql<0x7f)ql-=0x40;//注意!
     else ql-=0x41;
     qh-=0x81;  
     foffset=((unsigned long)190*qh+ql)*(size*2);//得到字库中的字节偏移量   
     if(size==24)
     {
      W25QXX_Read(GUI_FontDataBuf,foffset+ftinfo.f24addr,size*2);
     }else if(size==16)
     {
      W25QXX_Read(GUI_FontDataBuf,foffset+ftinfo.f16addr,size*2);
     }else
     {
      W25QXX_Read(GUI_FontDataBuf,foffset+ftinfo.f12addr,size*2);
     }
   }  
 }  
}
怎么改?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-19 00:29:13 | 显示全部楼层
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2014-11-19 08:59:27 | 显示全部楼层
好像是XY翻转了,钢铁侠那个中文显示有点小问题,我参考原子的代码简单修改了下
[mw_shl_code=c,true]void LCD_Show_Font(u16 x,u16 y,u8 size) { u8 mode; u8 temp,t,t1; u16 y0=y; // u8 dzk[32]; u32 tempcolor,tempbkcolor; u8 PrePenSize;//保存画笔尺寸 PrePenSize = GUI_GetPenSize(); GUI_SetPenSize(1); // if(size!=12&&size!=16)return;//不支持的size // Get_HzMat(font,dzk,size);//得到相应大小的点阵数据 tempcolor=GUI_GetColor(); tempbkcolor=GUI_GetBkColor(); mode = GUI_GetTextMode(); if(mode==GUI_TM_NORMAL)//正常显示,文字前景色,背景色填充 { for(t=0;t<size*2;t++) { temp=GUI_FontDataBuf[t];//得到12数据 for(t1=0;t1<8;t1++) { if(temp&0x80)GUI_DrawPoint(x,y); else { GUI_SetColor(tempbkcolor); GUI_DrawPoint(x,y); GUI_SetColor(tempcolor);//还原 } temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } } else if(mode==GUI_TM_REV)//反转显示,文字背景色,前景色填充 { for(t=0;t<size*2;t++) { temp=GUI_FontDataBuf[t];//得到12数据 for(t1=0;t1<8;t1++) { if(temp&0x80) { GUI_SetColor(tempbkcolor); GUI_DrawPixel(x,y); } else { GUI_SetColor(tempcolor); GUI_DrawPixel(x,y); } temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } } else if(mode==GUI_TM_TRANS)//叠加显示,透明显示 { for(t=0;t<size*2;t++) { temp=GUI_FontDataBuf[t];//得到12数据 for(t1=0;t1<8;t1++) { if(temp&0x80)GUI_DrawPoint(x,y); temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } } else if(mode==GUI_TM_XOR)//反色显示,透明显示 { GUI_SetDrawMode(GUI_DRAWMODE_XOR); for(t=0;t<size*2;t++) { temp=GUI_FontDataBuf[t];//得到12数据 for(t1=0;t1<8;t1++) { if(temp&0x80)GUI_DrawPoint(x,y); temp<<=1; y++; if((y-y0)==size) { y=y0; x++; break; } } } } GUI_SetPenSize(PrePenSize); GUI_SetColor(tempcolor); GUI_SetBkColor(tempbkcolor); }[/mw_shl_code]
这样中文也支持EMWIN的字体显示效果
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2014-11-19 09:01:17 | 显示全部楼层
另外我发现还是有部分汉字显示不出来,但是把汉字编码作为入口参数能显示
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2014-11-20 00:12:31 | 显示全部楼层
void GUIPROP_X_DispChar(U16P c)中的 
oft = base + (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont; //中文字符地址偏移算法包括符号
这一句算出的结果和void Get_MzMat(unsigned char *code,unsigned char *mat,u8 size)仿真出来的结果不一样啊。base 是字体存储地址,仿真是正确的,和Get_MzMat得出的一样。就是偏移量怎么也不对。换成
oft = base +(((c>>8) - 0x81) * 0xbe + ((c&0xff) - 0x41 )) * BytesPerFont;也不行,汉字查出内码后,用计算器计算得到的偏移量是对的,可是这句就是不行,难道是(((c>>8) - 0x81) * 0xbe + ((c&0xff) - 0x41 )) 中的“C”不对?头大!!!!!!!

void GUIPROP_X_DispChar(U16P c) 
{
    int BytesPerLine;
    GUI_DRAWMODE DrawMode = GUI_pContext->TextMode;
    const GUI_FONT_PROP GUI_UNI_PTR *pProp = GUI_pContext->pAFont->p.pProp; 

    //搜索定位字库数据信息 
    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;
        
        if (c < 0x80)
        {
            U8 BytesPerFont;

            pCharInfo = pProp->paCharInfo + (c - pProp->First);           
            BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; 
            if (BytesPerFont > BYTES_PER_FONT)
            {
                BytesPerFont = BYTES_PER_FONT;
            }
            memcpy(GUI_FontDataBuf, pCharInfo->pData, BytesPerFont);
        }
        else
        {
            u32 oft;
            u8 BytesPerFont;
            u32 base;
base = (U32)pProp->paCharInfo->pData;
            
            BytesPerFont = GUI_pContext->pAFont->YSize * pProp->paCharInfo->BytesPerLine; 
            if (BytesPerFont > BYTES_PER_FONT)
            {
                BytesPerFont = BYTES_PER_FONT;
            }
            
//             oft = base + (((c>>8) - 0xa1) * 94 + ((c&0xff) - 0xa1)) * BytesPerFont; //中文字符地址偏移算法包括符号
oft = base +(((c>>8) - 0x81) * 0xbe + ((c&0xff) - 0x41 )) * BytesPerFont;
W25QXX_Read(GUI_FontDataBuf, oft, BytesPerFont);//取出字模数据   
        }。。。。。。。。。
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2014-11-20 00:14:51 | 显示全部楼层
有人在探索者上调试成功的吗?求共享啊!!!!!!!!!!
回复

使用道具 举报

15

主题

98

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2013-11-11
在线时间
0 小时
发表于 2014-11-20 21:59:39 | 显示全部楼层
我在探索者(4.3)电容屏移植成功了外部字库,用过钢铁侠的方法,没成功。现在用的方法比较好,有时间给大家共享
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2014-11-20 23:26:56 | 显示全部楼层
跪求啊!!!!!!!!!!
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2014-12-3 17:41:05 | 显示全部楼层
回复【7楼】蘑菇:
---------------------------------
层主如果有好方法共享啊
学无止境
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2014-12-3 17:41:45 | 显示全部楼层
字体翻转是因为取模方式不一样

钢铁侠有在帖子里说明
学无止境
回复

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2015-3-18
在线时间
0 小时
发表于 2015-5-25 19:19:34 | 显示全部楼层
问一下LZ,你的字体转换生成C文件, 是用的什么软件
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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