<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 光電顯示 > 設計應用 > 基于液晶模塊的動(dòng)態(tài)曲線(xiàn)顯示設計

基于液晶模塊的動(dòng)態(tài)曲線(xiàn)顯示設計

作者: 時(shí)間:2011-12-31 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要: 以中文CM320240-7為例, 給出了使用LCDCM320240-7來(lái)實(shí)現文本、圖形和實(shí)時(shí)的系統方法。

本文引用地址:http://dyxdggzs.com/article/168697.htm

0 引言

為了提高顯示程序的可讀性和可維護性, 軟件程序通常采用C語(yǔ)言來(lái)編寫(xiě)。從總體上說(shuō), 顯示軟件的編程主要分為主程序、顯示、鍵盤(pán)輸入模塊和通信模塊等。其中主程序主要完成初始化、鍵盤(pán)掃描等; 鍵盤(pán)輸入模塊主要完成各功能鍵的按鍵響應; 液晶模塊主要完成菜單界面的切換顯示; 通信模塊主要實(shí)現數據的接收與發(fā)送。本文重點(diǎn)介紹液晶顯示部分的內容。

液晶顯示的內容主要是一些用戶(hù)關(guān)心的實(shí)時(shí)參數和狀態(tài), 其基本操作流程為: 初始化、清屏、顯示。初始化主要是復位液晶, 等待對液晶進(jìn)行操作; 清屏主要是清除掉液晶屏上所顯示的內容, 為下一次顯示的內容做準備; 顯示主要是顯示當前想要顯示的內容。

1 中文液晶顯示模塊CM320240-7

中文液晶顯示模塊CM320240-7是一個(gè)中英文文字與繪圖模式的點(diǎn)矩陣液晶顯示模塊, 其內建有12Kbyte的ROM字型碼, 可以顯示中文字型,數字符號, 英日歐文等字母。同時(shí), 該模塊還內建雙圖層的顯示內存, 可支持文字與繪圖兩種混合顯示模式。并可提供全角(16×16) 與半角(×8)文字顯示模式。CM320240-7的最大特點(diǎn)就是在強光照射下, 用戶(hù)依然可以清晰地看到屏幕上顯示的內容, 因而非常適合在戶(hù)外使用。

CM320240-7可以很方便地與ARM9相連接。它具有24個(gè)管腳, 其中有8位數據線(xiàn)(DB0~DB7),6 位控制線(xiàn)(RS-數據/命令控制, WR-讀寫(xiě)控制,CS2-片選2, CS1-片選1, EN-使能端, /RST-復位端, ) , 4 位電源線(xiàn)( AVSS, AVDD, VSS,VDD), 2位狀態(tài)線(xiàn)(BUSY-用以回應模塊內部的執行使用狀況, INT-用以回應模塊內部的中斷狀況), 同時(shí)包括背光源正、負端(LED+、LED-),LCD驅動(dòng)電源輸入端和輸出端(V0、VEE)。

2 字符和漢字的顯示

對于點(diǎn)陣液晶顯示器來(lái)說(shuō), 漢顯菜單的就是如何通過(guò)編程將漢字按一定的格式在屏幕上顯示出來(lái)。

在LCD上顯示字符和漢字之前, 通常都需要先提取點(diǎn)陣碼。由于要顯示的漢字和字符非常多, 而且它們是任意的, 因而必須要有常用的字符和漢字字庫。由于A(yíng)SCⅡ字符字庫比較小, 一般的字模軟件就可以生成, 故筆者使用的軟件是任意點(diǎn)陣字體生成器, 其操作界面如圖1所示。

任意點(diǎn)陣字體生成器的操作界面

圖1 任意點(diǎn)陣字體生成器的操作界面

任意點(diǎn)陣字體生成器軟件界面風(fēng)格簡(jiǎn)潔, 操作簡(jiǎn)便。常用漢字和字符的ASCⅡ碼保存在以.dat為后綴的文件里。故以打開(kāi)文件的方式就可取得漢字和字符的ASCⅡ碼, 其操作語(yǔ)句如下:

fp_ST_16_08_ASC =fopen ( /mnt/Nand1/ST_16_08_ASC.Dat , r)

有關(guān)在文本和圖形顯示方式下寫(xiě)入字符和漢字的方法, 在與顯示有關(guān)的相關(guān)資料中已經(jīng)介紹得很清楚。這里給出的是一個(gè)在本程序中用到的顯示漢字的函數。通過(guò)這個(gè)函數, 可以將想要顯示的任意漢字和字符顯示在液晶屏幕的任意位置上。具體如下:

static void HanZi ( U32 x, U8 y, U8 *data, U8size, U8 reverse_log)

其中, x為橫坐標, y為縱坐標, *data為數據內容, size為字體, reverse_log為反白標記。

3 圖形的顯示

3.1 描點(diǎn)

