STM32 狀態機實現按鍵消抖處理源碼

key.h

#ifndef __KEY_H__
#define __KEY_H__

#include "stm32f10x.h"

#ifdef KEY_GLOBALS
#define KEY_EXT
#else
#define KEY_EXT extern
#endif


//IO定義
#define     down()          GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)    //PA1


KEY_EXT void key_down(void);


#endif

 

key.c

/****************************************Copyright (c)**************************************************
**                                                      他鄉&學子
**                                      
**
**                                 https://blog.csdn.net/weixin_40779546/article/details/81776171
**
**--------------文件信息--------------------------------------------------------------------------------
**文件名    : key.c
**創 建人   : 他鄉&學子
**創建日期: 2016年6月13日
**描 述       : 按鍵狀態機
**                     
********************************************************************************************************/

#define KEY_GLOBALS

#include  <stdio.h>

#include "key.h"

enum KEY_STATE{KEY_IDLE=10,FILTER,PRESS,RELEASE};

unsigned char key_state = KEY_IDLE;
unsigned char key_state_tick = 0;
void key_down(void)

    switch(key_state) {
        case KEY_IDLE:
        if(0 == down()){//有按鍵
            key_state = FILTER;
            key_state_tick = 0;
        }               
        break;

        case FILTER:            
        if(0 == down()) {//判斷是否爲按鍵
            key_state_tick ++;
            if(key_state_tick > 3){//按鍵時間大於50ms。

              //按鍵按下後的任務處理

              
                key_state = PRESS;
                key_state_tick = 0;//記錄處理鍵盤時刻,假設這是第一次。
            }
        } else {//按鍵的去抖動
            key_state = KEY_IDLE;    
            key_state_tick = 0;       
        }
        break;

        case PRESS:         
        if(0 != down()){ //key release  鬆手
            key_state = KEY_IDLE;                             
        }          
        break;
        default:
        key_state = FILTER;
        break;
    }//end swtich;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章