<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C語(yǔ)言嵌入式系統(tǒng)編程修煉之五:鍵盤(pán)操作!

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

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


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

          本文引用地址:http://www.ex-cimer.com/article/201611/320802.htm

          圖1 主畫(huà)面


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


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


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

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

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

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

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

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

          /* 將窗口元素、消息處理函數(shù)封裝在窗口中 */
          struct windows
          {
           BYTE currentFocus;
           ELEMENT element[ELEMENT_NUM];
           void (*messageFun) (BYTE keyValue);
           …
          };
          /* 消息處理函數(shù) */
          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;
             …
            }
           }
          }


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

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

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

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


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

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


            將數(shù)字每一位輸入的坐標(biāo)和輸入值捆綁后,在數(shù)字鍵處理函數(shù)中就可以較有結(jié)構(gòu)的組織程序,使程序顯得很緊湊。

            整理用戶輸入

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

          /* 從2進(jìn)制數(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ù)位,因?yàn)槲覀円残枰軌蚍聪蜣D(zhuǎn)化:

          /* 從有效數(shù)據(jù)轉(zhuǎn)化為2進(jìn)制數(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;
           }
          }


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

            總結(jié)

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

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




          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();