UCGUI在NIOSII上的移植_第1頁(yè)
UCGUI在NIOSII上的移植_第2頁(yè)
UCGUI在NIOSII上的移植_第3頁(yè)
UCGUI在NIOSII上的移植_第4頁(yè)
UCGUI在NIOSII上的移植_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、UC GUI在NIOSII上的移植作者:齊威王發(fā)表于2010-08-22 11:03原文鏈接閱讀:1評(píng)論:0轉(zhuǎn)自這是前些日子在使用uc/GUI的時(shí)候即下來(lái)的一些東西原來(lái)發(fā)布在EDACN的bbs上面?,F(xiàn)在不知道沉到哪里去了?,F(xiàn)在把它重新整理發(fā)布在這里。隨后在明年過(guò)年的時(shí)候把后續(xù)的幾個(gè)高級(jí)主題整理出來(lái)。下面開(kāi)始我的筆記!有興趣的兄弟們可以來(lái)看看。step1.下載uC/GUI的代碼。(廢話沒(méi)有源代碼移植個(gè)鳥(niǎo))我下載的時(shí)uC/GUI3.32這是能得到的源代碼中最全的一個(gè)版本。看看里面都有些什么東西。由于這里的發(fā)間大小的限制的問(wèn)題不能上傳源代碼。很是郁悶。有需要的同志可以聯(lián)系我。Email:首先看看所有

2、名叫Simulation的東西這是uC/GUI在VC中仿真的VC工程,他的仿真功能非常的實(shí)用可以在沒(méi)有具體硬件的情況下先行開(kāi)發(fā)軟件,而絲毫不影響軟件的兼容性。但是有一個(gè)問(wèn)題比較郁悶,就是速度的問(wèn)題。大家知道嵌入式系統(tǒng)的CPU運(yùn)算能力有限,而電腦的cpu.我的整個(gè)項(xiàng)目的gui是在電腦上完成的。拿到目標(biāo)系統(tǒng)上面編譯.通過(guò)。經(jīng)過(guò)緊張的下載.運(yùn)行.顯示出了第一個(gè)畫(huà)面,無(wú)比的興奮。但測(cè)試發(fā)現(xiàn)極其郁悶而幾乎無(wú)法解決的問(wèn)題.目標(biāo)系統(tǒng)的處理能力只有100mips而我的電腦的cpu是P4 3.0。速度的差別太大了。解決這個(gè)問(wèn)題幾乎成了我后半段工作的主題。GUI文件夾存放全部uC/GUI源代碼的地方看看它的屬性有

3、多達(dá)390個(gè)文件,全部是.c和.h。可以看出GUI系統(tǒng)是一個(gè)龐大復(fù)雜的東西。我在調(diào)試系統(tǒng)的時(shí)候跟蹤過(guò)完整的消息循環(huán)再進(jìn)入了60多個(gè)子函數(shù)調(diào)用后還沒(méi)有看到希望,就徹底的放棄了跟蹤的想法。下來(lái)會(huì)具體說(shuō)明這里面都有些什么東西。config文件夾uC/GUI的配置文件夾。里面存放的是uC/GUI的配置頭文件。改動(dòng)里面的相應(yīng)的就可以改動(dòng)uC/GUI的配置。這個(gè)GUI功能十分強(qiáng)大。我也在探索之中。這幾天剛剛?cè)腴T(mén),只能說(shuō)我自己的移植過(guò)程,以后陸續(xù)添上它的使用。有什么不對(duì)的地方大家請(qǐng)指出來(lái)。uC/GUI移植之準(zhǔn)備工作。先來(lái)看看吧uC/GUI移植到NIOS II都要準(zhǔn)備些什么東西。首先就是要了解uC/GUI的源

4、代碼包括了一些什么東西。前面提到了這個(gè)gui有兩個(gè)文件夾一個(gè)GUI存放gui的核心文件,一個(gè)config為gui提供配置信息。先看core里面有什么東西。GUIAntiAlias抗鋸齒支持,看上去挺牛的。根據(jù)對(duì)抗鋸齒的使用發(fā)現(xiàn),uC/GUI的抗鋸齒的效果好壞主要取決于系統(tǒng)的發(fā)色數(shù),即系統(tǒng)的色彩表現(xiàn)能力,例如系統(tǒng)僅有灰度顯示能力的時(shí)候,uC/GUI在對(duì)一條直線進(jìn)行處理的時(shí)候它是在直線的兩側(cè)添加顏色較淺的點(diǎn)來(lái)實(shí)現(xiàn)抗鋸齒的。效果十分明顯。GUIConvertMono(b/w)和灰度顯示的色彩轉(zhuǎn)換支持。GUIConvertColor彩色顯示的色彩轉(zhuǎn)換支持實(shí)際上就是色彩空間變換,為什么需要色彩轉(zhuǎn)換呢?在

5、gui內(nèi)部定義了一套調(diào)色板及色彩的數(shù)據(jù)格式,但是有的控制器的色彩數(shù)據(jù)格式和gui內(nèi)部定義的并不一樣,甚至色彩的數(shù)量(即lcd的發(fā)色數(shù))也不同,這樣就需要將兩種不同的數(shù)據(jù)格式進(jìn)行轉(zhuǎn)換。這樣才能在lcd上看到正常的顏色。GUICore C/GUI核心文件,提供了GUI基本的功能,比如畫(huà)點(diǎn),畫(huà)線,為圖之類(lèi)的東西。什么窗口,窗口控件都是基于這些基本功能的。GUIFont不用多說(shuō)了GUILCDDriver LCD控制器。下面會(huì)說(shuō)這個(gè)東西。GUIMemDev Memory device支持。這個(gè)東西可用在很多情況下,但最主要的功能是防止在項(xiàng)目重疊時(shí),防止屏幕的閃爍。如果沒(méi)有Memory device的支持

