独立按键 单击、双击、三连击

该文介绍了一种在微控制器环境下,通过编程实现独立按键的单击、双击或多击检测的方法。利用定时器中断服务,设置不同的延迟时间和长按时间阈值,来区分不同的按键事件,并通过Key_Scan函数处理这些事件。当检测到特定的按键序列时,执行相应的操作,如蜂鸣器响应或LED状态改变。
摘要由CSDN通过智能技术生成

参考:2-5 按键进阶——独立按键的单击与双击(或多击)的编程实现_哔哩哔哩_bilibili

uchar KeyNum;
uchar key_lock_flag;
uint key_cnt;
uint key_cnt2;
uchar key_timers;

#define KEY_DELAY_TIME   20
#define KEY_LONG_TIME    1000
#define KEY_DOUBLE_TIME  500

void Key_Scan()
{
    if(!KEY1) //如果按键没有被按下
    {
        key_lock_flag=0; //清零自锁标志
        key_cnt=0; //清零计数标志
        if(key_times > 0) 
        {
            key_cnt2++;
            if(key_cnt2 > KEY_DOUBLE_TIME) //按下松开时间较长
            {
                if(key_times == 1)
                {
                   KeyNum=1;  //按键单击
                }
                key_cnt2=0; //清除双击时间间隔
                key_times=0; //清除按键次数
            }
        }
    }

    else if(!key_lock_flag) 
    {
        key_cnt++;
        if(key_cnt > KEY_DELAY_TIME)
        {
            key_cnt=0;
            key_cnt2=0;
            key_times++;
            key_lock_flag=1;

            if(key_times == 2)
            {
                KeyNum=11;  //按键双击
            }
            
            if(key_times == 2)
            {
                KeyNum=111;  //按键三连击
            }
        }
    }

    else if(key_cnt < KEY_LONG_TIME)
    {
        key_cnt++;   
    }


}

//定时器0中断服务函数(启动后每1MS进入一次)

void Timer0_ISR() interrupt 1 using 1
{
    Key_Scan();
}

void Key_Service()
{
    switch(KeyNum)
    {
        case 1:
			BUZZER_ON(); //单击 蜂鸣器响
		break;
		case 11:
			BUZZER_OFF();LED2_ON(); //双击 关闭蜂鸣器  LED2亮
		break;
		case 111:
			LED2_OFF(); //三击 LED2灯关
		break;
		default:break;   
    }
}

void main(void)
{
    //初始化....

    while(1)
	{	
        Key_Service();
    }

}

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值