本文介紹如何把字型檔檔案寫入微控制器的flash中,然後無需再提取字模,即可實現微控制器顯示中文字元的功能。
設定好以後按下快捷鍵f7
成功燒錄以後,**不可以在使用此區域。——一般情況下,你的工程**也不會大到可以覆蓋這個區域。
/**
* @brief 輸出12*12的漢字或6*12的字元,函式可以自動識別是中文字元還是ascii
* @param 第乙個字元的座標,漢字顏色,背景顏色,需要顯示的字串。背景顏色為0表示不畫背景
* @note 漢字字模來自於字型檔,字型檔是編譯好的bin檔案,在_def_font_ch字型檔的基位址中
* @retval none
*/void
lcd_drawfont_gbk12
(u16 x, u16 y, u16 fc, u16 bc,
char
*pstr)
else
if(ch[0]
<
128)
elseif(
(ch[0]
>
160)
&&(ch[1]
>
160)
)//中文
}}
這個函式用於顯示單個字元
/**
* @brief 根據傳入的引數顯示乙個字元,可以自動識別是中文還是英文
* @param 第乙個字元的座標,字元的寬度(中文12英文6),顏色,背景顏色,需要顯示的字串。背景顏色為0表示不畫背景
* @note 漢字字模來自於字型檔,字型檔是編譯好的bin檔案,在_def_font_ch字型檔的基位址中
* 返回值並不是字型檔的位址,字型檔位址是通過指標傳遞的,也就是說,引數fontmodel本身也是返回值
* @retval none
*/static
void
drawfontmodel
(u8 xnow,u8 ynow,u8 width,
const u8 *fontmodel,u16 fc, u16 bc )
else
} bit++
; m >>=1;
//字元迴圈右移
if(bit ==8)
//乙個位元組顯示完畢,則顯示下乙個位元組
else}}
}}
這是根據字元的標號,從flash中找到對應字元陣列的 函式
/**
* @brief 獲取字模陣列的 位址
* @param 第乙個字元的座標,字元的寬度(中文12英文6),顏色,背景顏色,需要顯示的字串。背景顏色為0表示不畫背景
* @note 漢字字模來自於字型檔,字型檔是編譯好的bin檔案,在_def_font_ch字型檔的基位址中
* @retval 字模的寬度
*/static
char
get_model
(const
char
*ch,
const u8 *
*fontmodel)if(
*ch >=
0x20
)//英文
*fontmodel = _def_font_en;
//無法匹配,顯示空白
return0;
}
gb2312的字元計算是怎麼算的?gb2312的編號可以幫助我們找到字元,簡單來說,就是gb2312規定對收錄的每個字元採用兩個位元組表示,第乙個位元組為「高位元組」,對應94個區;第二個位元組為「低位元組」,對應94個位。所以它的區位碼範圍是:0101-9494。區號和位號分別加上0xa0就是gb2312編碼。例如最後乙個碼位是9494,區號和位號分別轉換成十六進製制是5e5e,0x5e+0xa0=0xfe,所以該碼位的gb2312編碼是fefe。
這也就是為什麼我們的**中要乘以94了。
關於gb2312的詳細資料可以參考這篇部落格
在主函式中我呼叫了顯示函式:
st7735s_cpt144_initial()
;lcd_bg_color
(green)
;lcd_drawfont_gbk12(0
,0,black,green,
"來自geekyatao的部落格");
lcd_drawfont_gbk12(0
,12,black,green,
"abcabc123,.?《》");
lcd_drawfont_gbk12(0
,24,black,green,
"犇鱻羴顯示不出來"
);
另外我還定義了漢字字元的基位址,與英文本元的陣列
extern
const u8 _fontliben612;
#define _def_font_ch (const u8*)(0x080dc000)
//字型檔的基位址
#define _def_font_en _fontliben612
extern
const u8 _fontliben612=
0x42
,0x89
,0x1
,0x0
,0x0
,0x0
,0x0
,0x0
,0x0
,// 0x7e ~
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0,
0x0// 0x20
};
gb2312包含的字元也不是特別多,還有一些生僻字,如犇鱻羴,顯示不出來,這個亂碼為啥還沒時間考慮。以後有興趣了,可以搞個gbk的編碼。想顯示一些常用中文字元就不用費勁取字模了。
GB2312字符集顯示
最近需要做一下12 12點陣的gbk字符集,但是網上只找到了gb2312的字符集一大堆說法,陷身於網上的大海洋中,看了一下資料,有點明白漢字在螢幕上如何顯示了 比如顯示 漢字 兩個字,因為漢字是兩個位元組顯示的,比如ab兩個位元組,第乙個位元組是高位元組,第二個位元組是低位元組,在gb2312中,字...
安裝GB2312字符集
linux下安裝gb2312的示例 step 1 到linux字符集的安裝包目錄下 cd usr share i18n charmaps step 2 解壓該目錄下的gb2312.gz gunzip gb2312.gz step 3 安裝字符集 localedef f gb2312 i zh cn ...
c 實現GB2312和UTF8字元編碼方式的轉換
c 實現gb2312和utf8字元編碼方式的轉換 public string utf8togb2312 string str catch exception ex unsupportedencodingexception ex public string gb2312toutf8 string st...