单片机按键功能:单击、双击、长按、三击

本文介绍了如何在单片机中实现按键的单击、双击、长按和三击功能。通过提供不同的函数,如`key_det`、`key_det_2`和`key_det_3`,实现了按键不同操作的消抖、计数和状态判断,确保了稳定可靠的按键事件识别。文章还提供了两种不同的代码实现方式,以适应多种按键功能需求,有助于单片机项目的开发。
摘要由CSDN通过智能技术生成

/*== ========================/*功能:单击 */ =================================*/

void key_det(void)
{
    if(key_1 == 0) //按下
    {
        if(++key_cnt>6)   //主循环10ms进来一次  作用:按下消抖  
        {
            if(key_flag == 0) //防止重复进入
            {
                key_flag = 1;
                led_1 = ~led_1;   //单击事件
            }
        }
    }
    else    //松开
    {

        if(key_cnt >= 6) key_cnt = 6;
        if(key_cnt != 0) --key_cnt;//防止松开抖动
    
        if(key_cnt == 0)    //防止重复进入
        {
            if(key_flag)
            {
                key_flag = 0;
            }
        }
    }
}

/*=============================/* 单击 双击 */================================*/

void key_det_2(void)
{
    
    if(click_flag)   //单击 
    {
        click_flag = 0;
        led_1 = ~led_1;
    }
    
    if(double_click_flag) //双击 
    {
        double_click_flag = 0;
        led_2 = ~led_2;
    }
    
    if(key_1 == 0)    //按下
    {
        if(++key_cnt_2 > 6)//主循环10ms进来一次 作用:按下消抖   
        {
            key_double_click_cnt = 0;
            if(key_flag_2 == 0)  //防止重复进入
            {
                key_flag_2 = 1;
            }
            else if(key_flag_2_1 == 1)
            {
                key_flag_2_1 = 0;
                double_click_flag = 1;   //300ms以内再次按下就判断为 双击事件
                key_double_flag = 1;    //该标志位置1 为了不触发单击
                key_flag_2 = 0;
            }
        }
    }
    else
    {
        if(key

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值