低成本的單色LCD在工業(yè)領(lǐng)域應用非常廣泛,英創(chuàng)公司提供的基于WinCE平臺的EM9X60系列板卡均支持外接單色LCD屏,目前應用得比較多的規(guī)格包括有LCD320X240、LCD240X128、LCD128X64等。在實際應用中有許多對于菜單界面操作的需求,由于EM9X60系列板沒有支持標準的Windows桌面顯示,因此應用程序無法直接利用WindowsCE的窗口界面、或者基于MFC的對話框作為應用程序的操作界面,而是需要客戶根據(jù)應用的具體要求自行構(gòu)建菜單界面,本文將重點介紹這方面的內(nèi)容。
基于菜單界面操作過程實質(zhì)一個簡單的交互式操作,需要實時響應鍵盤消息、定時消息等。WinCE操作系統(tǒng)內(nèi)部具備有完善的消息處理機制,來實現(xiàn)應用請求消息的實時響應。因此本案例是一個具有Windows風格的應用例程,通過窗口的消息傳遞來實現(xiàn)對于鍵盤、定時任務的實時響應,從而實現(xiàn)對于菜單界面的操作。
下面分兩個部分來介紹該例程:
1、應用程序框架
在Windows下進行窗口應用程序編程的優(yōu)點,程序只對操作系統(tǒng)發(fā)給它的通知進行響應,比如收到鍵盤被按下、定時任務等,而不需要應用程序不斷地查詢窗口的請求輸入。在支持單色LCD的WinCE系統(tǒng)下也是如此,操作系統(tǒng)在有輸入發(fā)生時會通知應用程序,操作系統(tǒng)是通過發(fā)送消息到應用程序窗口的方式來完成這個通知,雖然該“應用程序窗口”無法正常顯示,但是可以通過它來完成消息的傳遞。本例程采用傳統(tǒng)的Windows窗口應用程序編程的框架,以方便實現(xiàn)對于外界請求輸入的響應,從而實現(xiàn)在單色LCD上菜單界面的操作顯示。
在該程序例程中WinMain(…)函數(shù)也是按照窗口應用程序的過程,首先進行初始化操作,包括對于LCD屏的初始化、菜單界面的初始化操作、加載矩陣鍵盤驅(qū)動等操作;然后是創(chuàng)建窗口;再進入消息循環(huán)。如下圖所示:
// LCD初始化操作以及加載缺省的菜單界面
i1 = LCD_Init( LCD_12864 );
LCD_LoadSmallFnt( );
LCD_SetMode( 1 ); // set to XOR mode
status = MenuManager.LoadMenu( );
if( status < 0 ) return status;
MenuManager.Show( );
// 激活基于EM9x60板卡ISA的矩陣鍵盤驅(qū)動
hDevice = ActivateDevice( TEXT('Drivers\\isa_keypad'), 0);
// 初始化本程序?qū)嵗?,主要是?chuàng)建窗口等工作
hwndMain = InitInstance( hInstance, lpCmdLine, nCmdShow );
if( hwndMain == 0 )
return 0x10;// init fail!
// 設置定時器的時間間隔為2秒
SetTimer( hwndMain, 1, 2000, NULL );
// 應用程序消息循環(huán)
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
KillTimer( hwndMain, 1 );
LCD_UnLoadSmallFnt( );
其中的消息循環(huán)為主線程,循環(huán)很簡單,調(diào)用GetMessage函數(shù),從應用程序的消息隊列中取得一條來自系統(tǒng)的消息,如果沒有消息到來,這個函數(shù)就是處于等待狀態(tài),相當于這個應用主線程就被阻塞直到消息到來。
菜單例程中響應的系統(tǒng)消息包括:鍵盤消息(WM_KEYUP)和定時消息(WM_TIMER),WinCE和Windows標準系統(tǒng)一樣使用了相同的鍵盤消息處理方式。當一個鍵按下時,通常是以WM_KEYDOWN消息起始,如果按下的鍵代表一個字符,比如一個字母或數(shù)字,在WM_KEYDOWN之后還會發(fā)送一個WM_CHAR消息,當鍵被釋放時,最終的WM_KEYUP消息被發(fā)送,在這些消息的參數(shù)wParam指示了按下鍵的虛擬鍵值。為了簡化程序,在此例程中對于按鍵的響應,是等到按鍵釋放的時候,也就是說應用程序只響應WM_KEYUP消息。定時消息則可以通過函數(shù)SetTimer( … )來實現(xiàn),該函數(shù)同時也設置了定時事件、以及定時間隔。
消息的響應是通過定義MainMessage表格,將消息值和消息處理例程函數(shù)關(guān)聯(lián)起來。如:
const struct decodeUINT MainMessages[] =
{
{ WM_KEYUP, DoKeysMain },
{ WM_TIMER, DoTimerMain },
{ WM_DESTROY, DoDestroyMain }
};
// 鍵盤消息WM_KEYUP ..處理函數(shù)
LRESULT DoKeysMain( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
switch( wParam )
{
case 0x33:// 移動鍵
MenuManager.Key_SHIFT( );
break;
case 0x36:// 確認鍵
MenuManager.Key_ENTER( );
break;
}
return 0;
}
// 定時消息WM_TIMER處理函數(shù)
LRESULT DoTimerMain( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
MenuManager.Update( );
return 0;
}
2、菜單界面設計
在本例程中主要是針對一個基于LCD128X64顯示終端所設計的二級菜單顯示界面,功能鍵有兩個:移動鍵(Key_Shift)和確認鍵(Key_Enter),通過移動鍵選擇菜單項,確認鍵來進入下一級,或者返回上一級菜單。
菜單的顯示和管理是通過C++方式來實現(xiàn),Class Item定義菜單中各個菜單項的顯示特性以及操作特性;Class Menu定義了菜單的特性,其中包含又對于菜單中各個菜單項管理的功能;Class MenuManager是一個菜單管理類,這個類實現(xiàn)了對于各個菜單的管理和操作特性,相當于一個人機交互界面的功能。它們定義分別在 Item.h Menu.h文件中。
為了增加菜單設計的靈活性,對于各個菜單界面的顯示內(nèi)容采用了讀取配置文件的方式,即在配置文件中定義各個菜單的顯示名稱和顯示位置,如:
// item的類型 顯示名稱 X位置 Y位置 下一級菜單名稱
item=301 終端參數(shù) 0 0 MENU1
item=301 實時數(shù)據(jù) 0 16 MENU2
item=301 終端狀態(tài) 0 32 MENU3
item=301 顯示配置 0 48 MENU4
item=301 擴展菜單 64 0 MENU5
item=301 擴展菜單 64 16 MENU6
item=301 擴展菜單 64 32 MENU7
item=301 擴展菜單 64 48 MENU8
根據(jù)該配置文件所形成的菜單如下:
-
WINDOWS
+關(guān)注
關(guān)注
4文章
3586瀏覽量
89964 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6092瀏覽量
35846
發(fā)布評論請先 登錄
相關(guān)推薦
一款低成本高性能的LCD移動電源設計方案
具有觸摸感應接口的觸摸界面的應用
EM335x支持低成本單色LCD顯示方案
低成本LCD偏置電源分立式解決方案
圖形LCD模塊的菜單方式人機交互界面
低成本LCD驅(qū)動控制的ASIC實現(xiàn)方案
圖形點陣LCD液晶模塊顯示界面的可視化編程方案與實踐

基于MAX17014的低成本LCD TV電源解決方案

WinCE下單色LCD屏菜單界面設計方案

適用于單片機LCD12864的界面菜單設計思路資料免費下載

英創(chuàng)信息技術(shù)ARM9 Linux智能終端菜單界面設計介紹

英創(chuàng)信息技術(shù)EM335x支持低成本單色LCD顯示介紹
英創(chuàng)信息技術(shù)ESM335x主板支持單色LCD屏顯示簡介

評論