趙 云
(桂林電器科學(xué)研究院有限公司,桂林541004)
隨著嵌入式系統(tǒng)已滲透入社會(huì)生活的很多領(lǐng)域(如電子消費(fèi)品、醫(yī)療儀器、工業(yè)環(huán)境),無論是普通消費(fèi)者還是商業(yè)用戶,都期待更友好的UI界面體驗(yàn)。emWin圖形庫是目前廣泛應(yīng)用于嵌入式系統(tǒng)界面開發(fā)的中間件,但em-Win中不能直接使用中文,且只提供庫文件,不開放源代碼,使通過修改emWin源代碼實(shí)現(xiàn)中文支持非常困難。如何在emWin中實(shí)現(xiàn)中文界面顯示,一直是嵌入式GUI設(shè)計(jì)中關(guān)注的問題。
常用的emWin支持中文的方法有兩種:
①用emWin提供的fontCvt工具生成特定的C語言格式的字庫代碼,加載在ROM空間供em Win調(diào)用,缺點(diǎn)是需要占用ROM資源。
②用第三方工具生成字庫文件,然后拷貝到SD卡或燒錄到Flash芯片,供em Win用文件系統(tǒng)方式調(diào)用,但用Flash需要額外燒錄,用SD卡又會(huì)拖慢顯示速度。
本文的方案把GT30L32S4W字庫映射到emWin的字體顯示接口,使em Win支持中文顯示。這種方式可以避免額外對(duì)Flash的燒錄工作,降低使用第三方字庫的風(fēng)險(xiǎn),也不需要占用MCU的ROM空間,用emWin做界面設(shè)計(jì)時(shí),可直接調(diào)用GT30L32S4W內(nèi)全部漢字資源,方案框圖如圖1所示。
圖1 GT30L32S4W方案框圖
GT30L32S4W為上海高通(GOTOP)發(fā)布的字庫芯片,支持國標(biāo)字符集GB2312(6 763個(gè)漢字),支持12×12、16×16、24×24、32×32四種點(diǎn)陣字型,總線接口為SPI,封裝為SOP8。
該芯片與STM32F103ZET6的接口電路如圖2所示,可以借鑒參考文獻(xiàn)[3]給出的SPI時(shí)序要求,直接調(diào)用STM32的庫函數(shù)實(shí)現(xiàn)GT30L32S4W的SPI讀寫函數(shù)。
圖2 STM32F103ZET6和GT30L32S4W硬件SPI1接口電路
這里給出讀取以DST為首地址的連續(xù)no_bytes個(gè)字節(jié)的實(shí)現(xiàn)方法,讀取完成后,字模保存在GUI_Font-DataBuf[]數(shù)組,供下一步處理。
①結(jié)構(gòu)體GUI_p UC_API為em Win的字符編碼接口,emWin通過 GUI_UC_Set EncodeNone()函數(shù)調(diào)用了該接口,但是emWin圖形庫不開放源代碼,無法直接修改庫文件。對(duì)應(yīng)的方法是打開UCGUI v3.98開源版本中提供的GUI_UC_EncodeNone.c文件,改寫里面的_GetChar-Code()、_GetCharSize()、_CalcSizeOfChar()、_Encode()這4個(gè)函數(shù),增加GB2312編碼的處理,然后把改動(dòng)過的文件加入工程編譯,可以使GUI_p UC_API指向改動(dòng)過的函數(shù),實(shí)現(xiàn)emWin對(duì)GB2312漢字的識(shí)別。
②emWin的字符顯示接口為GUIPROP_DispChar(),這個(gè)函數(shù)的功能是獲取字符字模,再執(zhí)行畫位圖的函數(shù)將字符顯示出來,該函數(shù)原型在UCGUI v3.98開源版本的GUICharP.c文件中。修改的方法是參考GUIPROP_DispChar()源代碼,改寫為 GUIPROP_X_DispChar()函數(shù),在獲取字模時(shí)先區(qū)分英文和漢字,如果為漢字就調(diào)用高通字模定位算法,連續(xù)讀取一個(gè)漢字的字模,然后進(jìn)行顯示處理。
③加入新字體還需要修改em Win圖形庫中提供的頭文件GUI.H和GUI_TYPE.H,把新字體的顯示方法指向GUIPROP_X_DispChar()函數(shù),這部分的工作在參考文獻(xiàn)[2]中有論述,具體源代碼可以借鑒參考文獻(xiàn)[6]。注意:emWin可以視為是開源的UC/GUI v3.98之后不開源的高級(jí)版本。
GT30L32S4W支持12×12、16×16、24×24、32×32四種點(diǎn)陣字型,由于參考文獻(xiàn)[2]、[3]和[4]給出不同點(diǎn)陣字型的計(jì)算方式不同,使用不方便。這里歸納出一套通用的字庫IC漢字地址計(jì)算方法:
①BaseAdd:一套點(diǎn)陣字體在GT30L32S4W芯片中的起始地址,例如16×16點(diǎn)陣的起始地址為0x2 C9D0。
②MSB:一個(gè)漢字的內(nèi)部GB2312編碼為16位,MSB表示該漢字GB2312編碼的高8位。
③LSB:類似MSB,表示一個(gè)漢字GB2312編碼的低8位。
④FontByte:?jiǎn)蝹€(gè)漢字的存儲(chǔ)長度,比如一個(gè)12×12點(diǎn)陣漢字需要連續(xù)24個(gè)字節(jié),32×32點(diǎn)陣需要連續(xù)128個(gè)字節(jié)。如圖3所表示,一個(gè)24×24漢字需要3×24共72個(gè)字節(jié)的存儲(chǔ)長度,讀取字模的時(shí)候需要連續(xù)讀取72個(gè)字節(jié),保存到一個(gè)數(shù)組里,再等待下一步顯示處理。
圖3 24×24的漢字
⑤Address:由MSB和LSB組成的16位GB2312漢字在字庫IC芯片中的字節(jié)地址,如圖3中漢字“高”的GB2312碼為0xB8DF,拆開 MSB就是0xB8,LSB就是0xDF。表1為GT30L32S4W的漢字地址表,可以根據(jù)該表將參數(shù)代入定位算法得到某個(gè)漢字的字模位置。
表1 GT30L32S4W等寬漢字地址表
本文提供了基于字庫芯片GT30L32S4W的em Win中文顯示方案。圖4所示為em Win調(diào)用中文字庫IC的實(shí)際效果,界面包括BUTTON控件、TEXT控件和DROPDOWN控件,均顯示正常。
圖4 emWin調(diào)用中文字庫IC的實(shí)際效果
該方案已應(yīng)用在寶通公司的尿液分析儀上,證明了該方案對(duì)emWin有良好的兼容性。該方案使產(chǎn)品量產(chǎn)時(shí)免除了字庫燒錄和測(cè)試工序,減少了第三方字符生成軟件的風(fēng)險(xiǎn),節(jié)省了Flash芯片成本,是一種值得推廣的嵌入式系統(tǒng)中文界面支持方案。此外,高通還提供多國語言的字庫芯片,參考該方案可以對(duì)emWin顯示日文、韓文做進(jìn)一步研究。
[1]SEGGER.emWin User&Reference Guide V5.28[EB/OL].[2015-03].www.segger.com.
[2]李建紅,劉丹,徐展.基于UCGUI庫的外擴(kuò)中文字庫研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2014,40(2):271-274.
[3]高通科技.GT30L32S4W標(biāo)準(zhǔn)漢字字庫芯片用戶手冊(cè)V1.0[EB/OL].[2015-03].www.genitop.com.
[4]馮月芹,湯小龍.高通字庫芯片GT23H32S4W的應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2013(12):45-47.
[5]陳新,蒲慶文.基于emWin圖形庫的電動(dòng)汽車液晶儀表設(shè)計(jì)[J].儀表技術(shù)與傳感器,2013(7):105-110.
[6]jdh99.在emWin中顯示字庫芯片GT23L24M0140的字模[EB/OL].[2015-03].http://blog.csdn.net/jdh99.
單片機(jī)與嵌入式系統(tǒng)應(yīng)用2015年10期