国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

C語言嵌入式系統(tǒng)編程修煉之鍵盤操作

2019-11-17 05:39:52
字體:
供稿:網(wǎng)友
處理功能鍵

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

C語言嵌入式系統(tǒng)編程修煉之鍵盤操作(圖一)
圖1 主畫面

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

C語言嵌入式系統(tǒng)編程修煉之鍵盤操作(圖二)
圖2 切換到設(shè)置XX畫面

  程序如何判定用戶處于哪一畫面,并在該畫面的程序狀態(tài)下調(diào)用對應(yīng)的功能鍵處理函數(shù),而且保證良好的結(jié)構(gòu),是一個值得思考的問題。

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

  我們從中學習到的就是:

  (1)將不同的畫面類比為WIN32中不同的窗口,將窗口中的各種元素(菜單、按鈕等)包含在窗口之中;

  (2)給各個畫面提供一個功能鍵"消息"處理函數(shù),該函數(shù)接收按鍵信息為參數(shù);

  (3)在各畫面的功能鍵"消息"處理函數(shù)中,判定按鍵類型和當前焦點元素,并調(diào)用對應(yīng)元素的按鍵處理函數(shù)。

/* 將窗口元素、消息處理函數(shù)封裝在窗口中 */
strUCt windows
{
 BYTE currentFocus;
 ELEMENT element[ELEMENT_NUM];
 void (*messageFun) (BYTE keyValue);
 …
};
/* 消息處理函數(shù) */
void messageFunction(BYTE keyValue)
{
 BYTE i = 0;
 /* 獲得焦點元素 */
 while ( (element [i].ID!= currentFocus)&& (i < ELEMENT_NUM) )
 {
  i++;
 }
 /* "消息映射" */
 if(i < ELEMENT_NUM)
 {
  switch(keyValue)
  {
   case OK:
    element[i].OnOk();
    break;
   …
  }
 }
}
  在窗口的消息處理函數(shù)中調(diào)用相應(yīng)元素按鍵函數(shù)的過程類似于"消息映射",這是我們從WIN32編程中學習到的。編程到了一個境界,很多東西都是相通的了。其它地方的思想可以拿過來為我所用,是為編程中的"拿來主義"。

  在這個例子中,假如我們還想玩得更大一點,我們可以借鑒MFC中處理MESSAGE_MAP的方法,我們也可以學習MFC定義幾個精妙的宏來實現(xiàn)"消息映射"。 處理數(shù)字鍵

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

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

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

InputNum inputElement[NUM_LENGTH]; /* 接收用戶數(shù)字輸入的數(shù)組 */
/* 數(shù)字按鍵處理函數(shù) */
extern void onNumKey(BYTE num)
{
if(num==0 num==1) /* 只接收二進制輸入 */
{
 /* 在屏幕上顯示用戶輸入 */
 DrawText(inputElement[currentElementInputPlace].xPos, inputElement[currentElementInputPlace].yPos, "%1d", num);
 /* 將輸入賦值給數(shù)組元素 */
 inputElement[currentElementInputPlace].byNum = num;
 /* 焦點及光標右移 */
 moveToRight();
}
}
  將數(shù)字每一位輸入的坐標和輸入值捆綁后,在數(shù)字鍵處理函數(shù)中就可以較有結(jié)構(gòu)的組織程序,使程序顯得很緊湊。

  整理用戶輸入

  繼續(xù)第2節(jié)的例子,在第2節(jié)的onNumKey函數(shù)中,只是獲取了數(shù)字的每一位,因而我們需要將其轉(zhuǎn)化為有效數(shù)據(jù),譬如要轉(zhuǎn)化為有效的XXX數(shù)據(jù),其方法是:


/* 從2進制數(shù)據(jù)位轉(zhuǎn)化為有效數(shù)據(jù):XXX */
void convertToXXX()
{
 BYTE i;
 XXX = 0;
 for (i = 0; i < NUM_LENGTH; i++)
 {
  XXX += inputElement[i].byNum*power(2, NUM_LENGTH - i - 1);
 }
}
  反之,我們也可能需要在屏幕上顯示那些有效的數(shù)據(jù)位,因為我們也需要能夠反向轉(zhuǎn)化:

/* 從有效數(shù)據(jù)轉(zhuǎn)化為2進制數(shù)據(jù)位: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;
 }
}
  當然在上面的例子中,因為數(shù)據(jù)是2進制的,用power函數(shù)不是很好的選擇,直接用"<< >>"移位操作效率更高,我們僅是為了說明問題的方便。試想,假如用戶輸入是十進制的,power函數(shù)或許是唯一的選擇了。

  總結(jié)

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 登封市| 汕尾市| 文成县| 美姑县| 博湖县| 贺兰县| 共和县| 长岭县| 蒙山县| 宾阳县| 潞城市| 香港| 汉沽区| 中阳县| 汝阳县| 都兰县| 台前县| 佳木斯市| 岱山县| 蒙山县| 平利县| 东山县| 临泽县| 鄄城县| 阳原县| 壤塘县| 洱源县| 兰溪市| 林甸县| 潞西市| 旬阳县| 湖南省| 来凤县| 上思县| 舒兰市| 张家港市| 兴义市| 新晃| 万源市| 谢通门县| 翁牛特旗|