C语言,在定时器中断模式中,单个按键 连续按下两次(开关灯) 和长时间按下(开关灯)功能

这篇博客详细介绍了如何使用定时器中断来实现按键防抖功能,通过设置1ms中断周期,在程序中进行防抖判断。同时,博主展示了按键按下和松开模式的处理逻辑,包括短按、长按及连续两次按键的功能,并实现了LED灯的开关控制。
摘要由CSDN通过智能技术生成

1.定时器中断设置:由于按键按下可能有抖动,所以我设置的时间为1ms进入一次,这样的话可以在程序中加点防抖判断。

2:定时器中断回调函数:

void hx_keyset_timer_(eTIMER_IDX TimerIdx){        
    static uint16_t KEYNUM_1 = 0;        //按键按下计数
    static uint16_t KEYNUM_2 = 0;        //按键松开计数
    static uint8_t keyflag1 = 0;        //第二次按键按下标志位    0:无按键按下  1:双键按下标志位
    static bool KEY_PWR = false;        //模拟灯的开关
    static bool keyflag2 = true;        //模式选择,按下模式和松开模式(初始按下模式)
    if(keyflag2){        //按下模式
        if(user_gpio_get_value(KEY_GPIO)==0){    
            KEYNUM_1++;            //有按下则加
            if(keyflag1){        //
                if(KEYNUM_1>100){        //有第二个按键按下100ms触发连续两次按下功能
                    KEY_PWR = ~KEY_PWR;
                    user_gpio_set_mode(LED_GPIO, GPIO_MODE_OUT);    //输出模式
                    user_gpio_set_value(LED_GPIO, KEY_PWR);            //控制灯的开关
                    key_release_();        //等待按键松开
                    keyflag1 = 0;
                    keyflag2 = true;
                    KEYNUM_1 = 0;
                    KEYNUM_2 = 0;
                    return;
                }    
            }
            if(KEYNUM_1>3000){            //长按3s开关灯
                KEY_PWR = ~KEY_PWR;
                user_gpio_set_mode(LED_GPIO, GPIO_MODE_OUT);
                user_gpio_set_value(LED_GPIO, KEY_PWR);
                key_release_();        //等待按键松开
                keyflag1 = 0;
                keyflag2 = true;
                KEYNUM_1 = 0;
                KEYNUM_2 = 0;
                return;
            }
        }else{            //按下模式下按键松开则设置为松开模式
            if(KEYNUM_1>10)        //按键防抖
                keyflag2 = false;
        }
    }else{                //松开模式
        if(user_gpio_get_value(KEY_GPIO)==1){
            KEYNUM_2++;
            if(KEYNUM_2>1000){            //松开时长超过1s退出
                keyflag1 = 0;
                keyflag2 = true;
                KEYNUM_1 = 0;
                KEYNUM_2 = 0;
            }
        }else{            //松开模式下有按键按下
            if((KEYNUM_2<700)&&(KEYNUM_2>10))    //松开时长在10ms和700ms之间在在按下(说明有连续第二个按下)
                keyflag1 = 1;
                keyflag2 = true;
                KEYNUM_1 = 0;
                KEYNUM_2 = 0;        
        }
    }
}    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值