處理功能鍵
功能鍵的問題在於,使用者介面並非固定的,使用者功能鍵的選擇將使螢幕畫面處於不同的顯示狀態下。例如,主畫面如圖1:
圖1 主畫面
當使用者在設定xx上按下enter鍵之後,畫面就切換到了設定xx的介面,如圖2:
圖2 切換到設定xx畫面
程式如何判斷使用者處於哪一畫面,並在該畫面的程式狀態下呼叫對應的功能鍵處理函式,而且保證良好的結構,是乙個值得思考的問題。
讓我們來看看win32程式設計中用到的"視窗"概念,當訊息(message)被傳送給不同視窗的時候,該視窗的訊息處理函式(是乙個callback 函式)最終被呼叫,而在該視窗的訊息處理函式中,又根據訊息的型別呼叫了該視窗中的對應處理函式。通過這種方式,win32有效的組織了不同的視窗,並處 理不同視窗情況下的訊息。
我們從中學習到的就是:
(1)將不同的畫面模擬為win32中不同的視窗,將視窗中的各種元素(選單、按鈕等)包含在視窗之中;
(2)給各個畫面提供乙個功能鍵"訊息"處理函式,該函式接收按鍵資訊為引數;
(3)在各畫面的功能鍵"訊息"處理函式中,判斷按鍵型別和當前焦點元素,並呼叫對應元素的按鍵處理函式。
/* 將視窗元素、訊息處理函式封裝在視窗中 */
struct windows
;/* 訊息處理函式 */
void messagefunction(byte keyvalue)
/* "訊息對映" */
if(i < element_num)}}
在視窗的訊息處理函式中呼叫相應元素按鍵函式的過程類似於"訊息對映",這是我們從win32程式設計中學習到的。程式設計到了乙個境界,很多東西都是相通的了。其它地方的思想可以拿過來為我所用,是為程式設計中的"拿來主義"。
在這個例子中,如果我們還想玩得更大一點,我們可以借鑑mfc中處理message_map的方法,我們也可以學習mfc定義幾個精妙的巨集來實現"訊息對映"。
處理數字鍵
使用者輸入數字時是一位一位輸入的,每一位的輸入都對應著螢幕上的乙個顯示位置(x座標,y座標)。此外,程式還需要記錄該位置輸入的值,所以有效組織使用者數字輸入的最佳方式是定義乙個結構體,將座標和數值**在一起:
/* 使用者數字輸入結構體 */
typedef struct taginputnum
inputnum, *lpinputnum;
那麼接收使用者輸入就可以定義乙個結構體陣列,用陣列中的各位組成乙個完整的數字:
inputnum inputelement[num_length]; /* 接收使用者數字輸入的陣列 */
/* 數字按鍵處理函式 */
extern void onnumkey(byte num)}
將數字每一位輸入的座標和輸入值**後,在數字鍵處理函式中就可以較有結構的組織程式,使程式顯得很緊湊。
整理使用者輸入
繼續第2節的例子,在第2節的onnumkey函式中,只是獲取了數字的每一位,因而我們需要將其轉化為有效資料,譬如要轉化為有效的***資料,其方法是:
/* 從2進製資料位轉化為有效資料:*** */
void convertto***() }
反之,我們也可能需要在螢幕上顯示那些有效的資料位,因為我們也需要能夠反向轉化:
/* 從有效資料轉化為2進製資料位:*** */
void convertfrom***() }
當然在上面的例子中,因為資料是2進製的,用power函式不是很好的選擇,直接用"<< >>"移位操作效率更高,我們僅是為了說明問題的方便。試想,如果使用者輸入是十進位制的,power函式或許是唯一的選擇了。
總結
C語言嵌入式系統程式設計修煉(三)
c語言嵌入式系統程式設計修煉 三 使用巨集定義在c 語言中,巨集是產生內嵌 的唯一方法。對於嵌入式系統而言,為了能達到效能要求,巨集是一種很好的代替函式的方法。寫乙個 標準 巨集 min 這個巨集輸入兩個引數並返回較小的乙個 錯誤做法 define min a,b a b a b 正確做法 defi...
C語言嵌入式系統程式設計修煉之螢幕操作
漢字處理 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢字型檔,往往只是需要提供數量有限的漢字供必要的顯示功能。例如,乙個微波爐的lcd上沒有必要提供顯示 電子郵件 的功能 乙個提供漢字顯示功能的空調的lcd上不需要顯示一條 短訊息 諸如此類。但是一部 手機 小靈通則通常需要包括較完整的...
C語言嵌入式系統程式設計修煉之螢幕操作
c語言嵌入式系統程式設計修煉之螢幕操作 出處 天極網 2005 06 20 15 54 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢字型檔,往往只是需要提供數量有限的漢字供必要的顯示功能 漢字處理 現在要解決的問題是,嵌入式系統中經常要使用的並非是完整的漢 字型檔,往往只是需要提供數量...