<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 光電顯示 > 設(shè)計應(yīng)用 > 液晶顯示在嵌入式系統(tǒng)中的應(yīng)用

          液晶顯示在嵌入式系統(tǒng)中的應(yīng)用

          作者: 時間:2004-12-08 來源:網(wǎng)絡(luò) 收藏
          摘要:介紹了在嵌入中的編程,給出了在接口的層編程中,采用環(huán)形結(jié)構(gòu)算法來達(dá)到快速、簡單地進(jìn)行漢字代碼的編碼以及漢字的分頁和分行顯示的顯示程序。

          關(guān)鍵詞:;環(huán)形結(jié)構(gòu)算法;漢字顯示

          1 引言

          在嵌入系統(tǒng)中,一個良好的人機(jī)界面必須提供友善的菜單,同時應(yīng)能實(shí)現(xiàn)漢字和圖形顯示,并應(yīng)提供英文、數(shù)字輸入和漢字輸入功能。筆者采用香港精電公司的12864點(diǎn)陣顯示模塊在以MPC860作為主CPU并以Nuclus PLUS為操作系統(tǒng)的系統(tǒng)中進(jìn)行液晶顯示?取得了較為滿意的效果。圖1所示為其結(jié)構(gòu)框圖。

          香港精電公司的12864點(diǎn)陣模塊內(nèi)部自帶液晶圖形顯示控制芯片T6963,其中C/D腳用于控制字與數(shù)據(jù),RD和WR分別為讀、寫使能端。當(dāng)WR為低時,C/D為高為寫命令,C/D為低為寫數(shù)據(jù);而當(dāng)RD為低時,C/D為高為讀狀態(tài)?C/D為低為讀數(shù)據(jù)。另外,CE為器件使能引腳,D0~D7為數(shù)據(jù)和地址復(fù)用總線引腳。

          2 應(yīng)用編程

          利用MPC860系統(tǒng)的快速性,可將顯示應(yīng)用程序分為兩層,其中底層為硬件接口層,上層為應(yīng)用層。硬件接口層主要是顯示液晶模塊自帶的ASCII函數(shù)和顯示漢字代碼函數(shù)。由于硬件各不相同,在此不作具體介紹。而上層應(yīng)用層的主要功能是提供友善的菜單,同時實(shí)現(xiàn)漢字和圖形顯示,并提供英文、數(shù)字輸入和漢字輸入功能。由于硬件接口層的隔離作用,不同的系統(tǒng)具有一定的通用性,以下重點(diǎn)介紹應(yīng)用層編程中的漢字代碼編碼方法和顯示編程的實(shí)現(xiàn)這兩部分。

          2.1 漢字代碼編碼

          一般西文為88點(diǎn)陣,因而顯示一個西文字需要8個字節(jié)?而每個漢字占4個西文字體,因此顯示一個漢字需要32個字節(jié)。漢字字庫表為一張數(shù)據(jù)表? 每個漢字在數(shù)據(jù)表中,通常由32個字節(jié)組成一個點(diǎn)陣圖形。由于ASCII碼編碼是由0X00-0X7F表示,因此?每個漢字可由兩個字節(jié)0Xxx和0Xyy來表示,每個字節(jié)為0X80~0XFF(區(qū)別于ASCII代碼)。第一漢字定義為0X80 0X80,依此類推直至0X80 0XFF ,0X81 0X80,……,……,0XFF 0XFF ,總計可以定義128128=16384個漢字。

          一個漢字代碼表可簡單表示為:

          hz code table?INT?=?

          //漢字“數(shù)”的32字節(jié)的點(diǎn)陣圖形代碼為?

          0x08?0x49?0x2A?0x08?0xFF?0x19?0x2C?0x4A?

          0x10?0xFE?0x22?0x22?0x14?0x18?0x25?0x42?

          0x40?0x40?0x40?0x84?0xFE?0x08?0x88?0x88?

          0x88?0x90?0x50?0x20?0x50?0x88?0x0E?0x04?

          //漢字“據(jù)”的32字節(jié)的點(diǎn)陣圖形代碼為?

          0x10?0x13?0x12?0x12?0xFF?0x12?0x16?0x1B?

          0x32?0xD2?0x13?0x15?0x15?0x15?0x59?0x21?

          0x04?0xFE?0x04?0x04?0xFC?0x20?0x24?0xFE?

          0x20?0x24?0xFE?0x04?0x04?0x04?0xFC?0x04,

          }

          2.2 顯示編程

          在系統(tǒng)顯示中,主要的顯示方式有頁處理和行處理兩種。系統(tǒng)可以根據(jù)按鍵來顯示某一頁。實(shí)際上,頁也是由相應(yīng)行來顯示的。頁中的行可由按鍵來改變。一個頁能顯示8行ASCII碼或4行漢字代碼,帶有漢字的行一般要占有2個只有ASCII碼的行,而頁可以由任意多行組成。顯示時,通過按鍵可控制能顯示行,并可在行中輸入漢字或ASCII碼。

          在設(shè)計中,所有的頁可組成一個環(huán)形隊列結(jié)構(gòu),頁中的行也可組成一個環(huán)形隊列結(jié)構(gòu),其關(guān)系如圖2所示。圖3所示是該系統(tǒng)的顯示流程。

          下面給出一個行結(jié)構(gòu):

          typedef struct lcdLine

          {

          struct lcdLine *previous? //前一行

          struct lcdLine *next? //后一行

          unsigned short lineId? //行特征字

          unsigned char showflag? //是否顯示漢字

          unsigned char start? //顯示行號 ,漢字一

          定是奇數(shù)行如 1,3,5,7

          unsigned char lcdseg?16??

          //顯示的代碼如是ASCII碼,0X10顯示0,

          0X3C顯示\ ?漢字為0X80 0X81 顯示漢字“據(jù)”

          void ?*flcdLine??struct lcdLine * plcdLine??

          //處理行函數(shù)

          };

          由于頁是由行組成的,所以頁結(jié)構(gòu)的定義如下:

          typedef struct lcdPage

          {

          struct lcdLine *firstLine? //該頁中的第一行

          struct lcdPage *previous? //前一頁

          struct lcdPage *next? //后一頁

          unsigned short pageId? //頁特征字

          } lcdPage?

          下面給出的是一個環(huán)行隊列函數(shù)的程序代碼:

          VOID CSC Place On List?CS NODE **head? CS NODE *new node?

          {

          /* Determine if the list in non-empty. */

          if ?*head?

          {

          /* The list is not empty. Add the new

          node to the end of the list. */

          new node->cs previous=?*head?

          ->cs previous?

          (new node ->cs previous)->cs

          next=new node?

          new node-> cs next =?*head??

          (new node->cs next)->cs previous

          =new node;

          }?

          else

          {

          /* The list is empty? setup the head and

          the new node. */

          ?*head? = new node?

          new node -> cs previous = new node?

          new node -> cs next = new node?

          }

          }

          在建立了上述結(jié)構(gòu)后,便可以得出行隊列和頁隊列的組成方法:

          lcdLine lcdLine?30??

          lcdPage lcdPage?10?; //初始化列

          lcdLine?0?..lcdseg?0?=0x80?

          lcdLine?0?..lcdseg?1?=0x80?

          lcdLine?0?..lcdseg?2?=0x80?

          lcdLine?0?..lcdseg?3?=0xBC?

          lcdLine?0?..lcdseg?4?=0x80?

          lcdLine?0?..lcdseg?5?=0x97?

          lcdLine?0?..lcdseg?6?=0x80?

          lcdLine?0?..lcdseg?7?=0x98?

          lcdLine?0?..lcdseg?8?=0x80?

          lcdLine?0?..lcdseg?9?=0x99?

          lcdLine?0?..lcdseg?10?=0x00?

          lcdLine?0?..lcdseg?11?=0x00?

          lcdLine?0?..lcdseg?12?=0x00?

          lcdLine?0?..lcdseg?13?=0x00?

          lcdLine?0?..lcdseg?14?=0x00?

          lcdLine?0?..lcdseg?15?=0x00?

          lcdLine?0?..start =1? //第二行起

          lcdLine?0?..showflag =1? //漢字

          lcdLine?0?.lineId =1001; //行標(biāo)識

          ?firstlcdLine 1?=NULL?

          CSC Place On List ?&firstlcdLine 1? &lcdLine?0??? //第一頁中的第一行

          CSC Place On List?&firstlcdLine 1?&lcdLine?1???

          CSC Place On List ?&firstlcdLine 1? &lcdLine?2???

          CSC Place On List ?&firstlcdLine 1? &lcdLine?3???由于四行即可組成一個循環(huán)隊列,其中lcdLine?0?指定為第一頁的第一個入口行,FirstlcdLine 1與lcdLine為同一行,lcdPage?0?頁的入口行為firstlcd-Line;lcdPage?0?.firstLine=firstlcdLine 1?lcdPage?0?.pageID =1001,這樣,依據(jù)該方法便可以生成任意多的頁。具體方法如下:

          lcdpage 1=NULL?

          lcdPage Place On List?&lcdpage 1? &lcdpage?0???

          lcdPage Place On List?&lcdpage 1? &lcdpage?1???

          lcdPage Place On List?&lcdpage 1? &lcdpage?2???

          lcdPage Place On List?&lcdpage 1? &lcdpage?3???

          lcdPage Place On List?&lcdpage 1? &lcdpage?4???

          lcdPage Place On List?&lcdpage 1? &lcdpage?5???

          這樣,用五頁即可組成一個循環(huán)隊列,其中lcd-page_1與lcdpage?0?為同一頁。

          對于行的顯示,最基礎(chǔ)的行顯示方法如下:

          void disp lcd Line?lcdMenu *lcdm?unsigned char start? //START為行號

          {

          unsigned char i?loop?

          unsigned char zt?zt1?

          unsigned char sign?

          unsigned char offset?

          unsigned char offlen?

          unsigned char *phz?

          unsigned char z0?

          phz=?unsigned char *?&hz code table?

          /漢字代碼初地址

          offset=start*16? //顯示的位置 行號 *列號

          offlen =0?

          loop=0?

          z0=0x00?

          sign=lcdm->showflag? //是否為漢字

          while?loop<16? //在同一行中從0列到15列

          {

          zt=lcdm->lcdseg?loop?? //取第一個代碼

          if?zt<=0x7F? /小于0X80為ASCII代碼

          {

          disp self ascii?&zt?1?offset??

          //在本行,顯示自有的ASCII代碼

          if?sign==1?

          {

          disp self ascii?&z0?1?offset 16??

          //在上一行,同一列的位置,不顯示任何代碼

          }

          offset=offset +1?

          offlen=offlen +1?

          loop++?

          }

          else

          {

          loop++?

          zt1=lcdm->lcdseg?loop??

          //取第二個代碼

          disp chinese??phz+?zt-0x80? *4096 +?zt1-0x80? *32??1?offset ?? //顯示漢字

          offset=offset + 2 ?

          offlen=offlen +2?

          loop++?

          }

          }

          }

          3 結(jié)束語

          由于本系統(tǒng)在顯示時采用了環(huán)形結(jié)構(gòu)算法,因此,可以達(dá)到快速、簡單的漢字顯示效果。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();