国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于STM32平臺(tái)實(shí)現(xiàn)UCGUI外掛中文字庫(kù)

2014-11-27 08:15馬志剛
關(guān)鍵詞:字庫(kù)鏈表控件

馬志剛

(深圳職業(yè)技術(shù)學(xué)院 計(jì)算機(jī)工程學(xué)院,廣東 深圳 518055)

UCGUI是一種輕量級(jí)的嵌入式圖形支持系統(tǒng),它的設(shè)計(jì)架構(gòu)是模塊化的,由不同的模塊中的不同層組成.UCGUI可以在任何的CPU上運(yùn)行,因?yàn)樗?00%的標(biāo)準(zhǔn)C代碼編寫(xiě)的.UCGUI提供一個(gè)可擴(kuò)展的2D圖形庫(kù)及占用極少RAM的窗口管理體系,非常適合如 STM32這樣的輕量級(jí)嵌入式平臺(tái)的圖形界面顯示[1],大量應(yīng)用于各種智能儀器儀表的液晶屏人機(jī)界面.UCGUI原生的字符顯示機(jī)制需要程序員事先把程序中用到的字符點(diǎn)陣信息轉(zhuǎn)化為C語(yǔ)言數(shù)組并組成一個(gè)鏈表結(jié)構(gòu)作為字庫(kù),然后將該字庫(kù)與整個(gè)工程一起進(jìn)行編譯鏈接,最終字庫(kù)是包含在目標(biāo)文件中.此機(jī)制對(duì)于英文這樣基于字母的文字非常方便,生成內(nèi)建的字庫(kù)很方便,也不會(huì)大量增加目標(biāo)文件的體積.然而對(duì)于漢字這樣包含龐大字符數(shù)量的文字[2],采用此方法就存在很大的缺陷.因?yàn)樵诮^大部分應(yīng)用場(chǎng)合都是無(wú)法事先預(yù)知有哪些漢字需要顯示,而如果把所有常用漢字按照 UCGUI的規(guī)則轉(zhuǎn)化為C語(yǔ)言鏈表結(jié)構(gòu),則工作量巨大且大大增加目標(biāo)文件體積,如果應(yīng)用于 STM32這樣程序存儲(chǔ)空間并不寬裕的平臺(tái),很可能因?yàn)榭臻g不足而無(wú)法實(shí)現(xiàn)程序的燒寫(xiě).所以對(duì)于大量文字的隨機(jī)顯示,更好的方案是將字庫(kù)與程序代碼分開(kāi).但是UCGUI本身并沒(méi)有提供從外部存儲(chǔ)器讀取字庫(kù)的接口,如果程序員自行編寫(xiě)代碼從外部字庫(kù)讀取字符信息并使用UCGUI提供的上層繪圖接口直接在LCD上繪制漢字點(diǎn)陣的話,則顯示的漢字不能與 UCGUI的圖層機(jī)制兼容,無(wú)法配合UCGUI中的其他圖形控件使用,例如無(wú)法在按鈕上添加漢字.本文介紹一種通過(guò)修改UCGUI底層字符驅(qū)動(dòng)函數(shù)的方法,為UCGUI實(shí)現(xiàn)將字庫(kù)獨(dú)立于目標(biāo)文件存儲(chǔ),并且充分兼容UCGUI圖形庫(kù)中的各種控件.

1 外部Flash

為了能夠存儲(chǔ)漢字庫(kù)中的大量數(shù)據(jù),本文在STM32處理器上外接Flash存儲(chǔ)芯片來(lái)擴(kuò)大存儲(chǔ)空間.例如可采用 SPI接口的 Nand Flash 芯片M25PX16來(lái)擴(kuò)展存儲(chǔ)空間,該芯片具有16Mbit容量,具備4K字節(jié)子區(qū)擦除功能,最高支持75Mhz的SPI接口等特性,將其與主控芯片STM32進(jìn)行連接如圖1所示.

圖1 外部Flash硬件連接圖

STM32處理器的IO管腳大部分都具有復(fù)用功能,為了對(duì) M25PX16進(jìn)行訪問(wèn),其 IO管腳PB13~PB15將分別配置為復(fù)用功能SPI2_SCK,SPI2_MISO和SPI2_MISI,即作為STM32的SPI2接口.然后對(duì)STM32的SPI2口進(jìn)行配置,這里的配置主要是將SPI2設(shè)為全雙工主模式,數(shù)據(jù)位設(shè)為8位,另外還有時(shí)序模式,波特率因子,數(shù)據(jù)幀格式以及CRC多項(xiàng)式的相關(guān)配置,最后使能SPI2.

經(jīng)過(guò)軟硬件的相關(guān)工作,現(xiàn)在外部Flash已經(jīng)可以正常使用了,下一步工作是定義Flash的相關(guān)操作函數(shù),如擦除,寫(xiě)入,讀取等.然后利用串口或是USB接口等外部接口將漢字庫(kù)下載到STM32并燒寫(xiě)到外部Flash中.本文使用的是16x16點(diǎn)陣的GBK碼漢字庫(kù),大小為256 kB左右.

2 修改字符顯示驅(qū)動(dòng)