6、數(shù)據(jù)會(huì)直接寫(xiě)到控制器中去,這樣當(dāng)進(jìn)行各種屏幕跟新的時(shí)候就會(huì)出現(xiàn)閃爍現(xiàn)象。如果有Memory device支持,就會(huì)避免這種現(xiàn)象。具體的還沒(méi)有測(cè)試,不過(guò)看說(shuō)明是蠻牛的。關(guān)于這個(gè)東西會(huì)有一個(gè)較詳細(xì)的測(cè)試。GUITouch Touch-panel支持。雖然說(shuō)是支持,甚至連鼠標(biāo)都支持,但是底層驅(qū)動(dòng)程序的四個(gè)函數(shù)是空的需要用戶自己添加內(nèi)容,我們使用mxb7843這個(gè)四線電阻觸摸屏控制器。班子還沒(méi)有做好,做好就測(cè)試。GUIWidget窗體控件庫(kù),功能強(qiáng)大,提供諸如按鈕,文本框之類(lèi)的復(fù)雜的功能。GUIWM窗口庫(kù)。widget wm配合memory device使用功能強(qiáng)大。下面看看CONFIG文件夾三個(gè)文件

7、:GUIConf.h GUITouchConf.h LCDConf.h看名字也知道干什么的了。下面一個(gè)一個(gè)說(shuō)。#ifndef GUICONF_H#define GUICONF_H#define GUI_OS(1)/*多任務(wù)支持,如果使用rtos就打開(kāi)這個(gè)選項(xiàng),除了自家的ucos,別的rtos也支持*/#define GUI_SUPPORT_TOUCH(1)/*支持觸摸屏*/#define GUI_SUPPORT_UNICODE(1)/*unicode字符串支持,能顯示中文的哦,只要能把字庫(kù)放進(jìn)來(lái),現(xiàn)在的問(wèn)題我把字庫(kù)放不進(jìn)來(lái),文件太大了,編譯器限制,郁悶!*/#define GUI_DEFAUL

8、T_FONT&GUI_Font6x8/*默認(rèn)字體*/#define GUI_ALLOC_SIZE 12500/*WM和memory devices分配的動(dòng)態(tài)內(nèi)存*/*Configuration of available packages*/#define GUI_WINSUPPORT 1/*Window manager package available*/#define GUI_SUPPORT_MEMDEV 1/*Memory devices available*/#define GUI_SUPPORT_AA 1/*Anti aliasing available*/這三個(gè)不用說(shuō)了吧!#end

9、if/*Avoid multiple inclusion*/GUITouchConf.h這個(gè)文件.由于硬件不到位沒(méi)有深入研究觸摸這塊還不太理解,日后補(bǔ)上。LCDConf.h這個(gè)文件比較特別,隨著控制器的不同,內(nèi)容而不同。如果針對(duì)的是硬件控制器,就會(huì)在這個(gè)文件里面定義控制器的基地址,所有的寄存器,顯示內(nèi)存的地址鏡像關(guān)系,等等一系列硬件控制器的特征信息。當(dāng)然了還會(huì)定義lcd的尺寸,調(diào)色板,等一些重要的信息。還有救治針對(duì)不同的lcd的設(shè)置,配置不同的控制器初始化代碼。還有一種就是MEM控制器。就是沒(méi)有硬件控制器在內(nèi)存里面申請(qǐng)一個(gè)和LCD物理象素點(diǎn)一一對(duì)應(yīng)的內(nèi)存區(qū)域作為顯示緩沖區(qū),然后由用戶想辦法把數(shù)

10、據(jù)送到LCD上去。他給的例子里面是用定時(shí)中斷來(lái)模擬LCD控制的控制時(shí)序,將數(shù)據(jù)流送到LCD上。在該模式下如果是一個(gè)很小lcd該方法很好節(jié)省了硬件成本。但是大量占用CPU刷新率低。如果lcd象素很高,那就是個(gè)問(wèn)題了。但是在某些應(yīng)用中不得不使用這種方式。在我的工程里面就使用了這種方式。我的屏640*480*3bit。這里有關(guān)硬件的控制器是一個(gè)大問(wèn)題,即底層的驅(qū)動(dòng)程序怎么辦?uC/GUI提供了很多的芯片的驅(qū)動(dòng)程序,但是如果選用的芯片沒(méi)有怎么辦?或者屏的參數(shù)比較奇怪怎么辦?比如我用的屏640*480*3bit,就是8色的那種,一般的屏都是16色。我打算在過(guò)年的時(shí)候開(kāi)一個(gè)有關(guān)驅(qū)動(dòng)程序的專題,討論這些問(wèn)題

11、。還有驅(qū)動(dòng)程序的效率對(duì)整個(gè)gui的效率影響很大。準(zhǔn)備就這么多該說(shuō)說(shuō)移植了。該移植了!首先弄個(gè)NIOS II系統(tǒng)。然后打開(kāi)NIOS II IDE創(chuàng)建一個(gè)工程。什么都可以!我使用的Hello World這個(gè)工程。使用例子的好處省心。然后找到這個(gè)工程的在硬盤(pán)中的物理位置,將下載的代碼中的兩個(gè)文件夾GUI和config拷貝進(jìn)去該軟件工程的目錄里面。由于前一段的工作是基于Altera Fpga的用的就是NIOS II處理器,后面我會(huì)專門(mén)針對(duì)arm來(lái)討論相關(guān)的問(wèn)題,最近的項(xiàng)目是基于arm9的。圖中就是copy好的目錄。然后回到NIOS II IDE refresh工程就能看到ide自動(dòng)將這兩個(gè)文件加添加進(jìn)

