新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的狀態機消抖

        51單片機的狀態機消抖

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


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 嘉祥县| 丹东市| 宜川县| 章丘市| 会泽县| 亳州市| 阳西县| 彰武县| 庐江县| 安仁县| 保定市| 讷河市| 玉山县| 赣州市| 建始县| 秀山| 涿州市| 青海省| 辽阳县| 曲麻莱县| 沛县| 赞皇县| 彝良县| 安远县| 阿尔山市| 曲麻莱县| 长沙市| 高唐县| 辽源市| 南华县| 丹阳市| 武功县| 香河县| 清新县| 密云县| 沽源县| 海丰县| 盐亭县| 中西区| 阜新| 古交市|