對屏幕上每一個(gè)點(diǎn)進(jìn)行繪制是繪圖的基本條件。在用液晶顯示器顯示圖形時(shí), 首先要給屏幕上的每一個(gè)點(diǎn)分配一個(gè)二維的坐標。對于CM320240-7所用的320×240點(diǎn)陣液晶, 其左上角第一個(gè)點(diǎn)的坐標為(0, 0), 右下角最后一個(gè)點(diǎn)的坐標為(319, 239)。這樣, 根據二維坐標就可以計算出各點(diǎn)所對應的內存單元, 并給其賦值“1”。而中文液晶顯示模塊在顯示圖形的時(shí)候,一般是以字符映像(Bit Map) 的方式寫(xiě)入RAM,若RAM的某個(gè)位置被填滿(mǎn)為“1”, 其LCD面板相對應的位置就會(huì )被顯示出黑點(diǎn)。因此, 在RAM上所存儲的像素資料, 就會(huì )對應到顯示屏幕(LCD)上, 從而構成文字、符號或圖形等顯示效果。為了便于運算, 可將每8個(gè)點(diǎn)的狀態(tài)存放在一個(gè)字節的內存單元中, 圖2給出了顯示數據從RAM到LCD顯示的映射方式。由此可見(jiàn), 全屏的320×240個(gè)點(diǎn)的狀態(tài)將存放在(320 / 8) ×240=40×240個(gè)字節的內存單元中。

顯示數據從RAM到LCD顯示的映射方式

圖2 顯示數據從RAM到LCD顯示的映射方式

填充某一矩形區域的函數為Box_full (U16x_1, U16 y_1, U16 x_2, U16 y_2) , 其中,(x_1, y_1), (x_2, y_2) 為所填充的矩形區域的左上角和右下角的坐標。描一個(gè)點(diǎn)就相當于填充一個(gè)點(diǎn)陣區域。

清除某矩形區域的函數為Box_eraser (U16x_1, U16 y_1, U16 x_2, U16 y_2) , 其中,(x_1, y_1), (x_2, y_2) 分別為所清除的矩形區域的左上角和右下角的坐標。消除一個(gè)點(diǎn)即清除一個(gè)點(diǎn)陣區域。通過(guò)這個(gè)函數可以很方便地清空某個(gè)矩形區域的內容, 例如清除圖形區域, 或清除需要改變的數據區域等。

3.2 畫(huà)線(xiàn)

曲線(xiàn)可以視為是由若干直線(xiàn)段首尾相連而成。繪制直線(xiàn)是繪制曲線(xiàn)的基礎, 所以首先考慮直線(xiàn)的繪制方法。一般的斜線(xiàn)段也可以看作是由若干水平或垂直的線(xiàn)段首尾連接而成的, 而對于水平直線(xiàn)和垂直直線(xiàn)這兩種特殊情況, 則相當于填充某矩形區域, 這可以用前面提到的Box_full() 函數來(lái)完成。因此, 曲線(xiàn)的繪制全部都可以轉換為直線(xiàn)的繪制, 而其關(guān)鍵就在于確定各個(gè)水平或垂直線(xiàn)段首尾兩個(gè)端點(diǎn)的坐標。下面將重點(diǎn)介紹繪制直線(xiàn)的算法。

處理曲線(xiàn)段首尾兩個(gè)端點(diǎn)的方法相對比較簡(jiǎn)單, 即每個(gè)端點(diǎn)都沿X軸正向繪制2個(gè)相同Y值的像素點(diǎn), Y為當前點(diǎn)所對應的縱坐標。對于兩端點(diǎn)之間剩余的3個(gè)像素點(diǎn), 可分以下三種情況進(jìn)行討論。

首先, 當y_0等于y_past時(shí), 很顯然, 兩端點(diǎn)之間是一條水平線(xiàn), 其線(xiàn)形如圖3 (1) 所示。其函數描述為: Box_full (x_0-3,y_0,x_0+1,y_0)。

幾種情況下線(xiàn)段的繪制情形

圖3 幾種情況下線(xiàn)段的繪制情形

其次, 如果y_0大于y_past, 此時(shí)將分為以下4種情況進(jìn)行討論:

第一, 當y_0-y_past=1時(shí), 其情形如圖3 (2)所示。其函數描述為:

Box_full (x_0-1,y_0,x_0+1,y_0) ;

Box_full (x_0-3,y_past,x_0-2,y_past) ;

第二, 當y_0-y_past=2時(shí), 其情況如圖3 (3)所示。函數描述為:

Box_full (x_0,y_0,x_0+1,y_0) ;

Box_full (x_0-3,y_0+1,x_0-1,y_0+1) ;

第三, 當y_0-y_past=3時(shí), 其情況如圖3 (4)所示。函數描述為:

Box_full (x_0-1,y_0+1,x_0-1,y_0+1) ;

Box_full ( x_0 -3,y_past -1,x_0 -2,y_past -1) ;

Box_full (x_0,y_0,x_0+1,y_0) ;

第四, 當y_0-y_past=4時(shí), 其情況如圖3 (5)和(6) 所示。函數描述為:

Box_full (x_0,y_0,x_0+1,y_0) ;

Box_full (x_0-1,y_0+1,x_0-1,y_0+1) ;

Box_full ( x_0 -3,y_past -1,x_0 -3,y_past -1) ;

Box_full (x_0-2,y_0+2,x_0-2,y_past-2) ;

