當(dāng)前位置:首頁(yè) > 顯示光電 > 顯示光電
[導(dǎo)讀]介紹了液晶顯示在嵌入系統(tǒng)中的應(yīng)用編程,給出了在液晶顯示與系統(tǒng)接口的應(yīng)用層編程中,采用環(huán)形結(jié)構(gòu)算法來(lái)達(dá)到快速、簡(jiǎn)單地進(jìn)行漢字代碼的編碼以及漢字的分頁(yè)和分行顯示的顯示應(yīng)用程序。

  摘要:介紹了液晶顯示在嵌入系統(tǒng)中的應(yīng)用編程,給出了在液晶顯示與系統(tǒng)接口的應(yīng)用層編程中,采用環(huán)形結(jié)構(gòu)算法來(lái)達(dá)到快速、簡(jiǎn)單地進(jìn)行漢字代碼的編碼以及漢字的分頁(yè)和分行顯示的顯示應(yīng)用程序。

    關(guān)鍵詞:嵌入式系統(tǒng);液晶顯示;環(huán)形結(jié)構(gòu)算法;漢字顯示

1 引言

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

香港精電公司的128×64點(diǎn)陣模塊內(nèi)部自帶液晶圖形顯示控制芯片T6963,其中C/D腳用于控制字與數(shù)據(jù),RD和WR分別為讀、寫(xiě)使能端。當(dāng)WR為低時(shí),C/D為高為寫(xiě)命令,C/D為低為寫(xiě)數(shù)據(jù);而當(dāng)RD為低時(shí),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í)實(shí)現(xiàn)漢字和圖形顯示,并提供英文、數(shù)字輸入和漢字輸入功能。由于硬件接口層的隔離作用,不同的系統(tǒng)具有一定的通用性,以下重點(diǎn)介紹應(yīng)用層編程中的漢字代碼編碼方法和顯示編程的實(shí)現(xiàn)這兩部分。

2.1 漢字代碼編碼

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

一個(gè)漢字代碼表可簡(jiǎn)單表示為:

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

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

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

typedef struct lcdLine

{

struct lcdLine *previous? //前一行

struct lcdLine *next? //后一行

unsigned short lineId? //行特征字

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

unsigned char start? //顯示行號(hào) ,漢字一

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

unsigned char lcdseg?16??

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

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

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

//處理行函數(shù)

};

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

typedef struct lcdPage

{

struct lcdLine *firstLine? //該頁(yè)中的第一行

struct lcdPage *previous? //前一頁(yè)

struct lcdPage *next? //后一頁(yè)

unsigned short pageId? //頁(yè)特征字

} lcdPage?

下面給出的是一個(gè)環(huán)行隊(duì)列函數(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)后,便可以得出行隊(duì)列和頁(yè)隊(duì)列的組成方法:

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)識(shí)

?firstlcdLine 1?=NULL?

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

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

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

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

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???

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

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

void disp lcd Line?lcdMenu *lcdm?unsigned char start? //START為行號(hào)

{

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? //顯示的位置 行號(hào) *列號(hào)

offlen =0?

loop=0?

z0=0x00?

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

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

{

zt=lcdm->lcdseg?loop?? //取第一個(gè)代碼

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??

//取第二個(gè)代碼

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

offset=offset + 2 ?

offlen=offlen +2?

loop++?

}

}

}

3 結(jié)束語(yǔ)

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