当前位置:   article > 正文

stm32 按键 单机 双击 长按_stm32按键双击

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 UP_KEY_Count                    120

#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)//消抖值
            {
                time_num++;
                if(KEY_Count_time[i] >= Long_press_time_MAX)
                {
                    KEY_event[i] = KEY_Long_return;
                }
                else
                {
                    if(time_num > 1000)
                    {
                        KEY_Count_time[i]++;
                        time_num = 0;
                    }
                }
                if(KEY_up_clsse_time[i] != 0)
                {
                    KEY_up_clsse_time[i] = 0;
                    KEY_Count_down[i]++;
                }
            }
            else
            {
                KEY_Dithering[i]++;
                KEY_Read[i] = 0; //按键刷新
            }

        }
        else//按键松开
        {
            KEY_up_clsse_time_num++;
            if(KEY_up_clsse_time_num > 1000)
            {
                KEY_up_clsse_time_num = 0;
                ++KEY_up_clsse_time[i];
            }

            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] >= 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;
                }
                else if((KEY_Count_time[i] > 10) && 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
                {
                    KEY_up_clsse_time[i] = 0;
                    KEY_Count_time[i] = 0; //按键计时更新
                    KEY_Dithering[i] = 0;//消抖更新
                    KEY_Read[i] = 0; //按键刷新
                    KEY_Count_down[i] = 0;
                }
            }

        }

    }

}

char btn1_status1()
{
    return  KEY_event[KEY1_adder    ];
}
void btn1_status1_clean()
{
    KEY_event[KEY1_adder    ] = 0;
}

调用:

        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某位大佬,一下子找不到链接了,等到找补上:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/788123
推荐阅读
相关标签
  

闽ICP备14008679号