12、了工程,還有里面所有的文件。但是不是所有的文件都是有用的,nios II的編譯器會(huì)把所有的文件編譯,這樣在鏈接的時(shí)候就出問(wèn)題了,因?yàn)橛械奈募轻槍?duì)不同的配置寫(xiě)的。但是所有的都被編譯了,這樣子就導(dǎo)致大量的鏈接錯(cuò)誤,無(wú)數(shù)重復(fù)定義。這就需要將無(wú)用的文件從工程中清除。一個(gè)地方就是LCDDrivers由于底層的繪圖函數(shù)是在drivers里面定義的所以有多少個(gè)drivers就會(huì)有多少個(gè)同樣名稱的函數(shù)。這里就需要將無(wú)用的driver清除。還有一個(gè)地方就是gui/core的GUI_DrawBMP.c和GUI_DrawBitmap.c著兩個(gè)文件內(nèi)容一模一樣,一字不差!所以要清除一個(gè)!還有一個(gè)重要問(wèn)題是文件的包含

13、路徑。nios ide不是自動(dòng)添加文件包含路徑的,用慣了ads的人特不習(xí)慣。而且在5.1包含路徑設(shè)置位置比較難找!在這里添加四個(gè)路徑:E:FPGALcdsoftwarehello_world_0Config E:FPGALcdsoftwarehello_world_0guiCore E:FPGALcdsoftwarehello_world_0guiWM E:FPGALcdsoftwarehello_world_0guiWidget還有就是要在系統(tǒng)庫(kù)中加上ucos。uC/GUIi默認(rèn)打開(kāi)多任務(wù)支持。包含好了路徑就可以編譯了。但是提示還有鏈接錯(cuò)誤!非常郁悶,怎么看也看不出來(lái)怎么回事。提示一個(gè)字體未

14、定義!關(guān)鍵還是默認(rèn)字體!經(jīng)過(guò)仔細(xì)察看發(fā)現(xiàn)一個(gè)問(wèn)題!大家看看圖就明白了!NIOS II IDE使用java開(kāi)發(fā)的,java大小寫(xiě)敏感!這點(diǎn)還是Windows作的好。還有一個(gè)問(wèn)題就是優(yōu)化級(jí)別的問(wèn)題,我發(fā)現(xiàn)在NIOS II系統(tǒng)里面most級(jí)別的優(yōu)化和none的優(yōu)化(就是不優(yōu)化)執(zhí)行速度能差23倍。特別是一些計(jì)算密集型的代碼例如:crc和gui應(yīng)用。這回編譯就沒(méi)有錯(cuò)誤了!GUI初步移植成功,下來(lái)測(cè)試一下!由于沒(méi)有硬件支持只能看看軟件的。調(diào)試工程用內(nèi)存查看器,就看到了uC/GUI的運(yùn)行的結(jié)果。執(zhí)行下面的語(yǔ)句:int main()LCD_Part=0;alt_irq_register(LCM_0_IRQ,

15、(void*)0,LCD_isr);alt_irq_enable(LCM_0_IRQ);GUI_Init();GUI_DispChar(A);/*顯示一個(gè)A*/printf(Hello from Nios II!);while(1)return 0;我用的是MEMC驅(qū)動(dòng)程序,即把GUI執(zhí)行的結(jié)果保存到內(nèi)存中。這樣子才有了直接察看內(nèi)存來(lái)看結(jié)果BT方法??梢栽趦?nèi)存查看器中看到數(shù)據(jù)的變化(由于數(shù)據(jù)量巨大,只列出頭幾列的數(shù)據(jù))1f f0 00.e0 0e 00.e0 0e 00.ff fe 00.e0 0e 00.e0 0e 00.e0 0e 00.00 00 00.轉(zhuǎn)化為二進(jìn)制11111100000

16、0我的屏是RGB三色屏共有8種顏色,0表示該點(diǎn)滅,1表示亮。3位表示一個(gè)彩色的象素點(diǎn)。能看出來(lái)由1組成了一個(gè)A嗎?GUI初步抑制成功,下面將探索它的各種功能。(這部分著在摸索,每天弄一點(diǎn),跟新可能會(huì)很慢!)使用MEMC是因?yàn)檫@種方式的移植最簡(jiǎn)單根本不牽扯硬件,而且因?yàn)轫?xiàng)目經(jīng)費(fèi)緊張,不可能買(mǎi)一個(gè)獨(dú)立的控制器,特別是體現(xiàn)不出來(lái)FPGA的優(yōu)勢(shì)。這里的控制器是一個(gè)自己寫(xiě)的小東西,實(shí)現(xiàn)的對(duì)LCD的控制,這部分正在測(cè)試,測(cè)試好了也會(huì)拿出來(lái)給大家共享的。下來(lái)的幾天主要測(cè)試uC/GUI的復(fù)雜應(yīng)用。包括widget,wm這些東西。-uC/GUI Simulation的應(yīng)用uC/GUI提供了一格功能是強(qiáng)大的工具,

