在自動化儀器儀表、工業(yè)測控裝置等嵌入式計算機系統(tǒng)中,圖形液晶顯示模塊(點陣LCD)以顯示靈活、信息量大、可實現(xiàn)圖形界面等優(yōu)點而被廣泛的用做顯示終端。這些模塊大多提供并行數(shù)據(jù)接口,少量提供串行接口的模塊也要求通信采用特殊協(xié)議,給系統(tǒng)的軟硬件設計都帶來較大不便。在顯示程序上,可移植通用的嵌入式圖形用戶界面GUI軟件,如MiniGUI,OpenGUI等,以簡化軟件設計工作。但是,這些GUI軟件移植繁瑣,有些源代碼不公開,一般需要數(shù)百KB的存儲量,對于一些只要求實現(xiàn)簡單界面的工控應用來說過于龐大,有一些功能(如鼠標操作、支持漢字輸入法等)也不十分必要。
針對上述問題,本文結合LCD顯示模塊STN6448D-4K設計了一種滿足工控要求的模塊化圖形液晶顯示單元。硬件上通過51單片機搭建轉換電路,實現(xiàn)模塊并行訪問時序到串行顯示命令的轉換。軟件上結合串行接口命令和通信協(xié)議,用C語言編寫了具有消息驅動機制的簡單通用圖形用戶界面GUI程序,可以方便地移植到各種工控嵌入式系統(tǒng)。
1.標準串口擴展的設計
液晶顯示模塊STN6448D-4K支持640×480點陣4096偽彩色顯示,用戶接口為8位并行口。圖1為模塊的RS-232硬件擴展接口結構,在AT89C51單片機最小系統(tǒng)基礎上,擴展了一片MAX232。單片機通過總線與模塊STN6448D-4K的控制器相連。單片機接收并分析串口指令,調用相應函數(shù)完成對LCD的各種顯示控制。為減少串行通信數(shù)據(jù)量,還擴展了一片2MB的Flash存儲器AM29F016D,用于存儲BMP圖像和字符庫、漢字庫。通常采用的字庫有漢字庫文件Hzk16f.bin(16×16點陣)、Hzk24k.bin(24×24點陣),ASCII碼文件ASC16.bin(16×8點陣)、ASC24.bin(24×12點陣)等,位圖文件可以根據(jù)需要自行制作和增減。所有的字庫和位圖均通過RS-232接口從PC機下載到Flash存儲器中,根據(jù)每個文件的存儲首地址索引可以完成字符、漢字、位圖的顯示。
2.串口指令和通信軟件設計
按照STN6448D-4K的編程格式編寫清屏、畫點、畫線、畫矩形、寫字符(ASCII字符、漢字)、加載位圖等基本繪圖函數(shù)的單片機程序比較簡單,這里不作說明。單片機在完成初始化、清屏操作后,將就緒狀態(tài)信息傳遞給嵌入式系統(tǒng)的CPU,并等待從RS-232傳來的繪圖指令。每一個繪圖指令,都是一個繪圖命令幀,與一個繪圖函數(shù)相對應。
單片機收到一個完整的繪圖指令后根據(jù)指令碼識別不同的繪圖操作,調用相應的函數(shù)完成顯示控制。由于各個函數(shù)的指令長短不一,單片機需要判斷出一條指令的結束;而且單片機完成LCD操作需要時間,硬件上又沒有一個“BUSY”信號來指示單片機暫時不能接收指令。故程序設計上需保證傳輸同步和可靠性。
2.1 顯示命令幀的封裝
每一個繪圖指令都封裝成一個繪圖命令幀,封裝時依據(jù)以下3條規(guī)則:
(1)在每一個繪圖指令的結尾加上標志字節(jié)END,封裝成一個繪圖命令幀。一個完整的繪圖命令幀包括繪圖指令碼、繪圖函數(shù)參數(shù)以及END標志。標志字節(jié)END的編碼為0x55;
(2)在幀數(shù)據(jù)(指令的有效數(shù)據(jù))中的某一個字節(jié)如果與END(0x55)相同,則將這個字節(jié)轉換為(0xDE,0xCF)的2字節(jié)序列。其中0xDE稱為轉義字符TRANS,0xCF為數(shù)據(jù)與END標志相同時轉義后的替換符TRANS_REP。
(3)如果幀數(shù)據(jù)中某個字節(jié)與轉義字符(0xDE)本身相同,則將其更換為(0xDE,0xDE)2字節(jié)序列。
如果不考慮轉義字符,一個完整的繪圖命令幀格式如下:
其中:CMD指令碼,P1-Pn為n個字節(jié)數(shù)據(jù)。例如畫水平線函數(shù)對應的命令幀中的字符依次為:0xCA, X0_H, X0_L, Y_H, Y_L, X1_H, X1_L, CLR。其中0xCA為指令碼(對每個函數(shù)唯一),之后的6個為坐標參數(shù),CLR為顏色。
2.2 接收狀態(tài)機
單片機的接收中斷處理采用接收狀態(tài)機機制,狀態(tài)轉換如圖2所示。
三個狀態(tài)的含義為:
狀態(tài)0: 準備接收一幀數(shù)據(jù)
狀態(tài)1: 正在接收一幀數(shù)據(jù),且上一次接收到的字節(jié)不是轉義字符
狀態(tài)2: 正在接收一幀數(shù)據(jù),且上一次接收到的字節(jié)是轉義字符
接收一個字節(jié)后,根據(jù)當前狀態(tài)和接收到的字符a,進行狀態(tài)轉換,并舍棄轉義字符等多余字節(jié),將有效數(shù)據(jù)放入接收緩沖數(shù)組。當接收到有效的結束符END后,單片機將置緩沖滿標志。單片機讀到該標志,即可分析緩沖區(qū)中的數(shù)據(jù),執(zhí)行相應顯示操作,并在操作后,清除緩沖滿標志并向嵌入式系統(tǒng)的主CPU發(fā)出可以接收數(shù)據(jù)的應答字符(0x55)。
3.圖形用戶界面(GUI)程序設計
前述設計已能滿足簡單的顯示要求。在此基礎上本文使用C語言編寫了通用的GUI程序,設計出類VB的包含窗體和簡單控件的界面,實現(xiàn)簡單的可視化的操作:如按鈕按壓、文本輸入、標簽顯示、選擇框選擇、軟件菜單、窗體加載、位圖顯示、控件的Tab聚焦等。程序采用分層和模塊化的思想,其分層結構如圖3所示。這樣,可以減少程序間的耦合,便于程序的完善和升級。
3.1 邏輯設備層基本繪圖函數(shù)(LD.C)
最底層的硬件設備層的繪圖函數(shù)(HD.C)是顯示命令幀的發(fā)送,采用液晶屏的絕對坐標(屏左上角為坐標零點)繪圖,邏輯設備層的函數(shù)則是基于用戶定義的當前“窗口”相對坐標(窗口左上角為坐標零點)繪圖,窗口的位置任意。這里說的“窗口”就是當前顯示的可操作范圍,也稱為“窗口上下文”。
繪圖工具函數(shù)是一些內聯(lián)函數(shù)和宏定義,創(chuàng)建當前的窗口上下文,完成絕對坐標與相對坐標相互轉換,進行繪圖元素的移動、復制,設置字間距、行間距等。基于窗口裁減的繪圖函數(shù)調用各種繪圖工具函數(shù)和硬件設備層的繪圖函數(shù),實現(xiàn)了點、線、漢字、字符、平面和3D矩形框的繪制,位圖加載等,并將超出窗口范圍的部分裁減掉(忽略不畫)。
3.2 窗體/控件的設計
窗體(Form)和控件全部由結構體來定義。簡單控件的共性是均為矩形框(平面的或3D的),所以都可以由公共結構體Gwidget加上各自的個性化屬性和行為方式派生得到??丶傩裕ɑ驙顟B(tài))包括:按下/彈起(對Button控件)、聚焦/失去焦點、允許/禁止接受用戶輸入(區(qū)分Label和Text)等?;贕Widget可以派生Button、Label、Text、SelBox、menu等控件。Gwidget結構體成員包括“窗口”信息、控件ID(唯一標識一個控件)、控件屬性/狀態(tài)、控件邊界寬度(實現(xiàn)3D顯示)、默認的控件消息響應函數(shù)指針(如ButtonOnMsg)。
窗體(Form)既是一個獨立的實體,又是控件的容器,用于管理屬于它的所有控件并傳遞和響應消息。其結構體成員主要有:窗口上下文、消息響應函數(shù)指針、標題字符串指針、所含的控件數(shù)組指針、所含控件數(shù)、當前聚焦的控件ID等。
3.3 GUI消息響應機制
針對具體的應用要求,可以設計出各種各樣的窗體(界面),每一個窗體包含多個控件。有的控件可以接受用戶字符串和數(shù)字輸入(Text控件)。這些窗體通過軟件菜單組織起來。菜單為多叉樹結構,最下一級菜單指向一個窗體或執(zhí)行某個功能。同一級菜單包含并管理一個或多個菜單項。菜單結構體成員主要有:包含各菜單項的數(shù)組指針、菜單項個數(shù)、指向上級菜單的指針(可以為空)等,而菜單項結構體則包含指向下一級菜單的指針(可以為空)、指向一個窗體的指針(可以為空)、消息響應函數(shù)指針等。主程序和GUI之間的消息傳遞(或函數(shù)調用)機制如圖4所示,虛線空心箭頭指示消息的傳遞方向。
4.結束語
本文設計的液晶顯示單元具有RS-232接口,不僅在接入嵌入式系統(tǒng)方面提供了方便,也為在系統(tǒng)設計時,使用PC機并行地進行顯示軟件設計提供了途徑。用C語言編寫的GUI程序可以方便地移植到各種基于嵌入式操作系統(tǒng)的應用中,占用空間小,使用簡單,通用性好,能滿足一些較復雜界面顯示的要求,其已經(jīng)在筆者開發(fā)的多個嵌入式系統(tǒng)中得到應用。