将字库及UNIGBK.BIN放到SD卡,从此告别外部Flash芯片

2019-07-21 02:09发布

忙碌了,学习了,经过自己的慢慢尝试终于将UNIGBK.BIN文件移到SD卡了;
而将字库移到SD卡参考的是 “灰太狼”-冰封嗜魔的做法
应原子哥的要求现将字库及UNIGBK.BIN(FATFS源码中cc936.c里面的两个大数组oem2uni,uni2oem转换而成的二进制文件)
放到SD卡的做法贴出来,方便还未学汉字显示或者想把
字库及UNIGBK.BIN 放到SD卡的朋友们参考。
1.
UNIGBK.BIN 放到SD卡:
  首先新建SDFont.cSDFont.h文件
(1).
SDFont.c文件中输入如下代码:
#include "SDFont.h"
/* **************************************** * *说明:该文件定义了一个函数,用来获取存放 *     在SD卡的UNIGBK.BIN文件的相关信息, *     UNIGBK.BIN文件在SD卡的位置为: *     SYSTEM/FONT/UNIGBK.BIN *     (SYSTEM文件夹为SD卡根目录下的文件夹) * *By:ailson jack * *Date:2013.09.19 ***************************************** */ u32 UGBKADDR=0;//UNIGBK.BIN在SD卡的扇区号 u32 UGBKSIZE=0;//UNIGBK.BIN文件的大小 //此函数用来获取存放在SD卡的UNIGBK.BIN文件的相关信息 //注意:此函数必须在SD卡被注册之后调用 void SDFont_Init(void) { FIL *uni_oem; uni_oem=(FIL*)mymalloc(SRAMIN,sizeof(uni_oem)); //UGBKADDR:此地址是UNIGBK.BIN文件在SD卡的扇区号 //要获得该地址可以用winhex软件查看 //不同的SD卡,不同的存储方式,都会导致该地址不同, //但是一旦你将文件存储好后,只要你不去将它删除或者去 //改变它所在文件夹的路径,它的扇区号一般是不会改变的 UGBKADDR=35440;//这个地址是我用winhex软件查看得到的    f_open(uni_oem,"0:SYSTEM/FONT/UNIGBK.BIN",FA_OPEN_EXISTING|FA_READ); UGBKSIZE=uni_oem->fsize; f_close(uni_oem); myfree(SRAMIN,uni_oem); }
(2). SDFont.h文件中输入如下代码:
#ifndef _SDFONT_H
#define _SDFONT_H
/*
****************************************
*
*说明:该文件是SDFont.c的头文件
*
*By:ailson jack
*
*Date:2013.09.19
*****************************************
*/
#include "ff.h"
#include "malloc.h"
extern u32 UGBKADDR;//UNIGBK.BIN在SD卡的扇区号
extern u32 UGBKSIZE;//UNIGBK.BIN文件的大小
void SDFont_Init(void);
#endif
(3).修改mycc936.c 文件的 ff_convert()函数
(mycc936.c FATFS源码中cc936.c去掉两个大数组oem2uni,uni2oem的更名文件 )
ff_convert()函数修改如下:
//此函数是根据原子哥的程序修改的,并且经过自己的不断调试才将 //UNIGBK.BIN文件转移到SD卡里面使用 //Modified By:ailson jack //Date:2013.09.19 WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR src, /* Character code to be converted */ UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ ) { WCHAR t[2]; WCHAR c; u8 buf[512]; u32 i, li, hi; u16 n;   u32 gbk2uni_offset=0; u32 temp1=0; u32 temp2=0;     if (src < 0x80)c = src;//ASCII,直接不用转换. else  {   if(dir) //GBK 2 UNICODE { gbk2uni_offset=UGBKSIZE/2;   }else //UNICODE 2 GBK   {    gbk2uni_offset=0; }     /* Unicode to OEMCP */ hi=UGBKSIZE/2;//对半开. hi =hi / 4 - 1; li = 0; for (n = 16; n; n--) { i = li + (hi - li) / 2; temp1=i*4+gbk2uni_offset; temp2=(int)(temp1>>9);//相对于UGBKADDR偏移的扇区数 temp1=temp1-(temp2<<9);//在目标扇区偏移的位置 SD_ReadBlocks(UGBKADDR+temp2,buf);//读取目标扇区(512B)的数据 t[0]=buf[temp1]+(buf[temp1+1]<<8); t[1]=buf[temp1+2]+(buf[temp1+3]<<8); if (src == t[0]) break; if (src > t[0])li = i;   else hi = i;     } c = n ? t[1] : 0;       } return c; }
将UNIGBK.BIN文件放到SD卡的操作结束;
2. 将字库 放到SD卡:
---此过程参考的是“灰太狼”-冰封嗜魔的做法,自己稍微改动了一点儿,如下:
//code 字符指针开始 //从字库中查找出字模 //code 字符串的开始地址,GBK码 //mat  数据存放地址 size*2 bytes大小   void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size) { FIL *sdfile; UINT br;     unsigned char qh,ql; unsigned char i;   unsigned long foffset; sdfile=(FIL*)mymalloc(SRAMIN,sizeof(FIL));  qh=*code; ql=*(++code); 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==16)//SPI_FlashRead(foffset+ftinfo.f16addr,mat,32); { f_open(sdfile,"0:SYSTEM/FONT/GBK16.fon",FA_OPEN_EXISTING|FA_READ); f_lseek(sdfile,foffset); f_read(sdfile,mat,32,&br); f_close(sdfile); } else //SPI_FlashRead(foffset+ftinfo.f12addr,mat,24);  { f_open(sdfile,"0:SYSTEM/FONT/GBK12.fon",FA_OPEN_EXISTING|FA_READ); f_lseek(sdfile,foffset); f_read(sdfile,mat,24,&br); f_close(sdfile); myfree(SRAMIN,sdfile);
}
Get_HzMat()函数在原子哥写的程序text.c文件里面。
到此我们就完成了将字库及UNIGBK.BIN放到SD卡的工作。
忙碌了一上午来整理及发帖,希望各位帮忙顶顶帖子,不要让帖子及我的辛苦白费,以便让更多有需要的人了解到
外部flash芯片,在不要求速度的情况下,可以暂时不用了

附件:





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。