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;
}

 

 

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