17、即Simulation工具他可以在windows環(huán)境下模擬uC/GUI的運(yùn)行結(jié)果,為GUI應(yīng)用程序的開(kāi)發(fā)體供了極大的方便,在模擬器上開(kāi)發(fā)GUI應(yīng)用程序代碼可以幾乎無(wú)修改的直接應(yīng)用于目標(biāo)硬件。這個(gè)模擬器的原理是GUI程序運(yùn)行后產(chǎn)生一個(gè)實(shí)時(shí)更新的BMP圖片然后由gui模擬程序顯示出來(lái)。這個(gè)功能作得太好了,這樣子gui程序的開(kāi)發(fā)簡(jiǎn)直是無(wú)敵了。在下載的uC/GUI源代碼中,解壓后就能看到一個(gè)名叫Simulation的VC6Workspace和project。在頂樓的圖中可以清楚地看到這兩個(gè)文件。這是uC/GUI的開(kāi)發(fā)人員幫我們做好的。直接打開(kāi)這個(gè)工程就可以在VC6中開(kāi)發(fā)GUI應(yīng)用程序,uC/GUI高度

18、抽象,應(yīng)用程序與底層很好的分離,這樣為GUI應(yīng)用程序的開(kāi)發(fā)提供了極大的方便。下面打開(kāi)這工程看看里面有什么東西。我使用的VS.Net。沒(méi)有什么區(qū)別,個(gè)人認(rèn)為VS.Net的功能較VC6強(qiáng)大許多。是一個(gè)優(yōu)秀的集成開(kāi)發(fā)環(huán)境。打開(kāi)工程后我們看看里面都有些什么東西。config和gui文件加我們前面都說(shuō)過(guò)了,里面放的就是Gui的配置文件和gui的源代碼。這里面多了幾個(gè)文件夾。Application文件夾,用戶存放應(yīng)用程序文件的地方。Simulation文件夾模擬器提供初始化和一些配置信息,我們根本不用改動(dòng)這些東西。System文件夾,大家知道每個(gè)C程序都有一個(gè)main函數(shù),這里面就放了這一個(gè)東西。還有一個(gè)

19、地方,就是LCD_Driver這個(gè)文件夾里面放的是LCDWIN.c這樣無(wú)論你怎么修改GUI的配置,模擬器都會(huì)使用這個(gè)驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)GUI程序運(yùn)行結(jié)果的正確的顯示。LCDWin.c就是基于windows模擬器的驅(qū)動(dòng)程序,就是通過(guò)這個(gè)驅(qū)動(dòng)生成模擬器里顯示的bmp圖片。弄清楚這些東西,就可以開(kāi)始uC/GUI編程了。打開(kāi)MainTask.c這個(gè)文件我們就在這里面編寫(xiě)我們的GUI應(yīng)用程序。#includeGUI.hextern const GUI_BITMAP bmMicriumLogo;extern const GUI_BITMAP bmMicriumLogo_1bpp;下面是自帶的一段示例代碼。我們

20、來(lái)看看她都干了些什么東西。/*main()*/void MainTask(void)int Cnt=0;int i,YPos;int LCDXSize=LCD_GET_XSIZE();int LCDYSize=LCD_GET_YSIZE();/*取得lcd物理尺寸,這個(gè)參數(shù)是在lcdconf.h里面定義的*/const GUI_BITMAP*pBitmap;/*一個(gè)指向預(yù)顯示的位圖的指針,在這里位圖是在.c文件里面存儲(chǔ)的ps:.c的體積大的吹牛*/GUI_Init();/*初始化GUI,這誰(shuí)痘看得出來(lái)*/*這里面除了初始了在guiconf.h里面定義的時(shí)用的GUI的所有功能,包括widget,

21、wm等功能的初始化,當(dāng)然還有l(wèi)cd的控制器的初始化*/GUI_SetBkColor(GUI_RED);GUI_Clear();/*設(shè)置背景顏色為RED,其結(jié)果如圖*/*/*說(shuō)明一下這個(gè)模擬器的窗口,最大的那個(gè)窗口顯示的就是GUI程序的運(yùn)行結(jié)果。標(biāo)題里顯示的是當(dāng)前LCD的配置參數(shù),colors顯示的當(dāng)前gui系統(tǒng)能顯示的所有的顏色,即調(diào)色板。log是gui的日志,這個(gè)功能會(huì)在后面說(shuō)明*/GUI_Delay(1000);/*延遲1000個(gè)時(shí)鐘節(jié)拍,這里我們的gui是應(yīng)用在ucos rtos上面,這里的時(shí)鐘節(jié)拍就是ucos的時(shí)鐘節(jié)拍*/GUI_SetBkColor(GUI_BLUE);/*背景設(shè)為B

22、LUE*/GUI_Clear();/*清除當(dāng)前的window,沒(méi)有窗口就清理整個(gè)屏幕*/GUI_Delay(1000);GUI_SetColor(GUI_WHITE);for(i=0;i 1000;i+=10)GUI_DrawHLine(i,0,100);GUI_DispStringAt(Line,0,i);GUI_DispDecMin(i);/*這段代碼的功能就是每隔10行顯示文字line和一條直線。*/GUI_Delay(1000);GUI_SetColor(0x0);/設(shè)置顯示顏色為黑色!?黑色對(duì)著呢!1時(shí)點(diǎn)亮0是熄滅你看看是不黑色。GUI_SetBkColor(0xffffff);fo

