忙碌了,学习了,经过自己的慢慢尝试终于将UNIGBK.BIN文件移到SD卡了;
而将字库移到SD卡参考的是
“灰太狼”-冰封嗜魔的做法
应原子哥的要求现将字库及UNIGBK.BIN(FATFS源码中cc936.c里面的两个大数组oem2uni,uni2oem转换而成的二进制文件)
放到SD卡的做法贴出来,方便还未学汉字显示或者想把
字库及UNIGBK.BIN
放到SD卡的朋友们参考。
1.
将
UNIGBK.BIN
放到SD卡:
首先新建SDFont.c及SDFont.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芯片,在不要求速度的情况下,可以暂时不用了
附件:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
我最近也在调这个程序,请问你是怎么解决这个问题的?
---------------------------------
我这个帖子就是要告诉不会的坛友们该
怎么做啊,你参照着我写的改就行了
---------------------------------
但是 SD_ReadBlocks(UGBKADDR+temp2,buf)我没有找到啊
---------------------------------
这个函数是我学SD卡的时候自己写的,可以参考下一楼的代码
一周热门 更多>