判断按键按下的次数

// 按键宏定义,根据实际测试进行修改
// 实际时间为:数值*10ms (按键扫描)
#define K_Dou_Time 2    // 按键消抖时间 20ms
#define K_Long_Time 100 // 按键长按判定 1S
#define K_Lian_Time 50  // 按键连击时间 500ms
// 按键连击时间是指按键释放后到再次按下的时间间隔
// 按键长按及单击,多击检测
// 此函数需要10ms执行一次(大概范围即可)
void KEY1_Scan()
{
    static u8 cnt = 0;     // 用于按键按下计时
    static u8 Fcnt = 0;    // 用于按键连击倒计时
    static u8 KEY_cnt = 0; // 用于记录按键按下次数
    if (PIN_KEY == 0)      // 按键按下,时间增加
    {
        cnt++; // 按键按下时间
    }
    else // 按键释放/没有按下按键/按键抖动
    {
        // if(cnt>K_Long_Time)//说明是长按,长按时间
        // {
        // 	P2=0X00;//按键按下次数用P2口展示
        // }
        if (cnt > K_Dou_Time) // 如果大于抖动时间,认为是短按/多个短按
        {
            KEY_cnt++;          // 按键按下次数加一
            Fcnt = K_Lian_Time; // 重新开始倒计时
        }
        cnt = 0;  // 按键按下时间变量清除
        if (Fcnt) // 如果大于0,才能递减,Fcnt变量一定会减为0。
        {
            Fcnt--;
            if (Fcnt == 0) // 如果减到0了,说明按键已经 K_Lian_Time 没有按下了
            {
                if (KEY_cnt == 1)   //按下一次
                {
                    msg = SWITCH_STATUS_MODE;
                }
                else if (KEY_cnt == 3)  //按下3次
                {
                    msg = SWITCH_STATUS_LOCK;
                }
                else if (KEY_cnt == 5)  //按下5次
                {
                    msg = SWITCH_STATUS_POWER;
                }
                KEY_cnt = 0; // 记录按键按下次数的变量,必须被清除
            }
        }
    }
}
  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wiyoo0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值