<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è) > 嵌入式系統 > 設計應用 > C語(yǔ)言嵌入式系統編程修煉之五:鍵盤(pán)操作!

C語(yǔ)言嵌入式系統編程修煉之五:鍵盤(pán)操作!

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏
處理功能鍵


  功能鍵的問(wèn)題在于,用戶(hù)界面并非固定的,用戶(hù)功能鍵的選擇將使屏幕畫(huà)面處于不同的顯示狀態(tài)下。例如,主畫(huà)面如圖1:

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

圖1 主畫(huà)面


  當用戶(hù)在設置XX上按下Enter鍵之后,畫(huà)面就切換到了設置XX的界面,如圖2:


圖2 切換到設置XX畫(huà)面


  程序如何判斷用戶(hù)處于哪一畫(huà)面,并在該畫(huà)面的程序狀態(tài)下調用對應的功能鍵處理函數,而且保證良好的結構,是一個(gè)值得思考的問(wèn)題。

  讓我們來(lái)看看WIN32編程中用到的"窗口"概念,當消息(message)被發(fā)送給不同窗口的時(shí)候,該窗口的消息處理函數(是一個(gè)callback函數)最終被調用,而在該窗口的消息處理函數中,又根據消息的類(lèi)型調用了該窗口中的對應處理函數。通過(guò)這種方式,WIN32有效的組織了不同的窗口,并處理不同窗口情況下的消息。

  我們從中學(xué)習到的就是:

 ?。?)將不同的畫(huà)面類(lèi)比為WIN32中不同的窗口,將窗口中的各種元素(菜單、按鈕等)包含在窗口之中;

 ?。?)給各個(gè)畫(huà)面提供一個(gè)功能鍵"消息"處理函數,該函數接收按鍵信息為參數;

 ?。?)在各畫(huà)面的功能鍵"消息"處理函數中,判斷按鍵類(lèi)型和當前焦點(diǎn)元素,并調用對應元素的按鍵處理函數。

/* 將窗口元素、消息處理函數封裝在窗口中 */
struct windows
{
 BYTE currentFocus;
 ELEMENT element[ELEMENT_NUM];
 void (*messageFun) (BYTE keyValue);
 …
};
/* 消息處理函數 */
void messageFunction(BYTE keyValue)
{
 BYTE i = 0;
 /* 獲得焦點(diǎn)元素 */
 while ( (element [i].ID!= currentFocus)&& (i < ELEMENT_NUM) )
 {
  i++;
 }
 /* "消息映射" */
 if(i < ELEMENT_NUM)
 {
  switch(keyValue)
  {
   case OK:
    element[i].OnOk();
    break;
   …
  }
 }
}


  在窗口的消息處理函數中調用相應元素按鍵函數的過(guò)程類(lèi)似于"消息映射",這是我們從WIN32編程中學(xué)習到的。編程到了一個(gè)境界,很多東西都是相通的了。其它地方的思想可以拿過(guò)來(lái)為我所用,是為編程中的"拿來(lái)主義"。

  在這個(gè)例子中,如果我們還想玩得更大一點(diǎn),我們可以借鑒MFC中處理MESSAGE_MAP的方法,我們也可以學(xué)習MFC定義幾個(gè)精妙的宏來(lái)實(shí)現"消息映射"。
處理數字鍵

  用戶(hù)輸入數字時(shí)是一位一位輸入的,每一位的輸入都對應著(zhù)屏幕上的一個(gè)顯示位置(x坐標,y坐標)。此外,程序還需要記錄該位置輸入的值,所以有效組織用戶(hù)數字輸入的最佳方式是定義一個(gè)結構體,將坐標和數值捆綁在一起:

/* 用戶(hù)數字輸入結構體 */
typedef struct tagInputNum
{
 BYTE byNum; /* 接收用戶(hù)輸入賦值 */
 BYTE xPos; /* 數字輸入在屏幕上的顯示位置x坐標 */
 BYTE yPos; /* 數字輸入在屏幕上的顯示位置y坐標 */
}InputNum, *LPInputNum;


  那么接收用戶(hù)輸入就可以定義一個(gè)結構體數組,用數組中的各位組成一個(gè)完整的數字:

InputNum inputElement[NUM_LENGTH]; /* 接收用戶(hù)數字輸入的數組 */
/* 數字按鍵處理函數 */
extern void onNumKey(BYTE num)
{
if(num==0|| num==1) /* 只接收二進(jìn)制輸入 */
{
 /* 在屏幕上顯示用戶(hù)輸入 */
 DrawText(inputElement[currentElementInputPlace].xPos, inputElement[currentElementInputPlace].yPos, "%1d", num);
 /* 將輸入賦值給數組元素 */
 inputElement[currentElementInputPlace].byNum = num;
 /* 焦點(diǎn)及光標右移 */
 moveToRight();
}
}


  將數字每一位輸入的坐標和輸入值捆綁后,在數字鍵處理函數中就可以較有結構的組織程序,使程序顯得很緊湊。

  整理用戶(hù)輸入

  繼續第2節的例子,在第2節的onNumKey函數中,只是獲取了數字的每一位,因而我們需要將其轉化為有效數據,譬如要轉化為有效的XXX數據,其方法是:

/* 從2進(jìn)制數據位轉化為有效數據:XXX */
void convertToXXX()
{
 BYTE i;
 XXX = 0;
 for (i = 0; i < NUM_LENGTH; i++)
 {
  XXX += inputElement[i].byNum*power(2, NUM_LENGTH - i - 1);
 }
}


  反之,我們也可能需要在屏幕上顯示那些有效的數據位,因為我們也需要能夠反向轉化:

/* 從有效數據轉化為2進(jìn)制數據位:XXX */
void convertFromXXX()
{
 BYTE i;
 XXX = 0;
 for (i = 0; i < NUM_LENGTH; i++)
 {
  inputElement[i].byNum = XXX / power(2, NUM_LENGTH - i - 1) % 2;
 }
}


  當然在上面的例子中,因為數據是2進(jìn)制的,用power函數不是很好的選擇,直接用"<< >>"移位操作效率更高,我們僅是為了說(shuō)明問(wèn)題的方便。試想,如果用戶(hù)輸入是十進(jìn)制的,power函數或許是唯一的選擇了。

  總結

  本篇給出了鍵盤(pán)操作所涉及的各個(gè)方面:功能鍵處理、數字鍵處理及用戶(hù)輸入整理,基本上提供了一個(gè)全套的按鍵處理方案。對于功能鍵處理方法,將LCD屏幕與Windows窗口進(jìn)行類(lèi)比,提出了較新穎地解決屏幕、鍵盤(pán)繁雜交互問(wèn)題的方案。

  計算機學(xué)的許多知識都具有相通性,因而,不斷追趕時(shí)髦技術(shù)而忽略基本功的做法是徒勞無(wú)意的。我們最多需要"精通"三種語(yǔ)言(精通,一個(gè)在如今的求職簡(jiǎn)歷里泛濫成災的詞語(yǔ)),最佳拍檔是匯編、C、C++(或JAVA),很顯然,如果你"精通"了這三種語(yǔ)言,其它語(yǔ)言你應該是可以很快"熟悉"的,否則你就沒(méi)有"精通"它們.




評論


技術(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>