23、r(i=0;i 160;i+)int len=(i 80)?i:160-i;GUI_DrawHLine(i,20,len+20);/顯示一個(gè)三角形GUI_Clear();if(LCD_GET_YSIZE()(100+bmMicriumLogo_1bpp.YSize)pBitmap=&bmMicriumLogo;/設(shè)置要顯示的位圖為MicriumLogoelseGUI_SetColor(GUI_BLUE);pBitmap=&bmMicriumLogo_1bpp;GUI_DrawBitmap(pBitmap,(LCDXSize-pBitmap-XSize)/2,10);YPos=20+pBitma

24、p-YSize;/顯示位圖MicriumLogo GUI_SetFont(&GUI_FontComic24B_1);GUI_DispStringHCenterAt(,LCDXSize/2,YPos);/在指定位置以FontComic24B_1字體顯示文字 GUI_Delay(1000);GUI_SetColor(GUI_RED);GUI_DispStringHCenterAt(?2002,LCDXSize/2,YPos+30);GUI_SetFont(&GUI_Font10S_1);GUI_DispStringHCenterAt(Micri祄 Inc.,LCDXSize/2,YPos+60);

25、/在指定位置以Font10S_1字體顯示文字Micrium Inc GUI_Delay(1000);截圖一個(gè)完整的gui應(yīng)用程序的例子就出來(lái)了。接下來(lái)將是gui應(yīng)用程序的開(kāi)發(fā)。從最簡(jiǎn)單的文字到window到復(fù)雜的控件。一步一步來(lái),我也在學(xué)習(xí)。在硬件控制器徹底搞定之前都將使用這個(gè)東西開(kāi)發(fā)應(yīng)用程序。-uC/GUI NIOS II移植之Text顯示今天研究了uC/GUI的文字顯示系統(tǒng)。這個(gè)系統(tǒng)的功能相當(dāng)強(qiáng)大,提供了一下幾個(gè)函數(shù)。GUI_DispChar()顯示一個(gè)字符GUI_DispCharAt()在某個(gè)位置顯示一個(gè)字符GUI_DispChars()顯示n個(gè)設(shè)定的字符GUI_DispString()

26、顯示一個(gè)字符串GUI_DispStringAt()在某個(gè)位置顯示一個(gè)字符串還有好大一堆函數(shù),不過(guò)這幾個(gè)是最基本的。先看一段有關(guān)這些代碼的事例程序:void MainTask(void)unsigned int i;GUI_Init();初始化,設(shè)置的默認(rèn)字體是6*8的一種字體,具體叫什么忘了GUI_SetColor(GUI_YELLOW);設(shè)置顯示顏色為YELLOW,這里指的是字符的顏色GUI_DispChars(*,108);從當(dāng)前坐標(biāo)起顯示108個(gè)*,就是截圖里面的最上面的那排*for(i=0;i 480;i+=8)GUI_DispCharAt(*,1,i);在第一列顯示一列*GUI_Di

27、spChars(*,108);在最下面一行顯示一排*for(i=0;i=480;i+=8)GUI_DispCharAt(*,634,i);在最右邊的一列顯示一列*GUI_SetColor(GUI_GREEN);設(shè)置顯示的顏色為GREEN GUI_SetFont(&GUI_Font8x10_ASCII);設(shè)置字體為GUI_Font8*10_ASCII GUI_DispCharAt(A,100,100);在坐標(biāo)100,100處顯示一個(gè)A GUI_DispString(!Hello World!);顯示Hello World!大家注意這是緊跟著A顯示出來(lái)的,即它是在當(dāng)前光標(biāo)處顯示字符的GUI_Set

28、Font(&GUI_Font32_ASCII);設(shè)置字體GUI_SetColor(GUI_YELLOW);設(shè)置顯示顏色為YELLOW,下面代碼顯示的字符都是黃色的GUI_DispChars(*,15);顯示15個(gè)*GUI_SetBkColor(GUI_BLUE);設(shè)置背景顏色為BLUE,大家注意這個(gè)背景顏色,是襯在字下面的,而不是整個(gè)的背景GUI_DispCharAt(B,600,400);GUI_SetFont(&GUI_Font32B_ASCII);GUI_SetColor(GUI_RED);GUI_DispStringAt(Hello World!,1,200);在1,100這個(gè)地方顯示

29、字符串,注意覆蓋掉了原先顯示出來(lái)的*GUI_Delay(1000);效果圖這樣基本的字符顯示函數(shù)就完了。大家都會(huì)使用了。在前提到這個(gè)GUI支持UNICODE。既然支持UNICODE那就應(yīng)該能顯示中文才對(duì)??!當(dāng)然能顯示中文,但關(guān)鍵問(wèn)題是字體!這里就講一講有關(guān)字體的提取。首先要用到一個(gè)字體轉(zhuǎn)換工具,因?yàn)槲覀兊玫降膗C/GUI代碼基本上都是D版的,里面所附的字體轉(zhuǎn)換工具都是DOME版,根本轉(zhuǎn)換不出來(lái)正常的字體.c文件。在這里要用到另外一個(gè)程序。聲明:該程序轉(zhuǎn)載自,所有權(quán)歸原作者ucgui所有,這里只是轉(zhuǎn)載。僅上船該程序的可執(zhí)行文件聲明:在這里特便感謝原作者做出的貢獻(xiàn)!首先運(yùn)行程序,看到如圖的程序界面

30、,相當(dāng)?shù)暮?jiǎn)單。然后點(diǎn)擊選擇字體。按扭出現(xiàn)新的對(duì)話框,我選擇的字體如圖所示。確定后回到主界面,點(diǎn)擊看到這個(gè)對(duì)話框文件就轉(zhuǎn)換好了!直接加載進(jìn)模擬器工程就可以享受中文字體帶來(lái)喜悅了!在這里上傳兩個(gè)轉(zhuǎn)換好的字體宋體(5號(hào)字)和Times new roman(5號(hào)字)兩個(gè)字體,供大家參考,其中Times字體去掉了除ascii碼之外所有的其他字模。說(shuō)一下這里的5號(hào)字對(duì)應(yīng)的就是16*16的漢字字體。宋體那個(gè)文件體積巨大3Mb多,如果是大字體的話就有十幾MB了!我們現(xiàn)在運(yùn)行下面的程序,體驗(yàn)一下中文的喜悅!#includeGUI.hextern GUI_FLASH const GUI_FONT GUI_Font

