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

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是一种嵌入式微控制器,具有灵活的输入输出引脚。使用STM32可以方便地实现按键的单击、双击按功能。 实现按键单击功能的方法是,在程序中通过轮询检测按键引脚的电平状态。当检测到按键引脚的电平从高变低时,就可以认为发生了按键单击事件。在处理事件的代码中可以执行相应的操作,比如控制LED灯亮起或熄灭。 要实现按键双击功能,可以利用计时器和中断。当按键引脚由高电平变为低电平时,启动计时器,并设置一个适当的时间阈值。在计时器中断中断中,检查按键引脚的电平状态,如果在规定的时间内再次检测到低电平,就可以认为发生了双击事件。在处理双击事件的代码中,可以执行相应的操作,如切换LED灯的状态。 要实现按键按功能,也可以利用计时器和中断。当按键引脚由高电平变为低电平时,启动计时器,并设置一个较的时间阈值。在计时器中断中,检查按键引脚的电平状态,如果在规定的时间内仍然保持低电平,就可以认为发生了按事件。在处理按事件的代码中,可以执行相应的操作,如控制LED灯持续亮起或熄灭,或者是执行其他功能。 总结来说,通过对STM32的输入输出引脚进行轮询检测,并结合计时器和中断的使用,可以实现按键的单击、双击按功能。这种灵活和可编程性是STM32在嵌入式系统中广泛应用的原因之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值