STM32自帶GB2312字型檔顯示漢字

2021-09-11 23:50:48 字數 3195 閱讀 8852

本文介紹如何把字型檔檔案寫入微控制器的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...