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

          新聞中心

          長按鍵C語言程序

          作者: 時間:2013-12-10 來源:網(wǎng)絡(luò) 收藏

          一共用了四個按鈕.
          #define _KEYDOWN_TEST_TIME (20)
          unsigned char IsKeyDown(volatile unsigned char Value, unsigned char pin)
          {
          unsigned long CurState = 0, i;
          for(i = 0; i _KEYDOWN_TEST_TIME; ++i)
          CurState += _GET_BIT(Value, pin)? 0:1; //鍵盤接了上拉電阻,低電平才是按下

          if(CurState == _KEYDOWN_TEST_TIME)
          return 1;

          return 0;
          }

          //以下所有值均是以 DealWithKey函數(shù)的為基礎(chǔ)的,該頻率是定時器2的定時值決定的
          //短按鍵的計數(shù)值,只有當(dāng)按鍵檢測計數(shù)器計數(shù)大于等于此值時才認(rèn)為是一次短按
          #define _KEY_SHORT_CNTR (2)
          //的計數(shù)值,只有當(dāng)按鍵檢測計數(shù)器計數(shù)大于等于此值時才認(rèn)為是一次長按
          #define _KEY_LONG_CNTR (_KEY_SHORT_CNTR * 3)
          //無按鍵按下時的按鍵檢測間隔,用于按鍵消抖動
          #define _KEY_NORMAL_DEVIDER (2)

          //此值用于按鈕長按后,按鈕檢測函數(shù)的執(zhí)行頻率
          #define _ADDMIN_FAST_DEVIDER (15)
          //此值用于按鈕短按后,按鈕檢測函數(shù)的執(zhí)行頻率
          #define _ADDMIN_LONG_DEVIDER (_ADDMIN_FAST_DEVIDER * 3)
          //此值用于設(shè)置蜂鳴器鳴響時間
          #define _BEEPER_DEVIDER (10)
          void DealWithKey(void)
          {
          static unsigned int AddCntr = 0;
          static unsigned int MinCntr = 0;
          static unsigned int UnitCntr = 0;
          static unsigned int RunCntr = 0;

          static unsigned char BeepCntr = 0;

          static unsigned int DevCntr = 0;

          static unsigned char LastRunState = 0;

          unsigned char temp;

          if(g_State != Setting) //運(yùn)行狀態(tài), 所有按鍵都無效
          return;

          if(BeepCntr > 0) //處理蜂鳴器
          --BeepCntr;
          else
          _BEEPER_OFF;

          if(DevCntr) //按鍵處理分頻器
          {
          --DevCntr;
          return;
          }

          //這個按鈕是可以重復(fù)進(jìn)入的, 長按后先低頻率動作, 當(dāng)動作幾次后再高頻率動作
          AddCntr = IsKeyDown(_PIN(_TO_KEY_ADD), _KEY_ADD)? AddCntr + 1 : 0;
          if((temp = (AddCntr >= _KEY_LONG_CNTR)) || AddCntr >= _KEY_SHORT_CNTR)
          {
          ...
          }

          //同上
          MinCntr = IsKeyDown(_PIN(_TO_KEY_MIN), _KEY_MIN)? MinCntr + 1 : 0;
          if((temp = (MinCntr >= _KEY_LONG_CNTR)) || MinCntr >= _KEY_SHORT_CNTR)
          {
          ...
          }

          //這個按鈕是不可重復(fù)進(jìn)入的, 就是說只有抬起后再按下才動作
          UnitCntr = IsKeyDown(_PIN(_TO_KEY_UNIT), _KEY_UNIT)? UnitCntr + 1 : 0;
          if(UnitCntr == _KEY_SHORT_CNTR)
          {
          ...
          }
          else if(UnitCntr > _KEY_SHORT_CNTR)
          {
          UnitCntr = _KEY_SHORT_CNTR + 1; //禁止重復(fù)執(zhí)行
          }

          //這個按鈕是要在按鈕抬起后才執(zhí)行其他函數(shù)的
          if(IsKeyDown(_PIN(_TO_KEY_RUN), _KEY_RUN))
          {
          ++RunCntr;
          }
          else
          {
          RunCntr = 0;
          if(LastRunState) //表明鍵已經(jīng)按下后才抬起的
          {
          LastRunState = 0;
          g_State = EmptyInflatting;
          }
          }
          if(RunCntr == _KEY_SHORT_CNTR)
          {
          BeepCntr = _BEEPER_DEVIDER;
          _BEEPER_ON;
          LastRunState = 1; //此鍵是抬起時生效.
          }
          else if(RunCntr > _KEY_SHORT_CNTR)
          {
          RunCntr = _KEY_SHORT_CNTR + 1; //禁止重復(fù)執(zhí)行
          }

          DevCntr = _KEY_NORMAL_DEVIDER;
          }



          評論


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