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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 凌陽61單片機之按鍵無延時消抖(采用狀態(tài)機編程思想

          凌陽61單片機之按鍵無延時消抖(采用狀態(tài)機編程思想

          作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
          無延時消抖在另一篇博文已經(jīng)有詳細的說明,這里不再贅述。
          在學(xué)習(xí)FPGA時,覺得狀態(tài)機這種編程思想非常好,可以很充分地利用CPU的資源。
          大的單片機工程,或者實時性較強的工程,采用狀態(tài)機編程思想可以很好解決一些問題,例如:
          鍵盤掃描,蜂鳴器報警,LED燈閃爍等等。
          下面是小弟昨晚用狀態(tài)機編程思想寫的基于凌陽61單片機之下,按鍵無延時消抖程序。
          程序的按鍵還是有點小抖動,主要是因為主程序執(zhí)行的任務(wù)少,跳入鍵盤掃描時間短。
          現(xiàn)在才發(fā)現(xiàn)C里面的枚舉類型可以用來干嘛、、、
          放于狀態(tài)機這塊剛剛好。
          #include "SPCE061A.H"
          enum State {Init, Press, Free};
          enum State Key_State; //按鍵狀態(tài)
          unsigned char Key_Press; //按鍵值
          void Keyscan(void)
          {
          switch (Key_State)
          {
          case Init : // 按鍵初始態(tài)
          if((*P_IOA_Data & 0x0007) != 0)
          {
          Key_State = Press; // 鍵被按下,但需要確認是否是干擾
          }
          break;
          case Press : // 按鍵確認態(tài)
          if((*P_IOA_Data & 0x0007) != 0) //如有鍵按下則不是干擾,判斷鍵值
          {
          //判斷是哪一個按鍵被按下
          if( (*P_IOA_Data & 0x0001) != 0 ); //第一個鍵被按下
          {
          *P_IOB_Data = ~*P_IOB_Data;
          }
          if( (*P_IOA_Data & 0x0003) != 0 ); //第二個鍵被按下
          {
          *P_IOB_Data = ~*P_IOB_Data;
          }
          if( (*P_IOA_Data & 0x0007) != 0 ); //第三個鍵被按下
          {
          *P_IOB_Data = ~*P_IOB_Data;
          }
          Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
          }
          else
          {
          Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          case Free :
          if((*P_IOA_Data & 0x0007) == 0) //判斷按鍵是否釋放
          {
          Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          }
          }
          void Board_Init(void)
          {
          //設(shè)置A口為帶下拉電阻的輸入 IO初始化開始
          *P_IOB_Dir=0xFFFF; //output
          *P_IOB_Attrib=0xFFFF;
          *P_IOB_Data=0xFFFF;
          Key_Press = 1;
          Key_State = 0;
          }
          int main()
          {
          Board_Init();
          while(1)
          {
          Keyscan();
          *P_Watchdog_Clear = C_WDTCLR;
          }
          return 0;
          }



          評論


          技術(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); })();