在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 長按鍵C語言程序

            長按鍵C語言程序

            作者: 時間:2013-12-10 來源:網絡 收藏

            一共用了四個按鈕.
            #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函數的為基礎的,該頻率是定時器2的定時值決定的
            //短按鍵的計數值,只有當按鍵檢測計數器計數大于等于此值時才認為是一次短按
            #define _KEY_SHORT_CNTR (2)
            //的計數值,只有當按鍵檢測計數器計數大于等于此值時才認為是一次長按
            #define _KEY_LONG_CNTR (_KEY_SHORT_CNTR * 3)
            //無按鍵按下時的按鍵檢測間隔,用于按鍵消抖動
            #define _KEY_NORMAL_DEVIDER (2)

            //此值用于按鈕長按后,按鈕檢測函數的執(zhí)行頻率
            #define _ADDMIN_FAST_DEVIDER (15)
            //此值用于按鈕短按后,按鈕檢測函數的執(zhí)行頻率
            #define _ADDMIN_LONG_DEVIDER (_ADDMIN_FAST_DEVIDER * 3)
            //此值用于設置蜂鳴器鳴響時間
            #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) //運行狀態(tài), 所有按鍵都無效
            return;

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

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

            //這個按鈕是可以重復進入的, 長按后先低頻率動作, 當動作幾次后再高頻率動作
            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)
            {
            ...
            }

            //這個按鈕是不可重復進入的, 就是說只有抬起后再按下才動作
            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; //禁止重復執(zhí)行
            }

            //這個按鈕是要在按鈕抬起后才執(zhí)行其他函數的
            if(IsKeyDown(_PIN(_TO_KEY_RUN), _KEY_RUN))
            {
            ++RunCntr;
            }
            else
            {
            RunCntr = 0;
            if(LastRunState) //表明鍵已經按下后才抬起的
            {
            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; //禁止重復執(zhí)行
            }

            DevCntr = _KEY_NORMAL_DEVIDER;
            }



            評論


            技術專區(qū)

            關閉