使用 UCGUI提供的自定義字體轉(zhuǎn)換工具可以將指定的字符點(diǎn)陣信息轉(zhuǎn)化到一個(gè)由C語(yǔ)言實(shí)現(xiàn)的鏈表中并封裝到一個(gè)結(jié)構(gòu)體里,以編譯到目標(biāo)文件中供 UCGUI顯示時(shí)使用.為了最大限度地利用 UCGUI本身的這一顯示機(jī)制,提高外掛字庫(kù)的兼容性,本文先使用 UCGUI提供的的字體庫(kù)轉(zhuǎn)換工具針對(duì)16x16點(diǎn)陣字體生成一個(gè)含有數(shù)字0~9,英文字符a-z以及A-Z的鏈表式字體庫(kù),并將其封裝到結(jié)構(gòu)體 GUI_FontHZ_SimSun_16中,該結(jié)構(gòu)體的第一個(gè)元素GUI_FONTTYPE_PROP_SJIS是在頭文件GUIType.h中定義的用于設(shè)定字體屬性的宏,此宏定義指明了該字體使用的字符顯示驅(qū)動(dòng)函數(shù)為GUIPROP_DispChar.我們要做的事情就是要修改這個(gè)顯示驅(qū)動(dòng)函數(shù).首先,修改 GUI_FONTTYPE_PROP_SJIS的定義,將字符顯示驅(qū)動(dòng)函數(shù)改為指向我們自定義的函數(shù)My_GUIPROP_DispChar,這樣,只需要在我們自定義的字符顯示驅(qū)動(dòng)函數(shù)My_GUIPROP_DispChar中實(shí)現(xiàn)讀取外部 Flash中的漢字庫(kù)來(lái)顯示即可,此函數(shù)的源代碼如下:

在上面的函數(shù)中,首先通過(guò)字符的機(jī)內(nèi)碼c判斷要顯示的字符是否為漢字,如果不是漢字,則直接使用 UCGUI原來(lái)的顯示驅(qū)動(dòng)GUIPROP_DispChar從鏈表字庫(kù)中讀取字符來(lái)顯示;如果是漢字,則調(diào)用我們自己定義的從外部Flash讀取字符的顯示驅(qū)動(dòng)函數(shù)WriteHZ,該函數(shù)從漢字庫(kù)中讀取字符的點(diǎn)陣信息供 UCGUI顯示,其主要代碼如下:

即先根據(jù)漢字內(nèi)碼p算出區(qū)位碼c1和c2,再根據(jù)區(qū)位碼計(jì)算出要顯示的漢字在漢字庫(kù)中的偏移量AddrInTable,然后調(diào)用Flash_Read函數(shù)從外部Flash中讀取漢字的點(diǎn)陣信息來(lái)進(jìn)行顯示.其中FontLibStartPage是漢字庫(kù)燒寫(xiě)入 Flash時(shí)的起始頁(yè)地址(本文使用的 Flash芯片每頁(yè)為 256字節(jié)),數(shù)組 pixeldata 是字符點(diǎn)陣信息的顯示緩沖區(qū).

經(jīng)過(guò)上面的改動(dòng),在需要顯示漢字的場(chǎng)合,只需要調(diào)用設(shè)置字體的函數(shù)將字體設(shè)置為我們最開(kāi)始定義的字體 GUI_FontHZ_SimSun_16 即可.例如要在按鈕Button0上顯示漢字,可調(diào)用如下函數(shù):

BUTTON_SetFont( Button0 , &GUI_FontHZ_SimSun_16);

通過(guò)對(duì)UCGUI原有的字符顯示機(jī)制進(jìn)行改造,在充分兼容其控件系統(tǒng)的前提下,實(shí)現(xiàn)了將漢字庫(kù)獨(dú)立于目標(biāo)代碼文件存儲(chǔ)在外部 Flash中,適合需要顯示大量不確定性漢字的場(chǎng)合,彌補(bǔ)了UCGUI在漢字顯示方面的先天缺陷,使得這一優(yōu)秀的圖形系統(tǒng)有了更大的用武之地.

[1] 王蘭英.基于STM32嵌入式系統(tǒng)的uCGUI移植與實(shí)現(xiàn)[J].四川理工學(xué)院學(xué)報(bào)(自然科學(xué)版),2012,25(1):56-58.

[2] 國(guó)家標(biāo)準(zhǔn)總局.GB2312-80信息交換用漢字編碼字符集基本集[S].1981.

猜你喜歡
字庫(kù)鏈表控件
No.2 喜茶聯(lián)合漢儀字庫(kù)推出微型書(shū)和書(shū)簽
基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
跟麥咭學(xué)編程
關(guān)于.net控件數(shù)組的探討
基于鏈表多分支路徑樹(shù)的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
論計(jì)算機(jī)字庫(kù)單字的著作權(quán)保護(hù)
——以方正訴寶潔案為例
老家的惜字庫(kù)
ASP.NET服務(wù)器端驗(yàn)證控件的使用
鏈表方式集中器抄表的設(shè)計(jì)
再議字庫(kù)知識(shí)產(chǎn)權(quán)保護(hù)
久治县| 浦城县| 遂平县| 蒲城县| 双桥区| 邹城市| 武宁县| 东源县| 延庆县| 濮阳县| 三都| 稷山县| 滕州市| 东方市| 剑河县| 中卫市| 佛教| 博客| 安多县| 墨脱县| 江永县| 海宁市| 喀喇沁旗| 宁化县| 通河县| 临夏县| 宜都市| 奉贤区| 嘉黎县| 上饶市| 武功县| 濉溪县| 三穗县| 时尚| 山东省| 博爱县| 宜宾市| 泽州县| 安平县| 台中市| 五峰|