精英版写的一个有关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的部分
请大牛帮忙看下,谢谢
|