31、HZ_FangSong_GB2312_14;extern GUI_FLASH const GUI_FONT GUI_FontHZ_Times_New_Roman_14;extern GUI_FLASH const GUI_FONT GUI_Font8x10_ASCII;extern GUI_FLASH const GUI_FONT GUI_Font32_ASCII;extern GUI_FLASH const GUI_FONT GUI_Font32B_ASCII;/*這幾行一定要有,聲明從外部引用這個(gè)數(shù)據(jù)結(jié)構(gòu),建議大家將所有的字體的定義弄成一個(gè)頭文件,這樣子比較方便!*/void MainTa

32、sk(void)unsigned int i;GUI_Init();GUI_SetColor(GUI_YELLOW);GUI_DispChars(*,108);for(i=0;i 480;i+=8)GUI_DispCharAt(*,1,i);GUI_DispChars(*,108);for(i=0;i=480;i+=8)GUI_DispCharAt(*,634,i);GUI_SetColor(GUI_GREEN);GUI_SetFont(&GUI_FontHZ_Times_New_Roman_14);GUI_DispCharAt(A,100,100);GUI_DispString(!Hello

33、 World!);/*仔細(xì)看這里的字體已經(jīng)是Times new roman了和上面的是不一樣的*/GUI_SetFont(&GUI_Font32_ASCII);GUI_SetColor(GUI_YELLOW);GUI_DispChars(*,15);GUI_SetBkColor(GUI_BLUE);GUI_DispCharAt(B,600,400);GUI_SetFont(&GUI_FontHZ_FangSong_GB2312_14);GUI_SetColor(GUI_RED);GUI_DispStringAt(大家好這里是中文顯示演示程序!,1,200);/*將上面程序中的Hello Wor

34、ld替換成了中文!*/GUI_Delay(10000);還有一個(gè)郁悶的問(wèn)題,文件太大了有的編譯器有限制!例如VC.NET的編譯器。好在NIOS II編譯器沒(méi)有這個(gè)限制??纯磮D:實(shí)際測(cè)試不影響使用,我們測(cè)試了4000多個(gè)漢字沒(méi)有發(fā)現(xiàn)什么問(wèn)題。-uC/GUI NIOS II移植之2D圖形庫(kù)今天繼續(xù)昨天的話題。來(lái)看2D圖形庫(kù)。這里面uC/GUI提供了強(qiáng)大的功能。先看看有什么函數(shù)。里面有不少東西,這是截的圖懶的一個(gè)一個(gè)把他們敲上來(lái)了。先看第一個(gè)函數(shù),GUI_SetDrawMode();設(shè)置GUI的繪圖模式。靠上去好像很高深。這個(gè)函數(shù)就有一個(gè)參數(shù)mode。mode又兩個(gè)選項(xiàng)GUI_DRAWMODE_NO

35、RMAL和GUI_DRAWMODE_XOR。先看一個(gè)例子大家就明白這個(gè)MODE是什么意思了。void MainTask(void)unsigned int i;GUI_Init();GUI_SetFont(&GUI_FontHZ_Times_New_Roman_14);GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);設(shè)置為GUI_DRAWMODE_NORMAL GUI_SetBkColor(GUI_YELLOW);GUI_Clear();/這句話比較有意思,執(zhí)行了之后他會(huì)將整個(gè)窗口填充為Bk設(shè)置的顏色,要不只有在在繪制的圖形的下面才有Bk色。GUI_SetColor(

36、GUI_RED);GUI_FillCircle(300,200,130);/畫(huà)第一個(gè)園,紅色的,顯眼一點(diǎn)。GUI_SetColor(GUI_GREEN);/設(shè)置繪圖顏色為GREEN GUI_FillCircle(140,200,130);/以NORMAL方式畫(huà)第二個(gè)圓GUI_SetDrawMode(GUI_DRAWMODE_XOR);/設(shè)置繪圖方式為XOR GUI_FillCircle(460,200,130);/以XOR方式繪制第三個(gè)圓,這里大家仔細(xì)看看同樣繪制了一GREEN顏色的圓,為什么不是GREEN的?XOR惹的禍。這個(gè)函數(shù)在黑白顯示里面尤為重要!GUI_SetColor(GUI_BL

37、UE);GUI_DispStringAt(First Circle,300,340);GUI_DispStringAt(Seconde Circle,140,340);GUI_DispStringAt(Third Circle,460,340);/這些是為了觀察方便添上去的GUI_SetColor(GUI_BLACK);GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);GUI_FillCircle(300,200,3);GUI_FillCircle(140,200,3);GUI_FillCircle(460,200,3);GUI_DrawCircle(300,200,1

38、31);/畫(huà)圓,但是畫(huà)出來(lái)的只有輪廓,上面調(diào)用的函數(shù)GUI_FillCircle()是將這員填充顏色的。uC/GUI里面所有的在封閉圖形比如說(shuō)圓和長(zhǎng)方形的繪圖函數(shù)Fill和Draw都有類(lèi)似的關(guān)系GUI_Delay(5000);效果圖接下來(lái)就應(yīng)該顯示位圖了及BMP文件。但是大多數(shù)的嵌入式系統(tǒng)不支持文件系統(tǒng)那該怎么辦?uC/GUI提供了一個(gè)解決方案,把位圖轉(zhuǎn)化為.C文件。這個(gè)工具就叫uC-GUI-BitmapConvert.exe執(zhí)行這個(gè)工具,打開(kāi)一個(gè)我事先準(zhǔn)備好的位圖文件。然后如圖選擇轉(zhuǎn)換該文件。其實(shí)在這里選擇把位圖轉(zhuǎn)換成多少色的都沒(méi)有關(guān)系,gui會(huì)自動(dòng)適佩目標(biāo)系統(tǒng)的顏色。之所以這么選擇是為了節(jié)

