之前一直使用的512KB ROM的STM32,但是最近使用的只有128KB,想用FATFS顯示支援長檔名,發現添加CC936.C後ROM肯定不夠的,就決定將這個雙向碼錶儲存到外部儲存空間中,flash或者SD卡都行,只有能讀就行;
更改後的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 */
)
{
WCHAR c;
if (src < 0x80) {
/* ASCII */
c = src;
}
else
{
if (dir)
{ /* OEMCP to unicode */
c = GBKtoUNICODE(src);
}
else
{ /* Unicode to OEMCP */
; c = UNICODEtoGBK(src);
}
}
return c;
}
刪掉那兩個碼錶後,代碼瞬間減小了幾百KB了.
//我使用的是W25X16
//儲存位置說明
//0x00 ~ 0xbc00
存放
UtoG.sys 42kb
//0xc000 ~
0x17c00
存放 GtoU.sys
47kb
//0x18000 ~
0xd3800 存放
12x12.ttf 750kb
//0xd3c00 ~
0x18f400 存放
16x16.ttf 750kb
//各檔案基址
#define CODE_UtoG_BASE (0x00)
//unicode轉GBK碼錶
#define CODE_GtoU_BASE (0xC000)
//GBK轉unicode碼錶
#define FONT_12X12_BASE (0x18000)
//12x12GBK字型檔
#define FONT_16X16_BASE (0xd3c00)
//16x16GBK字型檔
下面看這兩個函數的實現方式
/*************************************************************************************************************************
* 函數 :
u16 GBKtoUNICODE(u16 GBKCode)
* 功能 :
將GBK編碼轉換為unicode編碼
* 參數 :
GBK
* 返回 :
unicode
* 依賴 :
底層讀寫函數
* 作者 :
陳鵬
* 時間 :
20120602
* 最後修改時間 : 20120602
* 說明 : 需要flash中的碼錶支援
GBK碼範圍,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 GBKtoUNICODE(u16 GBKCode)
{
u16 unicode;
u8 buff[2];
u16 *p;
u8 ch,cl;
ch = GBKCode >> 8;
cl = GBKCode & 0x00ff;
//計算位移
if(cl < 0x7f)
unicode = (ch-0x81)*190+cl-0x40;
if(cl > 0x80)
unicode = (ch-0x81)*190+cl-0x41;
unicode *= 2;
W25X16_Read(buff,CODE_GtoU_BASE + unicode,2) ; //讀取碼錶
p = (u16 *)buff;
return *p;
}
/*************************************************************************************************************************
* 函數 :
u16 UNICODEtoGBK(u16 unicode)
* 功能 :
將unicode編碼轉換為GBK編碼
* 參數 :
unicode
* 返回 :
GBK
* 依賴 :
底層讀寫函數
* 作者 :
陳鵬
* 時間 :
20120602
* 最後修改時間 : 20120602
* 說明 : 需要flash中的碼錶支援
GBK碼範圍,高8位:0x81~0xfe;低8位:0x40~0xfe
*************************************************************************************************************************/
u16 UNICODEtoGBK(u16 unicode) //用二分尋找演算法
{
u32 offset;
u8 temp[2];
u16 res;
if(unicode<=0X9FA5)offset=unicode-0X4E00;
else if(unicode>0X9FA5)//是標點符號
{
if(unicode<0XFF01||unicode>0XFF61)return 0;//沒有對應編碼
offset=unicode-0XFF01+0X9FA6-0X4E00;
}
W25X16_Read(temp,offset*2+CODE_UtoG_BASE,2);//得到GBK碼
res=temp[0];
res<<=8;
res+=temp[1];
return res ; //返回找到的編碼
}
只要根據自己使用的儲存空間更改W25X16_Read()這個底層IO介面就行了.