μC/GUI T6963C LCD控制器驅(qū)動(dòng)移植及矢量漢字顯示的實(shí)現(xiàn)
出處:嚴(yán)龍軍1,熊文卓2 發(fā)布于:2011-08-23 17:59:17
圖形用戶(hù)界面或圖形用戶(hù)接口(Graphical User Interface,GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作環(huán)境用戶(hù)接口。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶(hù)來(lái)說(shuō)更為簡(jiǎn)便易用。GUI的廣泛應(yīng)用是當(dāng)今計(jì)算機(jī)發(fā)展的重大成就之一,它極大地方便了非用戶(hù)的使用人們從此不再需要死記硬背大量的命令,取而代之的是可用用通過(guò)窗口、菜單、按鍵等方式來(lái)方便地進(jìn)行操作。而嵌入式GUI具有下面幾個(gè)方面的基本要求:輕型、占用資源少、高性能、高可靠性、便于移植、可配置等特點(diǎn)。圖形用戶(hù)界面的應(yīng)用范圍很廣泛,如自動(dòng)取款機(jī)ATM,汽車(chē)導(dǎo)航、媒體播放器、游戲機(jī)等等,一般操作簡(jiǎn)捷,直觀。蘋(píng)果公司的iPhone手機(jī)還有裝有多手指操作系統(tǒng)。
當(dāng)前比較流行的GUI主要有MicroWindows、MiniGUI、QT/Embedded、OpenGUI等,普遍采用客戶(hù)/服務(wù)器結(jié)構(gòu)、多線程概念,主要用于嵌入式Linux系統(tǒng)中。本文介紹的μC/GUI是Micrium公司開(kāi)發(fā)的一個(gè)為嵌入式應(yīng)用軟件設(shè)計(jì)的通用圖形軟件庫(kù)。它為任何一個(gè)使用圖形LCD的應(yīng)用提供一個(gè)有效的不依賴(lài)于處理器和LCD控制器的圖形用戶(hù)接口。它能工作于單任務(wù)或多任務(wù)的系統(tǒng)環(huán)境下。μC/GUI是嵌入式應(yīng)用中通用的圖形軟件,是為帶LCD的圖形應(yīng)用系統(tǒng)提供高效的圖形用戶(hù)接口而設(shè)計(jì)的,它不依賴(lài)于處理器和LCD控制器。μC/GUI在多任務(wù)環(huán)境下工作與在單任務(wù)環(huán)境下工作性能同樣卓越,任何尺寸大小的顯示設(shè)備,不管是物理的或是虛擬的,只要具備LCD控制器和處理器,都可以運(yùn)用μC/GUI.μC/GUI產(chǎn)品包中包含有所有的源代碼。實(shí)際上,在所有的嵌入式圖形用戶(hù)接口中,μC/GUI提供的源代碼是整潔統(tǒng)一的。μC/GUI提供的所有服務(wù)都以該模塊相關(guān)的前綴開(kāi)始(如:GUI,WM),這將易于理解應(yīng)用程序中與μC/GUI相關(guān)的函數(shù)。μC/GUI適用于所有處理器,與那些需要C++編譯器的GUI不同的是,μC/GUI完全用標(biāo)準(zhǔn)C編寫(xiě)。
1 μC/GUI的主要特點(diǎn)
?。?)一般特點(diǎn):適合于任何8/16/32/64位CPU,只需要有一個(gè)ANSIC兼容的編譯器;適合于任何控制器支持(如果有合適的驅(qū)動(dòng)程序)的任何單色/灰度級(jí)/彩色LCD;顯示屏大小可配置;使用配置宏定義各種接口;大小和速度都優(yōu)化過(guò)的函數(shù);清晰的結(jié)構(gòu);支持虛擬顯示,虛擬顯示能夠比實(shí)際顯示表現(xiàn)更大尺寸的內(nèi)容。
?。?)在圖形庫(kù)方面:支持不同色深的位圖;有效的位圖轉(zhuǎn)換器;沒(méi)有浮點(diǎn)運(yùn)算;快速線/點(diǎn)繪制(不使用浮點(diǎn)指令);快速的圓和多邊形繪制。
?。?)在字體方面:支持多種不同的字體如4×6、6×8、6×9、8×8、8×9、8×16、24×32等,支持像素高為8、10、13、16等比例字體;可以定義新字體,而且很容易被程序使用;只有實(shí)際被應(yīng)用程序用到的字體才會(huì)真正被鏈接到目標(biāo)文件,這樣可以節(jié)省ROM的使用;字體在橫向(X軸)和縱向(Y軸)都可以自由伸縮。
?。?)在字符串/值輸出函數(shù)方面:具有能夠顯示二進(jìn)制、十進(jìn)制、十六進(jìn)制和任何字體的值的函數(shù)。
?。?)在窗口管理器WM方面:包括可裁減的完全的窗口支持,改寫(xiě)超出一個(gè)窗口的區(qū)域是不可行的;支持回調(diào)函數(shù);WM使用極少的內(nèi)存,例如每個(gè)窗口大約20 B.
2 T6963C LCD控制器驅(qū)動(dòng)移植
作為一個(gè)通用的圖形函數(shù)軟件庫(kù),μC/GUI能夠適用于各種LCD控制器和LCD,但是,針對(duì)具體的目標(biāo)系統(tǒng),由于LCD及其控制器的訪問(wèn)方式不同,以及顯示緩存的訪問(wèn)方式不同,還是要做具體的移植工作。對(duì)于內(nèi)存映射的LCD控制器,只需要在LCDConf.h文件中設(shè)置LCD的訪問(wèn)函數(shù);對(duì)于端口/緩存模式的LCD控制器,必須在LCD_X.C文件中定義訪問(wèn)LCD的接口函數(shù)。μC/GUI的移植主要是設(shè)置子文件夾config中的頭文件,其中包括LCD宏(定義LCD顯示屏的屬性)和LCD控制器宏的設(shè)置(定義如何訪問(wèn)LCD控制器)。
LCD控制器有兩種基本類(lèi)型的總線接口:完全和簡(jiǎn)單的總線接口。大多數(shù)小一些的顯示屏(通常為240×128或320×240)的LCD控制器使用簡(jiǎn)單總線接口與CPU連接。對(duì)于簡(jiǎn)單總線,只有一個(gè)地址位(通常是A0)連接到LCD控制器。這樣的控制器比較慢,硬件設(shè)計(jì)者可以將其連接到I/O腳而不是地址總線。圖1為帶有簡(jiǎn)單總線的LCD控制器的方框圖。
用于簡(jiǎn)單總線接口控制器的宏:
?。?)LCD_READ_A0在A0(C/D)引腳為低電平時(shí),從LCD控制器讀取1B;
?。?)LCD_READ_A1在A0(C/D)引腳為高電平時(shí),從LCD控制器讀取1B;
?。?)LCD_WRITE_A0在A0(C/D)引腳為低電平時(shí),向LCD控制器寫(xiě)1B;
?。?)LCD_WRITE_A1 在A0(C/D)引腳為高電平時(shí),向LCD控制器寫(xiě)1B.
在液晶顯示模塊中配備有顯示存儲(chǔ)器(RAM),T6963C可控制64K.該存儲(chǔ)器經(jīng)設(shè)置指令設(shè)置(區(qū)域、方式)后,存儲(chǔ)器中被設(shè)置的空間內(nèi)的每一個(gè)"位"都與液晶屏上的一個(gè)像素(點(diǎn))相對(duì)應(yīng),而"位"的二值性就表示液晶屏上像素是否"顯現(xiàn)".T6963C則將存儲(chǔ)器中設(shè)置區(qū)域的內(nèi)容不斷地、掃描式地送向液晶屏,用戶(hù)則通過(guò)顯示模塊對(duì)外的接口將需顯示的"數(shù)據(jù)" 送入存儲(chǔ)器中的設(shè)置區(qū)域即可。
T6963C屬于具有簡(jiǎn)單總線接口的LCD驅(qū)動(dòng)控制器。以Philips公司的LPC2104 ARM芯片為CPU控制T6963C為例來(lái)說(shuō)明具體的移植過(guò)程。LPC2104的P0.0~P0.7與T6963C的D0~D7相連,P0.8與WR相連,P0.9與RD相連,P0.10與C/D相連。根據(jù)T6963C的時(shí)序圖(如圖2所示),可以很方便地修改LCD底層驅(qū)動(dòng)函數(shù)。
#define wr 1《8
#define rd 1《9
#define cd 1《10
/*讀取T6963狀態(tài)字*/
uint8 LCD_READ_A1(void)
{
uint8 temp;
IODIR=0x000000700;
//設(shè)置P0.8~P0.10為輸出,P0.0~P0.7為輸入
IOSET=cd; //把C/D引腳置位
IOCLR=rd; //把RD引腳置低電平
temp=IOPIN; //讀數(shù)據(jù)總線上的數(shù)
IOSET=rd; //把RD引腳置位
return(temp);
}
/*向T6963C寫(xiě)一個(gè)字節(jié)(控制指令)*/
void LCD_WRITE_A1(int Byte)
{
IODIR=0x000007ff; //設(shè)置P0.0~P0.10為輸出
IOSET=cd; //把C/D引腳置位
IOCLR=0xff; //清除數(shù)據(jù)總線上數(shù)據(jù)
IOCLR=wr; //把WR引腳置低電平
IOSET=Byte; //把要發(fā)送的控制指令放數(shù)據(jù)總線上
IOSET=wr; //把WR引腳置位
}
/*向T6963C寫(xiě)一個(gè)字節(jié)(數(shù)據(jù))*/
void LCD_WRITE_A0(int Byte)
{
IODIR=0x000007ff; //設(shè)置P0.0~P0.10為輸出
IOCLR=cd; 把C/D引腳置低電平
IOCLR=0xff; //清除數(shù)據(jù)總線上數(shù)據(jù)
IOCLR=wr; //把WR引腳置低電平
IOSET=Byte; //把要發(fā)送的數(shù)據(jù)放數(shù)據(jù)總線上
IOSET=wr; //把WR引腳置位
}
圖3為T(mén)6963C指令寫(xiě)入的流程圖,對(duì)該流程圖的理解是通過(guò)CPU向T6963C發(fā)送指令的關(guān)鍵。當(dāng)計(jì)算機(jī)寫(xiě)指令或讀/寫(xiě)數(shù)據(jù)時(shí),S0和S1要同時(shí)有效,即"準(zhǔn)備好"狀態(tài)。對(duì)T6963C的軟件操作每之前都要進(jìn)行判"忙",只有在不"忙"的狀態(tài)下CPU對(duì)T6963C的操作才有效。
/*判定S0和S1的狀態(tài),"忙"即等待*/
#define LCD_WAIT() while ((LCD_READ_A1()&3)!=3)
/*寫(xiě)命令宏*/
#define LCD_WRITECMD(cmd)
{ LCD_WAIT(); LCD_WRITECMD0(cmd); }
/*寫(xiě)數(shù)據(jù)宏*/
#define LCD_WRITEDATA(Data)
{ LCD_WAIT(); LCD_WRITEDATA0(Data);}
/*T6963C初始化*/
void LCD_T6963_Init(void)
{
/*設(shè)置文本顯示區(qū)首地址*/
LCD_WRITEDATA(0x00) ; //參數(shù)1
LCD_WRITEDATA(0x00) ; //參數(shù)2
LCD_WRITECMD(0x40) ; //指令代碼
/*設(shè)置文本顯示區(qū)寬度*/
LCD_WRITEDATA(0x14) ; //一行顯示所占的字節(jié)數(shù)
LCD_WRITEDATA(0x00) ;
LCD_WRITECMD(0x41) ;
/*設(shè)置圖形顯示區(qū)首地址*/
LCD_WRITEDATA(0x40) ; //低字節(jié)
LCD_WRITEDATA(0x01) ; //高字節(jié)
LCD_WRITECMD(0x42) ;
/*設(shè)置圖形顯示區(qū)寬度*/
LCD_WRITEDATA(0x14) ; //一行顯示所占的字節(jié)數(shù)
LCD_WRITEDATA(0x00) ;
LCD_WRITECMD(0x43) ;
/*顯示開(kāi)關(guān)設(shè)置開(kāi)文本和圖形顯示*/
LCD_WRITECMD(0x9c) ;
/*顯示方式設(shè)置邏輯或合成*/
LCD_WRITECMD(0x80) ;
/*設(shè)置光標(biāo)顯示形狀*/
LCD_WRITECMD(0xa1) ;
}
在LCDConf.h中,可以根據(jù)實(shí)際情況更改設(shè)置,如:
#define LCD_XSIZE (160)
// LCD x坐標(biāo)方向的分辨率
#define LCD_YSIZE (128)
// LCD y坐標(biāo)方向的分辨率
#define LCD_CONTROLLER (6963)
//LCD控制器型號(hào)
#define LCD_BITSPERPIXEL (1)
//LCD每像素的位數(shù)
3 在μC/GUI中矢量漢字的顯示
μC/GUI中字體的顯示是通過(guò)查找字模的方式實(shí)現(xiàn)的。字體庫(kù)中的每一個(gè)字母都有其對(duì)應(yīng)的字模。所有的字母的字模由GUI_FONT和GUI_FONT_PROP這2個(gè)結(jié)構(gòu)體來(lái)進(jìn)行統(tǒng)一管理。GUI_FONT結(jié)構(gòu)體中定義了該字母的點(diǎn)陣大?。ū热?6×16或者8×8)和GUI_FONT_PROP結(jié)構(gòu)體的入口地址。GUI_FONT_PROP這個(gè)結(jié)構(gòu)體建立了字庫(kù)中字母編碼(比如字母A在ASCII中的字母編碼為33)和字模數(shù)據(jù)存放地址的映像。GUI_FONT_PROP中pNext指針指向下一個(gè)GUI_FONT_PROP數(shù)據(jù)的入口地址,這為解決在字母編碼不連續(xù)的情況下,保證字模數(shù)據(jù)在程序段的存儲(chǔ)連續(xù)這一問(wèn)題提供了一個(gè)良好的解決方案。設(shè)計(jì)人員可以定義多個(gè)GUI_FONT_PROP結(jié)構(gòu),只要使上一個(gè)結(jié)構(gòu)體的pNext指針指向下一個(gè)GUI_FONT_PROP結(jié)構(gòu)體,并且保證該指針終指向零地址空間即可。掌握這一原理后,可以方便地制作自己的漢字字庫(kù)。
利用μC/GUI漢字庫(kù)生成器可以生成指定字體矢量漢字的字模文件。該文件與μC/GUI字庫(kù)文件格式相同,但是該文件包含所有GB2312中的漢字,字號(hào)越大文件會(huì)變得很大,只需找出自己需要的漢字字模,并按μC/GUI中字體文件的格式得到自己的字體文件,這個(gè)過(guò)程可以編程實(shí)現(xiàn)。圖4是用Proteus仿真的結(jié)果。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類(lèi)作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 什么是氫氧燃料電池,氫氧燃料電池的知識(shí)介紹2025/8/29 16:58:56
- SQL核心知識(shí)點(diǎn)總結(jié)2025/8/11 16:51:36
- 等電位端子箱是什么_等電位端子箱的作用2025/8/1 11:36:41
- 基于PID控制和重復(fù)控制的復(fù)合控制策略2025/7/29 16:58:24
- 什么是樹(shù)莓派?一文快速了解樹(shù)莓派基礎(chǔ)知識(shí)2025/6/18 16:30:52
- 編碼器的工作原理及作用1
- 超強(qiáng)整理!PCB設(shè)計(jì)之電流與線寬的關(guān)系2
- 三星(SAMSUNG)貼片電容規(guī)格對(duì)照表3
- 電腦藍(lán)屏代碼大全4
- 國(guó)標(biāo)委發(fā)布《電動(dòng)汽車(chē)安全要求第3部分:人員觸電防護(hù)》第1號(hào)修改單5
- 通俗易懂談上拉電阻與下拉電阻6
- 繼電器的工作原理以及驅(qū)動(dòng)電路7
- 電容單位8
- 跟我學(xué)51單片機(jī)(三):?jiǎn)纹瑱C(jī)串口通信實(shí)例9
- 一種三極管開(kāi)關(guān)電路設(shè)計(jì)10