39、省存儲(chǔ)空間,畢竟嵌入式系統(tǒng)容量有限。轉(zhuǎn)換好了以后立即就能看到效果。在界面的最上方顯示的是這個(gè)位圖的大小這里可看到是419*490。下面顯示的就是調(diào)色板,即這個(gè)位圖所有能顯示出來(lái)的顏色。線面就是預(yù)覽了。難看的不行了。然后選擇另存為,就出現(xiàn)了.c文件這個(gè)選項(xiàng)。這是轉(zhuǎn)換好的位圖.c文件和位圖原文件。還支持位圖文件的壓縮。在保存的時(shí)候選擇就可以了。比較一下文件可以看到兩個(gè)文件的大小相差了一倍。為壓縮的600多k,壓縮的才300。按照他文檔的說(shuō)明,可以提供2的壓縮率。來(lái)看看他們都有什么不同。這是為壓縮的:#includestdlib.h#includeGUI.H/*Palette The followi

40、ng are the entries of the palette table.Every entry is a32-bit value(of which 24 bits are actually used)the lower 8bits represent the Red component,the middle 8bits represent the Green component,the highest 8bits(of the 24 bits used)represent the Blue component as follows:0xBBGGRR*/const GUI_COLOR C

41、olors3=0x 000000,0x0000FF,0x00FF00,0x00FFFF,0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF;/*這個(gè)位圖的調(diào)色板可以看出來(lái)里面有8種顏色*/const GUI_LOGPALETTE Pal3=8,/*number of entries*/0,/*No transparency*/&Colors30;const unsigned char ac3=0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x

42、77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,/*這里面存放的就是bitmap的數(shù)據(jù)太多了就被我精簡(jiǎn)了,只顯示一行。有興趣的去下載附件看看。*/;const GUI_BITMAP bm3=419,/*XSize*/490,/*YSize*/210,/*BytesPerLine*/4,/*BitsPerPixel*/ac3,/*Pointer to picture data(indices)*/&Pal3/*Pointer to palette*/;下面是壓縮的:#includ

43、estdlib.h#includeGUI.H/*Palette The following are the entries of the palette table.Every entry is a32-bit value(of which 24 bits are actually used)the lower 8bits represent the Red component,the middle 8bits represent the Green component,the highest 8bits(of the 24 bits used)represent the Blue compo

44、nent as follows:0xBBGGRR*/const GUI_COLOR Colors3_compressed_with_palette=0x 000000,0x0000FF,0x00FF00,0x00FFFF,0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF;const GUI_LOGPALETTE Pal3_compressed_with_palette=8,/*number of entries*/0,/*No transparency*/&Colors3_compressed_with_palette0;const unsigned char ac3_c

45、ompressed_with_palette=/*RLE:418 Pixels000,000*/254,0x07,164,0x07,/*RLE:001 Pixels418,000*/1,0x00,/*RLE:418 Pixels000,001*/254,0x07,164,0x07,/*同上砍掉了很多東西,有興趣的看附件*/;const GUI_BITMAP bm3_compressed_with_palette=419,/*XSize*/490,/*YSize*/210,/*BytesPerLine*/GUI_COMPRESS_RLE4,/*BitsPerPixel*/ac3_compress

46、ed_with_palette,/*Pointer to picture data(indices)*/&Pal3_compressed_with_palette/*Pointer to palette*/,GUI_DRAW_RLE4;看看有什么區(qū)別,根據(jù)我的理解,壓縮就是把有信息的象素點(diǎn)標(biāo)出來(lái)。黑色的就不標(biāo)記。不過(guò)在顯示效果上沒(méi)有任何區(qū)別!但是顯示壓縮的位圖明顯能感覺(jué)到速度較慢。這是測(cè)試用的代碼:extern const GUI_BITMAP bm3;extern const GUI_LOGPALETTE Pal3;extern const unsigned char ac3;extern