而當y_0小于y_past時(shí), 其分析方法與y_0大于y_past時(shí)相似, 這里不再重復。

3.3 曲線(xiàn)的顯示

圖4所示是實(shí)現曲線(xiàn)顯示的顯示界面。

動(dòng)態(tài)曲線(xiàn)的界面顯示

圖4 曲線(xiàn)的界面顯示

實(shí)際上, 該界面可劃分為以下3種顯示區域: 文本區、數字區、圖形區。文本區是指圖中的文字部分, 用于說(shuō)明和提示; 數字區是指圖中的數字部分, 用于顯示一些實(shí)時(shí)的數據, 例如時(shí)間、直流值、交流值、存儲器容量等; 圖形區則是指界面中間顯示波形的部分, 主要用于顯示實(shí)時(shí)動(dòng)態(tài)波形。

在確定實(shí)時(shí)曲線(xiàn)點(diǎn)地址時(shí), 其二維坐標的任意一點(diǎn)都是由橫坐標和縱坐標來(lái)確定的。對于橫坐標, 它們是一組等間隔的整數, 因此, 每畫(huà)完當前一個(gè)點(diǎn)后, 再在其水平坐標加上某一固定的整數, 即可得到下一個(gè)要畫(huà)的點(diǎn)的水平坐標。例如, 若橫坐標間隔為5, 則橫坐標X就依次加5。

對于縱坐標則相對復雜些, 假設A/D轉換后得到的數據為y, Y為所求點(diǎn)在動(dòng)態(tài)顯示區中所在的行, 橫軸所在的行為H, 則Y=H- (int) (y×20)。

20實(shí)際上是為了方便運算而取的一個(gè)幅值, 該值可以根據不同的數據情況來(lái)設定其大小。

為了在液晶屏幕上實(shí)時(shí)動(dòng)態(tài)地顯示曲線(xiàn), 刷新是一個(gè)很重要的環(huán)節。傳統的刷新方法是不斷地刷新每個(gè)顯示單元。顯示的控制過(guò)程實(shí)際上就是對圖形區RAM 數據的控制過(guò)程, 從左到右按單位掃描時(shí)間逐一置動(dòng)態(tài)圖形區RAM 中的顯示數據, 直到掃描到LCD 最右邊時(shí), 再清除所有動(dòng)態(tài)圖形區RAM的數據, 之后, 又按單位掃描時(shí)間從左到右繼續逐一置動(dòng)態(tài)圖形區RAM 中的顯示數據, 并以逐點(diǎn)顯示方式來(lái)實(shí)現整幅圖形的刷新。由于圖形顯示數據的運算量大、讀寫(xiě)次數較多, 液晶屏的讀操作要連續進(jìn)行兩次, 第一次讀操作將地址輸出讀到一個(gè)無(wú)效數據, 第二次讀操作才讀到有效數據。所以, 用這種方法實(shí)現的顯示會(huì )感到刷新不及時(shí)、視覺(jué)效果較差。本文采用靜態(tài)隨機存取存儲器(SRAM) 的映射方式, 即在(SRAM) 中開(kāi)辟一個(gè)與液晶屏動(dòng)態(tài)圖形變化區域相同容量的存儲區域, 并使圖形的刷新全部在(SRAM) 中進(jìn)行, 然后重新寫(xiě)屏。由于采用的是相同的地址指針, 從而減少了ARM地址指針切換所帶來(lái)的延遲, 這樣就使得圖形曲線(xiàn)更新的動(dòng)態(tài)性能大大提高。除此之外, 本文還采用了指定有變化的部分刷新的方法, 即讓沒(méi)有變化的部分保留原樣, 而不采取任何操作, 只改變有變化的部分。因此, 刷新的效率也大大地提高了。刷新操作的具體程序如下:




對于波形動(dòng)態(tài)顯示的效果, 現假設一整屏波形顯示56個(gè)數據, 那么第一屏應依次描點(diǎn), 即從X軸最左邊起, 一個(gè)單位時(shí)間描一個(gè)點(diǎn)且描一個(gè)點(diǎn)刷新一次。當第一屏描滿(mǎn), 即56個(gè)點(diǎn)全部描完時(shí), 圖形區域將顯示一個(gè)完整的波形。之后從第二屏開(kāi)始, 將一次性顯示滿(mǎn)屏的56個(gè)點(diǎn), 然后再刷新。其中第56個(gè)點(diǎn), 即最新的點(diǎn)顯示在圖形區域的最右邊, 它的縱坐標是最新讀到的數據轉換值。左邊的55個(gè)點(diǎn)的縱坐標是之前顯示的舊的55個(gè)點(diǎn)的縱坐標。之后, 繪制每一屏的方法都與繪制第二屏的相同。通過(guò)這種方法, 波形將呈現不斷往前平移的效果, 從而實(shí)現一個(gè)連續波形的動(dòng)態(tài)顯示。

4 結束語(yǔ)

本文所討論的液晶顯示應用技術(shù)的實(shí)現方法, 已在工程實(shí)踐中表明是可行的, 并且運行比較穩定。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>