歡迎您光臨本站 登入註冊首頁

基於uC/GUI的數據顯示系統的設計

admin @ 2014-03-25 , reply:0

概述

   uC/GUI是Micrigm公司推出的用於嵌入式系統的圖形用戶介面(graphicsuserinterface,GUI)軟體包,由於uC/GUI完全以ANSI-C編……

    uC/GUI是Micrigm 公司推出的用於嵌入式系統的圖形用戶介面(graphics user interface,GUI)軟體包,由於uC/GUI完全以ANSI-C編寫,因此它與處理器無關,可以很方便地移植到不同的操作系統和嵌入式微處理器上,並可支持不同尺寸的圖形液晶顯示器。它採用層次化的設計,功能強大,移植方便,被廣泛地應用於嵌入式領域,如PDA、機頂盒以及DVD NCD播放機等。本文詳細介紹了uC/GUI在ARM 內核S3C44B0X的移植。實踐證明uC/GUI具有良好的實時性和穩定性以及廣泛的應用前景。

1 硬體連接與液晶顯示原理
    本設計使用的硬體採用ARM7開發板,液晶模塊為L78C64,它是7.8in 256色STN型LCD顯示屏,解析度為640×480。
    LCD控制器外部介面信號的定義及其與LCD模塊各信號之間的對應關係如下:
    (1)VFRAME:LCD控制器與LCD驅動器之間的幀同步信號。該信號負責指出LCD屏新的一幀開始的時間。LCD控制器在一個完整幀顯示完成後立即插入一個VFRAME信號,並開始新一幀的顯示。該信號與LCD模塊的YD信號相對應;
    (2)VLINE:LCD控制器和LCD驅動器之間的線同步脈衝信號。該信號用於將LCD驅動器水平線(行)移位寄存器的內容傳送給LCD屏顯示。LCD控制器在整個水平線(整行)數據移入LCD控制器后,插入一個VLINE信號。該信號與LCD模塊的LP信號相對應;
    (3)VCLK:LCD控制器和LCD驅動器之間的像素時鐘信號。由LCD控制器送出的數據在VCLK的上升沿處送出,在VCLK的下降沿被LCD驅動器採樣。該信號與LCD模塊的XCK信號相對應;
    (4)VM:LCD驅動器的AC信號。VM信號被LCD驅動器用於改變行和列的電壓極性,從而控制像素點的顯示和熄滅。VM信號可以與每個幀同步,也可以與可變數量的VLINE信號同步;
    (5)VD3~0 LCD:像素點的數據輸入埠。與LCD模塊的D3~0相對應:
    (6)VD7~4 LCD:像素點的數據輸入埠。與LCD模塊的D7~4相對應。
    液晶顯示原理:寫滿整個屏的數據稱為1個“幀”數據,YD是幀同步信號,該信號啟動LCD屏的新一幀數據。兩個YD脈衝之間的時間長度稱為幀周期。根據LCD模塊的特性,刷新時間為12~14ms,頻率為70~80Hz。每一幀包括480個LP脈衝。LP為行(共480行)數據輸入鎖存信號,也就是行同步脈衝信號。該信號啟動LCD屏的新一行數據。XCK為行數據輸入信號,也就是每1行中像素點數據傳輸的時鐘信號。每組8位的數據在XCK的下降沿被輸入鎖存,因此,每1行包括640×3/8個XCK脈衝信號。D0~D7是8位的顯示數據輸入信號。

2 驅動程序設計
   下面分三步完成液晶的初始化。
(1)I/O口的初始化
   由於採用S3C44B0X的PC介面和PD介面作為LCD驅動介面,因此,需要設置PC介面工作在第3功能狀態和PD介面工作在第2功能狀態。
(2)相應控制寄存器的設置方法
    S3C44B0X包括一個LCD控制器時序發生器TIMEGEN, 由它來產生VFRAM,VLINE,VCLK和VM 控制時序。這些控制信號由寄存器LCOCON1和LCDCON2進行配置。通過對寄存器種配置項目的設置,TIMEGEN就可以產生適應於各種LCD屏的控制信號了。
    VFRAM 和VLINE脈衝的產生是通過對LCDCON2寄存器的HOZVAL和LINEVAL進行配置來完成的。每個域都與LCD的尺寸和顯示模式有關。
    其中,HOZVAL=(顯示寬度/VD數據線位數)-1。
    在彩色模式下,顯示寬度=3×每行的像素點數。
    對所選的液晶模塊,HOZVAL=(640×3/8)-1;LINEVAL=(顯示寬度)-1。
    對所選的液晶模塊,LlNEVAL=480-1。
    VCLK信號的頻率可以通過LCDCON1寄存器的CLKVAL域來確定,即
