STM32按键操作指南:单击、双击和长按处理方法

#define double_time_MIN       500  //双击按键,在这个时间范围内,按下两次则认为有效
#define Long_press_time_MAX   1000  //长按,超过这个时间则认为是长按;
#define Dithering_MIN         5  //消抖值

#define KEY_DOWN_return           1  //单击
#define KEY_Double_return         2  //双击
#define KEY_Long_return           3  //长按
#define KEY_LONG_FREE_return      6  //长按结束#define UP_KEY_Count        200  //抬起值

#define KEY_UP      1//按键抬起
#define KEY_Down    0//按键按下

#define KEY_Number_MAX  1 //按键个数,开辟多少字节数组

#define KEY1_adder    0 //按键计数数组地址
//#define KEY2_adder   1 //按键计数数组地址
//#define KEY3_adder   2 //按键计数数组地址

#define  Read_Key1_Value    GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)//读取按键1的值

unsigned int  KEY_Count_time[KEY_Number_MAX];//按键计时,调用的时候,要填按键地址,避免重复
unsigned char KEY_up_clsse_time[KEY_Number_MAX];//按键抬起取消计时,
unsigned char KEY_Count_down[KEY_Number_MAX];//按键按下次数
unsigned char KEY_Dithering[KEY_Number_MAX];//按键消抖

unsigned char KEY_event[KEY_Number_MAX];//按键的事件
unsigned char KEY_Read[KEY_Number_MAX];//按键读取状态

/*
    * @name   Button_all_state
    * @brief  MUC按键检测
    * @param
    * @retval None
    * othen: 历遍所有的按键
*/
void  Button_all_state()
{

    KEY_Read[KEY1_adder] = Read_Key1_Value;
    //  KEY_event[KEYX_adder]=Read_KeyX_Value;
}
/*
    * @name   KEY_Detect
    * @brief
    * @param
    * @retval None
    * othen:按键检查函数,传递不同的值,实现不同的按键按下
*/
void  KEY_Detect()
{
    unsigned char i = 0;
    Button_all_state();//更新按键状态

    for(i = 0; i < KEY_Number_MAX; i++) //历遍
    {
        if(KEY_Read[i] == KEY_Down) //按键按下
        {

            if(KEY_Dithering[i] > Dithering_MIN)//消抖值
            {

                if(KEY_Count_time[i] >= Long_press_time_MAX)
                {
                    KEY_event[i] = KEY_Long_return;
                }
                else
                {
                    KEY_Count_time[i]++;
                }
                if(KEY_up_clsse_time[i] != 0)
                {
                    KEY_up_clsse_time[i] = 0;
                    KEY_Count_down[i]++;
//                                                                    KEY_up_clsse_time[i] = 0;
//                KEY_Count_time[i] = 0; //按键计时更新
//                KEY_Dithering[i] = 0;//消抖更新
//                KEY_Read[i] = 0; //按键刷新
//                KEY_Count_down[i] = 0;
                }
            }
            else
            {
                KEY_Dithering[i]++;
                KEY_Read[i] = 0; //按键刷新
            }

        }
        else//按键松开
        {

            if(++KEY_up_clsse_time[i] > UP_KEY_Count)   //按键抬起
            {

                if((KEY_Count_time[i] < double_time_MIN) && (KEY_Count_down[i] >= 2))     //双击
                {
                    KEY_event[i] =  KEY_Double_return;
                    KEY_up_clsse_time[i] = UP_KEY_Count;
                    KEY_up_clsse_time[i] = 0;
                    KEY_Count_time[i] = 0; //按键计时更新
                    KEY_Dithering[i] = 0;//消抖更新
                    KEY_Read[i] = 0; //按键刷新
                    KEY_Count_down[i] = 0;
                }
                else if((KEY_Count_time[i] > 1) && KEY_Count_down[i] < 2) //单击
                {
                    KEY_event[i] = KEY_DOWN_return ;
                    KEY_up_clsse_time[i] = UP_KEY_Count;
                    KEY_up_clsse_time[i] = 0;
                    KEY_Count_time[i] = 0; //按键计时更新
                    KEY_Dithering[i] = 0;//消抖更新
                    KEY_Read[i] = 0; //按键刷新
                    KEY_Count_down[i] = 0;
                }
                else if(KEY_Count_time[i] > Long_press_time_MAX)  //长按抬起
                {
                    KEY_event[i] = KEY_LONG_FREE_return;
                    KEY_up_clsse_time[i] = UP_KEY_Count;
                    //                KEY_up_clsse_time[i] = 0;
                    KEY_Count_time[i] = 0; //按键计时更新
                    KEY_Dithering[i] = 0;//消抖更新
                    KEY_Read[i] = 0; //按键刷新
                    KEY_Count_down[i] = 0;
                }
                KEY_up_clsse_time[i] = 0;
                KEY_Count_time[i] = 0; //按键计时更新
                KEY_Dithering[i] = 0;//消抖更新
                KEY_Read[i] = 0; //按键刷新
                KEY_Count_down[i] = 0;
            }
//                        if()

        }

    }
}

调用:

        KEY_Detect();
        if(btn1_status1() ==  KEY_DOWN_return)
        {
            printf("单击\r\n");
            btn1_status1_clean();
        }
        else if(btn1_status1() ==  KEY_Double_return)
        {
            printf("双击\r\n");
            btn1_status1_clean();
        }
        else if(btn1_status1() ==  KEY_Long_return)
        {
            printf("长按\r\n");
           btn1_status1_clean();
        }

参考csdn某位大佬,一下子找不到链接了,等到找补上:

作者:john.feng

物联沃分享整理
物联沃-IOTWORD物联网 » STM32按键操作指南:单击、双击和长按处理方法

发表评论