《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > μC/GUI T6963C LCD控制器驅(qū)動(dòng)移植及矢量漢字顯示
μC/GUI T6963C LCD控制器驅(qū)動(dòng)移植及矢量漢字顯示
嚴(yán)龍軍1,熊文卓2
摘要: 介紹了Micrium公司開發(fā)的一個(gè)為嵌入式應(yīng)用軟件設(shè)計(jì)的通用圖形軟件庫μC/GUI,提出了在μC/GUI中T6963C LCD控制器驅(qū)動(dòng)移植及矢量漢字顯示的實(shí)現(xiàn)方法。該方法為μC/GUI的其他LCD控制器驅(qū)動(dòng)移植及字庫實(shí)現(xiàn)提供了參考,同時(shí)為利用μC/GUI實(shí)現(xiàn)更為復(fù)雜的圖形用戶界面打下了基礎(chǔ)。
Abstract:
Key words :

  摘 要:介紹了Micrium公司開發(fā)的一個(gè)為嵌入式應(yīng)用軟件設(shè)計(jì)的通用圖形軟件庫μC/GUI,提出了在μC/GUI中T6963C LCD控制器驅(qū)動(dòng)移植及矢量漢字顯示的實(shí)現(xiàn)方法。該方法為μC/GUI的其他LCD控制器驅(qū)動(dòng)移植及字庫實(shí)現(xiàn)提供了參考,同時(shí)為利用μC/GUI實(shí)現(xiàn)更為復(fù)雜的圖形用戶界面打下了基礎(chǔ)。
  關(guān)鍵詞:圖形用戶界面;矢量漢字;液晶控制器

   在眾多嵌入式系統(tǒng)中,如手機(jī)、PDA和數(shù)字機(jī)頂盒(STB)等,系統(tǒng)使用者往往要求具有菜單、窗口和按鈕等圖形元素的人機(jī)交互界面UI(User Interface),而系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)者又迫切需要系統(tǒng)UI模塊開發(fā)的支撐平臺(tái)。該支撐平臺(tái)以應(yīng)用開發(fā)組件(Application Development Component)的方式來有效提高嵌入式應(yīng)用的開發(fā)效率,這種組件被稱為嵌入式圖形用戶界面(GUI)。
  當(dāng)前比較流行的GUI主要有MicroWindows、MiniGUI、QT/Embedded、OpenGUI等,普遍采用客戶/服務(wù)器結(jié)構(gòu)、多線程概念,主要用于嵌入式Linux系統(tǒng)中。本文介紹的μC/GUI是Micrium公司開發(fā)的一個(gè)為嵌入式應(yīng)用軟件設(shè)計(jì)的通用圖形軟件庫。它為任何一個(gè)使用圖形LCD的應(yīng)用提供一個(gè)有效的不依賴于處理器和LCD控制器的圖形用戶接口。它能工作于單任務(wù)或多任務(wù)的系統(tǒng)環(huán)境下。μC/GUI適用于使用任何LCD控制器和CPU的任何尺寸的物理和虛擬顯示。同時(shí),μC/GUI適用于所有的CPU,因?yàn)樗怯?00%的ANSI的C語言編寫的。而且,μC/GUI適合于大多數(shù)使用黑白/彩色LCD的應(yīng)用程序。它有一個(gè)很好的顏色管理器,允許它處理灰階。μC/GUI還提供一個(gè)可擴(kuò)展的2D圖形庫和一個(gè)視窗管理器,用很少的RAM就能支持顯示窗口。更重要的是μC/GUI開放源代碼,以便了解更多GUI實(shí)現(xiàn)的具體細(xì)節(jié)。
1 μC/GUI的主要特點(diǎn)
  (1)一般特點(diǎn):適合于任何8/16/32/64位CPU,只需要有一個(gè)ANSIC兼容的編譯器;適合于任何控制器支持(如果有合適的驅(qū)動(dòng)程序)的任何單色/灰度級(jí)/彩色LCD;顯示屏大小可配置;使用配置宏定義各種接口;大小和速度都優(yōu)化過的函數(shù);清晰的結(jié)構(gòu);支持虛擬顯示,虛擬顯示能夠比實(shí)際顯示表現(xiàn)更大尺寸的內(nèi)容。
  (2)在圖形庫方面:支持不同色深的位圖;有效的位圖轉(zhuǎn)換器;絕對(duì)沒有浮點(diǎn)運(yùn)算;快速線/點(diǎn)繪制(不使用浮點(diǎn)指令);快速的圓和多邊形繪制。
  (3)在字體方面:支持多種不同的字體如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軸)都可以自由伸縮。
  (4)在字符串/值輸出函數(shù)方面:具有能夠顯示二進(jìn)制、十進(jìn)制、十六進(jìn)制和任何字體的值的函數(shù)。
  (5)在窗口管理器WM方面:包括可裁減的完全的窗口支持,改寫超出一個(gè)窗口的區(qū)域是不可行的;支持回調(diào)函數(shù);WM使用極少的內(nèi)存,例如每個(gè)窗口大約20 B。
