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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)的狀態(tài)機(jī)消抖

          51單片機(jī)的狀態(tài)機(jī)消抖

          作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
          下午把狀態(tài)機(jī)無(wú)延時(shí)按鍵消抖弄到51單片機(jī)上面,下面曬一下程序:
          #include
          enum State {Init, Press, Free}; //定義按鍵狀態(tài)的枚舉類(lèi)型
          enum State Key_State; //按鍵狀態(tài)
          sbit Key1 = P2^4;
          sbit Key2 = P2^5;
          sbit Key3 = P2^6;
          sbit Key4 = P2^7;
          void Delay_ms(unsigned int x)
          {
          int i,j;
          for(i=0; i<110; i++)
          for(j=0; j
          ;
          }
          //===============================================================================
          //函數(shù)名稱:鍵盤(pán)掃描(狀態(tài)機(jī)無(wú)延時(shí)消抖)
          //說(shuō)明:鍵盤(pán)接口對(duì)應(yīng): key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7
          //參數(shù):
          //返回值:
          //日期:2011-6-22
          //修改:
          //===============================================================================
          void Keyscan(void)
          {
          switch (Key_State)
          {
          case Init : // 按鍵初始態(tài)
          if((P2 | 0x0f) != 0xff)
          {
          Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾
          }
          break;
          case Press : // 按鍵確認(rèn)態(tài)
          if((P2 | 0x0f) != 0xff) //如有鍵按下則不是干擾,判斷鍵值
          {
          //判斷是哪一個(gè)按鍵被按下
          if( (P2 | 0xef) != 0xff ) //第一個(gè)鍵被按下
          {
          P1 = 0xfe;
          Delay_ms(500);
          P1 = 0xff;
          }
          if( (P2 | 0xdf) != 0xff ) //第二個(gè)鍵被按下
          {
          P1 = 0xfd;
          Delay_ms(500);
          P1 = 0xff;
          }
          if( (P2 | 0xbf) != 0xff ) //第三個(gè)鍵被按下
          {
          P1 = 0xfb;
          Delay_ms(500);
          P1 = 0xff;
          }
          if( (P2 | 0x7f) != 0xff ) //第四個(gè)鍵被按下
          {
          P1 = 0xf7;
          Delay_ms(500);
          P1 = 0xff;
          }
          Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
          }
          else
          {
          Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          case Free :
          if((P2 | 0x0f) == 0xff) //判斷按鍵是否釋放
          {
          Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          }
          }
          這是另外一種,其實(shí)都差不多,只不過(guò)比較直觀而已。
          void Keyscan(void)
          {
          switch (Key_State)
          {
          case Init : // 按鍵初始態(tài)
          if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))
          {
          Key_State = Press; // 鍵被按下,但需要確認(rèn)是否是干擾
          }
          break;
          case Press : // 按鍵確認(rèn)態(tài)
          if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) //如有鍵按下則不是干擾,判斷鍵值
          {
          //判斷是哪一個(gè)按鍵被按下
          if(Key1 == 0) //第一個(gè)鍵被按下
          {
          P1 = 0xfe;
          Delay_ms(500);
          P1 = 0xff;
          }
          if((Key2 == 0)) //第二個(gè)鍵被按下
          {
          P1 = 0xfd;
          Delay_ms(500);
          P1 = 0xff;
          }
          if((Key3 == 0)) //第三個(gè)鍵被按下
          {
          P1 = 0xfb;
          Delay_ms(500);
          P1 = 0xff;
          }
          if((Key4 == 0)) //第四個(gè)鍵被按下
          {
          P1 = 0xf7;
          Delay_ms(500);
          P1 = 0xff;
          }
          Key_State = Free; // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
          }
          else
          {
          Key_State = Init; // 按鍵已抬起,屬于干擾,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          case Free :
          if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判斷按鍵是否釋放
          {
          Key_State = Init; //如果按鍵釋放,轉(zhuǎn)換到按鍵初始態(tài)
          }
          break;
          }
          }


          評(píng)論


          技術(shù)專(zhuān)區(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); })();