OpenEdv-开源电子网

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

手动制作字库问题求解

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
发表于 2018-4-11 18:14:25 | 显示全部楼层 |阅读模式
5金钱
      精英版写的一个有关LCD显示汉字的程序,本身已有的汉字字库大小为 8*8,16*16,24*24,但是并不能满足需求,所以就自己手动做32*32(黑体)的字库,但是在使用过程中LCD只显示了一个字,之后就卡死了(只显示了“精”字,字体大小是对的)
如下:
      
我的设置:
1、做好字库

2、修改update_font()
        //先查找文件是否正常
        strcpy((char*)pname,(char*)src);        //copy src内容到pname
        strcat((char*)pname,(char*)UNIGBK_PATH);
        res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
        if(res)rval|=1<<3;//打开文件失败  
//        strcpy((char*)pname,(char*)src);        //copy src内容到pname
//        strcat((char*)pname,(char*)GBK12_PATH);
//         res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
//         if(res)rval|=1<<4;//打开文件失败  
//        strcpy((char*)pname,(char*)src);        //copy src内容到pname
//        strcat((char*)pname,(char*)GBK16_PATH);
//         res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
//         if(res)rval|=1<<5;//打开文件失败  
//        strcpy((char*)pname,(char*)src);        //copy src内容到pname
//        strcat((char*)pname,(char*)GBK24_PATH);
//         res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
//         if(res)rval|=1<<6;//打开文件失败
        strcpy((char*)pname,(char*)src);        //copy src内容到pname
        strcat((char*)pname,(char*)GBK32_PATH);
        res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
        if(res)rval|=1<<7;//打开文件失败         

注:考虑到32*32的字库过大,W25Q128容量不够,已将其他字库删除
       。。。
                       LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");               
                strcpy((char*)pname,(char*)src);                                //copy src内容到pname
                strcat((char*)pname,(char*)UNIGBK_PATH);
                res=updata_fontx(x+20*size/2,y,size,pname,0);        //更新UNIGBK.BIN
                if(res){myfree(SRAMIN,pname);return 1;}
//                LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN  ");
//                strcpy((char*)pname,(char*)src);                                //copy src内容到pname
//                strcat((char*)pname,(char*)GBK12_PATH);
//                res=updata_fontx(x+20*size/2,y,size,pname,1);        //更新GBK12.FON
//                if(res){myfree(SRAMIN,pname);return 2;}
//                LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN  ");
//                strcpy((char*)pname,(char*)src);                                //copy src内容到pname
//                strcat((char*)pname,(char*)GBK16_PATH);
//                res=updata_fontx(x+20*size/2,y,size,pname,2);        //更新GBK16.FON
//                if(res){myfree(SRAMIN,pname);return 3;}
//                LCD_ShowString(x,y,240,320,size,"Updating GBK24.BIN  ");
//                strcpy((char*)pname,(char*)src);                                //copy src内容到pname
//                strcat((char*)pname,(char*)GBK24_PATH);
//                res=updata_fontx(x+20*size/2,y,size,pname,3);        //更新GBK24.FON
//                if(res){myfree(SRAMIN,pname);return 4;}
                LCD_ShowString(x,y,240,320,size,"Updating GBK32.BIN  ");
                strcpy((char*)pname,(char*)src);                                //copy src内容到pname
                strcat((char*)pname,(char*)GBK32_PATH);
                res=updata_fontx(x+20*size/2,y,size,pname,4);        //更新GBK32.FON
                if(res){myfree(SRAMIN,pname);return 5;}
3、修改updata_fontx()
switch(fx)
{
。。。。。。。。
          case 3:
                ftinfo.f24addr=ftinfo.f16addr+ftinfo.gbk16size;        //GBK16之后,紧跟GBK24字库
                ftinfo.gbk24size=fftemp->fsize;                                        //GBK24字库大小
                flashaddr=ftinfo.f24addr;                                                //GBK24的起始地址
                break;
        case 4:
        //        ftinfo.f32addr=ftinfo.f24addr+ftinfo.gbk24size;        //GBK24之后,紧跟GBK32字库
                ftinfo.f32addr=ftinfo.ugbkaddr+ftinfo.ugbksize;        //UNIGBK之后,紧跟GBK32字库
                ftinfo.gbk32size=fftemp->fsize;                                        //GBK24字库大小
                flashaddr=ftinfo.f32addr;                                                //GBK24的起始地址
                break;
}
注:增加了case4:GBK32,修改了一下GBK32的地址,前面的几个字库不会执行到(见Show_Font函数)
4、修改Show_Font(..) 以及  Get_HzMat(..)
Show_Font:if(/*size!=12&&size!=16&&size!=24&&*/size!=32)return;        //不支持的size
注:只有size==32的时候才会执行显示,否则执行return跳出函数
Get_HzMat:
switch(size)
{
        case 12:
                W25QXX_Read(mat,foffset+ftinfo.f12addr,csize);
                break;
        case 16:
                W25QXX_Read(mat,foffset+ftinfo.f16addr,csize);
                break;
        case 24:
                W25QXX_Read(mat,foffset+ftinfo.f24addr,csize);
                break;
        case 32:
                W25QXX_Read(mat,foffset+ftinfo.f32addr,csize);
                break;
}  