2 T6963C LCD控制器驅(qū)動(dòng)移植
  作為一個(gè)通用的圖形函數(shù)軟件庫,μC/GUI能夠適用于各種LCD控制器和LCD,但是,針對(duì)具體的目標(biāo)系統(tǒng),由于LCD及其控制器的訪問方式不同,以及顯示緩存的訪問方式不同,還是要做具體的移植工作。對(duì)于內(nèi)存映射的LCD控制器,只需要在LCDConf.h文件中設(shè)置LCD的訪問函數(shù);對(duì)于端口/緩存模式的LCD控制器,必須在LCD_X.C文件中定義訪問LCD的接口函數(shù)。μC/GUI的移植主要是設(shè)置子文件夾config中的頭文件,其中包括LCD宏(定義LCD顯示屏的屬性)和LCD控制器宏的設(shè)置(定義如何訪問LCD控制器)。
  LCD控制器有兩種基本類型的總線接口:完全和簡單的總線接口。大多數(shù)小一些的顯示屏(通常最大為240×128或320×240)的LCD控制器使用簡單總線接口與CPU連接。對(duì)于簡單總線,只有一個(gè)地址位(通常是A0)連接到LCD控制器。這樣的控制器比較慢,硬件設(shè)計(jì)者可以將其連接到I/O腳而不是地址總線。圖1為帶有簡單總線的LCD控制器的方框圖。

  用于簡單總線接口控制器的宏:
  (1)LCD_READ_A0在A0(C/D)引腳為低電平時(shí),從LCD控制器讀取1B;
  (2)LCD_READ_A1在A0(C/D)引腳為高電平時(shí),從LCD控制器讀取1B;
  (3)LCD_WRITE_A0在A0(C/D)引腳為低電平時(shí),向LCD控制器寫1B;
  (4)LCD_WRITE_A1 在A0(C/D)引腳為高電平時(shí),向LCD控制器寫1B。
  液晶顯示驅(qū)動(dòng)控制器T6963C,是日本東芝公司的產(chǎn)品,目前被廣泛應(yīng)用于內(nèi)置控制器型液晶顯示模塊。T6963C的最大特點(diǎn)是具有獨(dú)特的硬件初始值設(shè)置功能,顯示驅(qū)動(dòng)所需的參數(shù)如占空比系數(shù)、驅(qū)動(dòng)傳輸?shù)淖止?jié)數(shù)/行及字符的字體選擇等均有引腳電平設(shè)置,這樣T6963C的初始化在上電時(shí)就已經(jīng)基本設(shè)置完成,軟件操作的主要精力就可全部用于顯示畫面的設(shè)計(jì)。
  T6963C屬于具有簡單總線接口的LCD驅(qū)動(dòng)控制器。以Philips公司的LPC2104 ARM芯片為CPU控制T6963C為例來說明具體的移植過程。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寫一個(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寫一個(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為T6963C指令寫入的流程圖,對(duì)該流程圖的理解是通過CPU向T6963C發(fā)送指令的關(guān)鍵。當(dāng)計(jì)算機(jī)寫指令或一次讀/寫數(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)
  /*寫命令宏*/
  #define LCD_WRITECMD(cmd)     
  { LCD_WAIT(); LCD_WRITECMD0(cmd); }
  /*寫數(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) ;
  /*顯示開關(guān)設(shè)置開文本和圖形顯示*/
  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中字體的顯示是通過查找字模的方式實(shí)現(xiàn)的。字體庫中的每一個(gè)字母都有其對(duì)應(yīng)的字模。所有的字母的字模由GUI_FONT和GUI_FONT_PROP這2個(gè)結(jié)構(gòu)體來進(jìn)行統(tǒng)一管理。GUI_FONT結(jié)構(gòu)體中定義了該字母的點(diǎn)陣大小(比如16×16或者8×8)和GUI_FONT_PROP結(jié)構(gòu)體的入口地址。GUI_FONT_PROP這個(gè)結(jié)構(gòu)體建立了字庫中字母編碼(比如字母A在ASCII中的字母編碼為33)和字模數(shù)據(jù)存放地址的映像。GUI_FONT_PROP中pNext指針指向下一個(gè)GUI_FONT_PROP數(shù)據(jù)的入口地址,這為解決在字母編碼不連續(xù)的情況下,保證字模數(shù)據(jù)在程序段的存儲(chǔ)連續(xù)這一問題提供了一個(gè)良好的解決方案。設(shè)計(jì)人員可以定義多個(gè)GUI_FONT_PROP結(jié)構(gòu),只要使上一個(gè)結(jié)構(gòu)體的pNext指針指向下一個(gè)GUI_FONT_PROP結(jié)構(gòu)體,并且保證該指針最終指向零地址空間即可。掌握這一原理后,可以方便地制作自己的漢字字庫。
  利用μC/GUI漢字庫生成器可以生成指定字體矢量漢字的字模文件。該文件與μC/GUI字庫文件格式相同,但是該文件包含所有GB2312中的漢字,字號(hào)越大文件會(huì)變得很大,只需找出自己需要的漢字字模,并按μC/GUI中字體文件的格式得到自己的字體文件,這個(gè)過程可以編程實(shí)現(xiàn)。圖4是用Proteus仿真的結(jié)果。
本文通過對(duì)μC/GUI T6963C LCD控制器驅(qū)動(dòng)移植及μC/GUI中實(shí)現(xiàn)矢量漢字的介紹,為μC/GUI其他LCD控制器驅(qū)動(dòng)的移植提供了參考,同時(shí)也為利用μC/GUI實(shí)現(xiàn)更為復(fù)雜的圖形用戶界面打下了基礎(chǔ)。

 

 

參考文獻(xiàn)
[1] 王孝平.嵌入式GUI性能評(píng)測[D].四川:電子科技大學(xué),2007.
[2] 陳欽梧,張泉,周林峰.μC/GUI在博創(chuàng)ARM300-S上的移植[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(19):3697-3700.
[3] 張磊,江海河,儲(chǔ)焰南.基于μC/OS-II的嵌入式GUI研究與應(yīng)用[J].嵌入式操作系統(tǒng)應(yīng)用,2008,24(6-2):50-52.
[4] T6963C數(shù)據(jù)手冊(cè).日本東芝公司.
[5] μC/GUI user manual.Micrium Technologies Corporation.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。