新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 長按鍵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)

        //此值用于按鈕長按后,按鈕檢測函數的執行頻率
        #define _ADDMIN_FAST_DEVIDER (15)
        //此值用于按鈕短按后,按鈕檢測函數的執行頻率
        #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) //運行狀態, 所有按鍵都無效
        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; //禁止重復執行
        }

        //這個按鈕是要在按鈕抬起后才執行其他函數的
        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; //禁止重復執行
        }

        DevCntr = _KEY_NORMAL_DEVIDER;
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 保康县| 舞钢市| 江门市| 虎林市| 罗定市| 奉节县| 乌兰浩特市| 尖扎县| 盐城市| 青铜峡市| 崇明县| 芦溪县| 丹江口市| 都匀市| 彭州市| 澄迈县| 铜川市| 汝城县| 电白县| 万年县| 阜平县| 木里| 剑阁县| 平湖市| 娱乐| 达州市| 无锡市| 黄龙县| 肥西县| 大邑县| 抚松县| 南皮县| 常德市| 西盟| 依兰县| 仁化县| 湛江市| 会理县| 格尔木市| 宁城县| 海阳市|