×
单片机 > 单片机程序设计 > 详情

STM32 状态机实现按键消抖处理源码

发布时间:2020-08-26 发布时间:
|

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


**描 述       : 按键状态机

**                     

********************************************************************************************************/


#define KEY_GLOBALS


#include 


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

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容