47、const GUI_BITMAP bm3_compressed_with_palette;/這是一些要用到的外部變量聲明GUI_SetDrawMode(GUI_DRAWMODE_NORMAL);GUI_SetBkColor(GUI_BLACK);GUI_SetColor(GUI_WHITE);GUI_Clear();/*清理桌面,變成黑的*/GUI_DrawBitmap(&bm3,10,10);/*在左上角為起始點(diǎn)的10,10座標(biāo)為圓點(diǎn)顯示位圖*/GUI_Delay(5000);GUI_Clear();GUI_Delay(1000);GUI_DrawBitmap(&bm3_compressed

48、_with_palette,50,10);/*在左上角為起始點(diǎn)的50,10座標(biāo)為圓點(diǎn)顯示位圖,效果上沒(méi)有區(qū)別,但是速度明顯的慢*/GUI_Delay(5000);直接添加到上段代碼的后面就行了。超出顯示范圍的內(nèi)容就被自動(dòng)砍掉了。這是第一個(gè)顯示的截圖,第二個(gè)由于效果上沒(méi)卻別,就不浪費(fèi)論壇空間了。再來(lái)看看GUI_DrawBitmapExp();這個(gè)函數(shù),這個(gè)函數(shù)有多達(dá)十個(gè)參數(shù)。void GUI_DrawBitmapExp(int x0,int y0,/顯示位圖的起始座標(biāo)(指的是在LCD上的位置)int XSize,int YSize,/這個(gè)兩參數(shù)的含義是在待顯示的位圖中選取一個(gè)XSize*YSiz

49、e大小的范圍來(lái)顯示,從0,0座標(biāo)開(kāi)始。取值范圍1255 int XMul,int YMul,/比例因數(shù),即放大比率!議會(huì)就能看到這個(gè)參數(shù)的效果int BitsPerPixel,&n bsp;/位圖的每個(gè)象素的位數(shù),可以在bm3這個(gè)結(jié)構(gòu)體中找到int BytesPerLine,/待顯示位圖每行的字節(jié)數(shù),可以在bm3這個(gè)結(jié)構(gòu)體中找到const U8*pData,/指向位圖,實(shí)際存儲(chǔ)數(shù)據(jù)變量的指針。const GUI_LOGPALETTE*pPal);/指向GUI_LOGPALETTE數(shù)據(jù)結(jié)構(gòu)的指針GUI_Clear();GUI_Delay(1000);GUI_DrawBitmapExp(10,10

50、,255,255,1,1,bm3.BitsPerPixel,bm3.BytesPerLine,&ac3,&Pal3);/看看這段代碼的含義,特別注意pData的取值是指向ac3的指針這句的效果GUI_Delay(5000);GUI_DrawBitmapExp(10,10,255,255,2,2,bm3.BitsPerPixel,bm3.BytesPerLine,&ac3,&Pal3);這句的效果,圖片被放大了!GUI_Delay(5000);GUI_Clear();GUI_DrawBitmapMag(&bm3,10,10,2,2);GUI_Delay(5000);也是放大顯示一個(gè)圖像!效果和上

51、面的是一樣的。沒(méi)有什么區(qū)別。下來(lái)在演示一個(gè)polygons的例子。static const GUI_POINT _aPointArrow=0,0,-40,-30,-10,-20,-10,-70,10,-70,10,-20,40,-30,;/定義一個(gè)多變性所有的頂點(diǎn)GUI_Clear();GUI_SetColor(GUI_BLUE);GUI_FillPolygon(&_aPointArrow0,7,260,180);/填充顏色GUI_DrawPolygon(&_aPointStar,7,460,200);僅有邊框/7表著個(gè)要Fill的多變性有幾個(gè)頂點(diǎn)GUI_Delay(5000);效果如圖:今天

52、用到的main函數(shù)。今天就到此為止!明天繼續(xù)!有興趣的朋友還請(qǐng)關(guān)注。-uC/GUI NIOS II移植之Window Manager(窗口管理器)昨天太晚了沒(méi)有時(shí)間更新了。今天繼續(xù)。今天來(lái)看看Window manager,窗口管理器。先來(lái)看一個(gè)小例子。#define MSG_CHANGE_TEXT WM_USER+0#ifndef NULL#define NULL 0#endif typedef structint x;int y;int xHere,yHere;const GUI_BITMAP*pBitmap;tDrawContext;extern GUI_FLASH const GUI_F

53、ONT GUI_FontHZ_FangSong_GB2312_14;extern GUI_FLASH const GUI_FONT GUI_FontHZ_Times_New_Roman_14;extern GUI_FLASH const GUI_FONT GUI_Font8x10_ASCII;extern GUI_FLASH const GUI_FONT GUI_Font32_ASCII;extern GUI_FLASH const GUI_FONT GUI_Font32B_ASCII;extern const GUI_BITMAP bm3;extern const GUI_LOGPALETT

54、E Pal3;extern const unsigned char ac3;extern const GUI_BITMAP bm3_compressed_with_palette;extern const GUI_BITMAP bmmap;/*以上全部是外部變量聲明,有位圖,有字體*/static WM_CALLBACK*_cbBkWindowOld;/*聲明背景窗口的回調(diào)函數(shù)(Call back function),后面會(huì)具體說(shuō)明這個(gè)Call back是干什么的*/static char _acInfoText40;/*要在背景窗口中顯示的文字*/static WM_HWIN _hWindo

55、w2;/*窗口2*/static void _cbWindow2(WM_MESSAGE*pMsg)/*窗口2的call back*/int x,y;switch(pMsg-MsgId)/*pMsg這個(gè)參數(shù)用來(lái)告訴這個(gè)回調(diào)函數(shù)發(fā)生了什么事件的!這里列出了系統(tǒng)已經(jīng)定義好的所有的事件*/case WM_CREATE:/*to do add code here*/break;case WM_DELETE:/*to do add code here*/break;case WM_HIDE:/*to do add code here*/break;case WM_MOVE:/*to do add code here*/break;case WM_NOTIFY_PARENT:/*to do add code here*/break;case WM_PAINT:/*這個(gè)Paint事件,準(zhǔn)確地翻譯我不知道,但他的功能主要就是自動(dòng)重繪窗口,這十分重要,有了自動(dòng)重繪你只要在這個(gè)CB里面告訴GUI你想繪什么東西就行了,GUI會(huì)自動(dòng)在適當(dāng)?shù)臅r(shí)機(jī)重繪*/GUI_SetBkColor(GUI_RED);GUI_Clear();GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_Font24_ASCII);x=WM_GetWindowSiz

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論