VCLK=MCLK/(CLKVAL×2)
    LCD控制器的最大VCLK頻率為16.5MHz,幾乎支持所有已有的LCD驅動器。由於上述關係,CLKVAL的值決定了VCLK的頻率。為了確定CLKVAL的值,應該計算一下LCD控制器向VD埠傳輸數據的速率,以便使VCLK的值大於數據傳輸的速率。
    數據傳輸速率的公式為:
    數據傳輸速率=HS×VS×FR×MV
    其中,HS—LCD的行像素值;VS—LCD的列像素值:FR—幀速率;MV—模式值,這裡取8位單掃描,彩色。
    對於所選用的液晶模塊:HS=640;VS=480;FR=70Hz:MV=3/8。因此,數據傳輸速率=640×480×70×3/8=8,064,000Hz。
    VCLK值應該大於8MHz而小於16MHz,因此,CLKVAL可以取9~15。
(3)完整的液晶初始化程序
void LCD_Init_Controler()
{rLCDCON1=(0)|(2<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_COLOR<<12);
//disable,8B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=
(LINEVAL)|(HOZVAL_COLOR<<10)|(10<<21);
//LINEBLANK=10(without any calculation)
rLCDSADDR1= (0x3<<27) | (((U32)
frameBuffer256>>22)<<21)|
M5D((U32)frameBuffer256>>1);
//256-color,LCDBANK,LCDBASEU
rLCDSADDR2=M5D((((U32)frameBuffer256+(SCR_XSIZE*LCD_YSIZE))>>1))|(MVAL<<21);
rLCDSADDR3= (LCD_XSIZE/2) | (((SCR_XSIZE-LCD_XSIZE)/2)<<9);
//The following value has to be changed forbetter display.
rREDLUT =0xfdb96420;
rGREENLUT=0xfdb96420;
rBLUELUT=0xfb40;
rDITHMODE=0x0;
rDP1_2=0xa5a5;
rDP4_7=0xba5da65;
rDP3_5=0xa5a5f;
rDP2_3=0xd6b;
rDP5_7=0xeb7b5ed:
rDP3_4=0x7dbe;
rDP4_5=0x7ebdf;
rDP6_7=0x7fdfbfe;
rLCDCON1= (1)|(2<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(4<<12);
經過以上幾步,就完成了液晶的硬體驅動,下面就是移植軟體包,調用底層驅動,完成複雜的顯示任務。

3 uC/GUI軟體包的移植
3.1 uC/GUI特點
(1)支持任何8位、16位和32位的CPU,只要求CPU具有相應的ANSI-C編譯器即可;
(2)所有硬體介面定義都使用可配置的宏;
(3)字元、點陣圖可顯示與LCD的任意點,並不限制與位元組長度的整數倍數地址;
(4)所有程序在長度和速度方面都進行了優化,結構清晰;
(5)對於慢速的LCD控制器,可以使用緩衝存儲器減少訪問時間,提高顯示速度。
3.2 uC/GUl移植步驟
在使用uC/GUI時,可以按照以下幾個步驟來進行:
(1)按照需要,定製uC/GUI;
(2)指定硬體設備的地址,編寫介面驅動代碼;
(3)編譯、鏈接、調試例子程序;
(4)修改例子程序,並測試增加需要的功能;
(5)編寫自己的應用程序。
3.3 具體實現
(1)首先介紹uC/GUI的目錄結構和基本配置。
uC/GUI主要目錄如下:
GUI/ConvertMono 使用黑白顯示設備時,所要使用的灰度轉換函數
GUI/ConvertColor 使用彩色顯示設備時,使用的色彩轉換函數
GUI/Config 包含了對uC/GUI進行配置的一些文件
GUI/Core uC/GUI核心代碼
GUI/Font uC/GUI與字體相關的代碼文件
GUI/LCDDriver LCD驅動代碼文件
GUI/MemDev 內存設備支持文件代碼
GUI/Touch 輸入設備支持的文件代碼
GUI/Widget uC/GU1支持的控制項代碼,包括編輯框、列表框、按鈕和選擇框等
GUI/WM uC/GUI窗口管理部分代碼
(2)修改uC/GUI,使之適於移植。
    在ADS環境中新建一個工程,將上述gui文件夾下的所有文件加入工程。
    將Config文件夾下的3個文件GUIConf.h、
GUITouchConf.h和LCDConf.h加入新工程,如下修改LCDConf.h的內容:
/*LCDConf.h*/
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCDG4 //lcd顏色數,必須定義,LCDMONO(單色),LCDG4(四級灰度),LCDG16(16級灰度)
#define LCD_XSIZE(640)/* LCD水平解析度 */
#define LCD_YSIZE(480)/* LCD垂直解析度 */
#define LCD BITSPERPIXEL(8)
#endif /*LCDC0NF_H*/
/*以下是S3C44B0X LCD控制器的配置*/
#include "..incoption.h"
#define SCR_XSIZE (640)//視窗屏幕大小
#define SCR_YSIZE (480)
#define LCD_XSIZE (640)//液晶屏幕大小
#define LCD_YSIZE (480)
#define M5D(n)((n)&0x1fffff)
#define ARRAY_SIZE_G4(SCR_XSIZE/4*SCR_YSIZE)
#define HOZVAL (LCD_XSIZE/4-1)
#define HOZVAL_COLOR (LCD_XSIZE*3/8-1)
#define LINEVAL (LCD_YSIZE-1)
#define MVAL (13)
#define CLKVAL_G4 (10)
#define MVAL_USED 0
#endif /*LCDCONF_H */
(3)載入LCD驅動。
    LCD驅動程序如前面所述,保存在lcd44b0.c中。出了底層的初始化函數LCD_Init_Controler()以外,還需要做以下修改,這裡只提關鍵部分。
    主要進行相關的寄存器配置,以及和GUI的介面程序。這裡只提及關鍵部分。
① 定義顯示緩衝區時使用的char數據類型,它是8bit的:
unsigned char Bmp[ARRAY_SIZE_G16];//液晶顯示緩衝數組
② 定義讀寫緩衝區時使用的數據類型,也是8bit的U8:
#define LCD_READ_MEM (Off)*((U8*)(frame
Buffer256+(((U32)(Off)))))
#define LCD_WRRITE_MEM(Off,data)*((U8*)frameBuffer256+(((U32)(Off)))))=data
#define LCD_WRITE_REG(Off,data)
⑧ 定義液晶匯流排寬度定義位8bit:
#ifndef LCD_BUSWIDTH
#define LCD_BUSWIDTH(8)
#endif
④ 定義位元組順序:
#define LCD_SWAP_BYTE_ORDER(0)
    至此uC/GUI的移植基本上已經完成了。當然這裡只提供了移植的關鍵部分,更多更完整的移植還需要做不少的工作,如觸控屏的移植、鍵盤滑鼠的移植以及中文字體的移植等。詳情請參閱uC/GUI手冊中Getting Started一章。

4 數據顯示程序設計
    數據顯示程序主要是基於uC/GUI平台的GUI函數庫,完成字元、曲線的繪製。與畫線相關的GUI函數有:
GUI DrawHLine()
原型:void GUI_DrawLine(int x0,int y0,int x1,int y1);
其中,x0、y0、x1、y1分別為UGI坐標系下的起點和終點的橫坐標和縱坐標。
GUI DispDec()
原型:void GUI_DispDec(I32 v,U8 Len);
其中,v為要顯示的十進位變數值,Len為要顯示的數據的位數。

5 總結
    本文主要介紹了基於ARM7內核S3C44B0X和L78C64液晶模塊硬體平台的uC/GUI的移植,以及在工程上的應用,經過實際應用發現,uC/GUI功能強大,響應迅速,穩定性高,具有廣泛的應用前景。


[admin via 研發互助社區 ] 基於uC/GUI的數據顯示系統的設計已經有2996次圍觀

http://cocdig.com/docs/show-post-42083.html