没那么复杂吧。我是这么做的,可以用:把 cc936.c 的两个数组搞出来,转成了两个文件,把这两个文件通过sd卡存入spi flash,记录好这两个文件在spi flash中的首地址。
然后修改 cc936.c 里面的一个函数
灰色的是注释掉的源码,黄色的是添加进去的,修改的代码我也不管他的原理是神马,照着葫芦画瓢就是。
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 */
)
{
// const WCHAR *p;
WCHAR c;
int i, n, li, hi;
uint8_t t[4];
WCHAR p[2];
uint32_t addr;
if (src < 0x80)
{ /* ASCII */
c = src;
}
else
{
if (dir)
{ /* OEMCP to unicode */
// p = oem2uni;
// hi = sizeof(oem2uni) / 4 - 1;
addr = SYSTEM_OEM2UNI_ADDRESS; 源码中p指针记录的是oem2uni数组首地址,这里用个变量记录spi flash存放数组的首地址,“模拟”原作者的意思吧
hi = 87172/4 - 1; 这个87172把数组转成二进制文件后在电脑里查看属性可以知道是87172字节,如果不是这个值,那么你就转错了
}
else
{ /* Unicode to OEMCP */
// p = uni2oem;
// hi = sizeof(uni2oem) / 4 - 1;
addr = SYSTEM_UNI2OEM_ADDRESS;
hi = 87172/4 - 1;
}
li = 0;
for (n = 16; n; n--)
{
i = li + (hi - li) / 2;
w25x_read_buffer(t, addr + i*2*2, 4); /* i*2*2: original 'uni2oem[]' arrary is unsigned short type,
* but w25x per unit is unsigned char.
*/ 读取数据,spi flash读出的单位是unsigned char,uni2oem数组的元素是unsigned short的,所以每次得读 i * 2个拼凑成一个unsigned short,下面的代码有个p[i * 2 + 1],所以每次就得读 i *2*2了,也就是4字节。
p[0] = (t[1] << 8) | t[0]; 把读出的四个字节拼凑成unsigned short,至于这里为什么是 (t[1] << 8) | t[0],因为原子哥那软件对于unsigned short会把高字节放在后面,低字节放在前面。这里要注意下,搞反了直接挂,我第一次搞就挂在这里了。。。
p[1] = (t[3] << 8) | t[2];拼凑好后直接传给后面的代码了,不用管了
// if (src == p[i * 2]) break;
// if (src > p[i * 2])
// li = i;
// else
// hi = i;
if(src == p[0])break;
if(src > p[0])
li = i;
else
hi = i;
}
// c = n ? p[i * 2 + 1] : 0;
c = n ? p[1] : 0;
}
return c;
}
我这么搞了可以用,你觉得有用就试试吧。
|