注:加入case 32:GBK32的部分
请大牛帮忙看下,谢谢

QQ截图20180411175842.png
QQ截图20180411175122.png

最佳答案

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

。按理说应该不会死在lcd的初始化啊,你不是显示出来一个字了吗。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-4-11 18:14:26 | 显示全部楼层
刺猬ZDYZ 发表于 2018-4-12 11:17
嗯,仿真之后,发现停在HardFault_Handler上了,查询网上的方法,可能是堆栈溢出,捕捉了几个地方,但是 ...

。按理说应该不会死在lcd的初始化啊,你不是显示出来一个字了吗。
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-4-11 18:20:56 | 显示全部楼层
只显示一个字的话应该字库没问题,可能问题出在显示上,你看下你的中文显示函数吧,是不是指针没有自加2,。
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-4-11 18:21:11 | 显示全部楼层
指针没有指向下一个中文字
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 08:51:13 | 显示全部楼层
周易八索连山 发表于 2018-4-11 18:20
只显示一个字的话应该字库没问题,可能问题出在显示上,你看下你的中文显示函数吧,是不是指针没有自加2,。

else//中文
        {     
            bHz=0;//有汉字库   
            if(x>(x0+width-size))//换行
                        {            
                                y+=size;
                                x=x0;                  
                        }
                if(y>(y0+height-size))break;//越界返回                                                       
                Show_Font(x,y,str,size,mode); //显示这个汉字,空心显示
                str+=2;
                x+=size;//下一个汉字偏移            
        }       
GBK8 GBK16 GBK24 的中文显示都是正常的,这一块我并没有修改
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 08:52:42 | 显示全部楼层
补充一下,这是我main()函数的显示:
Show_Str(30,50,200,32,"精英STM32F103开发板",32,0);
实际只显示了“精”字
回复

使用道具 举报

7

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2017-7-18
在线时间
257 小时
发表于 2018-4-12 10:04:45 | 显示全部楼层
刺猬ZDYZ 发表于 2018-4-12 08:51
else//中文
        {     
            bHz=0;//有汉字库   

有仿真器的话就硬件仿真一下,一步步运行看哪里出问题了。
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 11:17:08 | 显示全部楼层
本帖最后由 刺猬ZDYZ 于 2018-4-12 11:18 编辑
周易八索连山 发表于 2018-4-12 10:04
有仿真器的话就硬件仿真一下,一步步运行看哪里出问题了。

嗯,仿真之后,发现停在HardFault_Handler上了,查询网上的方法,可能是堆栈溢出,捕捉了几个地方,但是没能分析出具体问题 QQ截图20180412111550.png
异常之前应该是停在这个位置的,帮忙再看看,谢谢
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 11:19:21 | 显示全部楼层
本帖最后由 刺猬ZDYZ 于 2018-4-12 11:21 编辑
刺猬ZDYZ 发表于 2018-4-12 11:17
嗯,仿真之后,发现停在HardFault_Handler上了,查询网上的方法,可能是堆栈溢出,捕捉了几个地方,但是 ...

void LCD_WR_REG(u16 regval)
{   
        LCD->LCD_REG=regval;//写入要写的寄存器序号         
}
函数体是这样的运行停住的地方:
QQ截图20180412112024.png
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 12:40:08 | 显示全部楼层
周易八索连山 发表于 2018-4-12 11:54
。按理说应该不会死在lcd的初始化啊,你不是显示出来一个字了吗。

我也修改了其他字符串显示,都是一个字显示完之后就异常了,搞不懂为啥
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
 楼主| 发表于 2018-4-12 16:15:21 | 显示全部楼层
本帖最后由 刺猬ZDYZ 于 2018-4-12 16:22 编辑
周易八索连山 发表于 2018-4-12 10:04
有仿真器的话就硬件仿真一下,一步步运行看哪里出问题了。

已经解决了,发现是一个数组越界了 QQ截图20180412161245.png
原例程是dzk[72],这样的话最大只能支持到size=24
此处做一个简单的封装:
QQ截图20180412162136.png
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2018-9-30
在线时间
39 小时
发表于 2019-9-27 10:47:17 | 显示全部楼层
牛逼 兄弟
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 23:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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