长短按单双击, 全功能代码,已验证


typedef enum Key_return
{
    key_return_none = 0 ,
    start_short_press,                //开始短按
    start_long_press,                 //开始长按
    start_double_press,               //开始双击
    start_double_and_long_press,      //开始双击并长按
    
    long_long_press_trig,             //连续长按(可设定连续返回的间隔时间)
    double_and_long_long_press_trig,  //开始双击并连续长按(可设定连续返回的间隔时间)
    
    end_short_press,                  //短按结束(释放)
    end_short_press_and_wait,          //短按结束并完成等待(短按松开后无操作一段时间,用于短按和双击共存的情况)
    end_long_press,                   //长按结束(释放)
    end_double_press,                 //双击结束(释放)
    end_double_and_long_press,        //双击并长按结束(释放)
    
}Key_return_t;


typedef enum Key_state
{
    key_state_none = 0,
    short_press_and_hold,         //短按中
    short_press_release,          //短按松开
    short_press_release_and_wait, //短按松开等待(短按松开后无操作一段时间,用于短按和双击共存的情况)
    long_press_and_hold,          //长按中
    long_press_release,           //长按松开
    double_press_and_hold,        //双击中
    double_press_and_long_hold,   //双击并长按中
}Key_state_t;
 

//----------------------------全功能------------------------------------
//单位10ms

#define Get_Key_Right() (PA5==0)
#define key_delay_count 2         //连续扫描消抖设置
#define key_long_count 35        //长短按时间阈值
#define key_long_trig_count 4    //连续长按触发返回的时间
#define key_double_delay_count 10  //双击,最大间隔设置,少于这个时间连续短按会被判断为双击


uint16_t  key_right_det_count;
Key_state_t   key_right_state;

Key_return_t Key_Right_det()
{
    if(Get_Key_Right())
    {
        key_right_det_count++;
        switch(key_right_state)
        {
            case key_state_none:{if(key_right_det_count>=key_delay_count){key_right_state=short_press_and_hold;key_right_det_count=0;return start_short_press;}}break;
            case short_press_and_hold:{if(key_right_det_count>=key_long_count){key_right_state=long_press_and_hold;key_right_det_count=0;return start_long_press;}}break;
            case short_press_release:{if(key_right_det_count>=key_delay_count){key_right_state=double_press_and_hold;key_right_det_count=0;return start_double_press;}}break;
            case long_press_and_hold:{if(key_right_det_count>=key_long_trig_count){key_right_det_count=0;return long_long_press_trig;}}break;
            case double_press_and_hold:{if(key_right_det_count>=key_long_count){key_right_state=double_press_and_long_hold;key_right_det_count=0;return start_double_and_long_press;}}break;
            case double_press_and_long_hold:{if(key_right_det_count>=key_long_trig_count){key_right_det_count=0;return double_and_long_long_press_trig;}}break;
            default:break;
        }
    }
    else
    {
        switch(key_right_state)
        {    
            case key_state_none:{key_right_det_count=0;}break;
            case short_press_and_hold:{key_right_det_count=0;key_right_state=short_press_release;return end_short_press;}break;
            case short_press_release:{key_right_det_count++;if(key_right_det_count>=key_double_delay_count){key_right_det_count=0;key_right_state=key_state_none;return end_short_press_and_wait;}}break;
            case long_press_and_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_long_press;}break;
            case double_press_and_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_double_press;}break;
            case double_press_and_long_hold:{key_right_det_count=0;key_right_state=key_state_none;return end_double_and_long_press;}break;
            default:break;
        }
    }
    return key_return_none;
}

//全功能
void Key_Right_func()
{
    switch(Key_Right_det())
    {
        case key_return_none:                  //无按键动作
            break;
        case start_short_press:                //开始短按
            break;
        case start_double_press:               //开始双击
            break;
        case start_long_press:                 //开始长按
            break;
        case start_double_and_long_press:      //开始双击并长按
            break;
        case long_long_press_trig:             //连续长按
            break;
        case double_and_long_long_press_trig:  //开始双击并连续长按
            break;
        case end_short_press_and_wait:         //短按结束并完成等待(短按结束后等待一点时间,可用于短按和双击共存)
            break;
        case end_short_press:                  //短按结束(释放)
            break;
        case end_double_press:                 //双击结束(释放)
            break;
        case end_long_press:                   //长按结束(释放)
            break;
        case end_double_and_long_press:        //双击并长按结束(释放)
            break;
        default:break;
    }
}

//不需要双击
void Key_Right_2func()
{
    switch(Key_Right_det())
    {
        case key_return_none:                  //无按键动作
            break;
        case start_short_press:                //开始短按
        case start_double_press:               //开始双击
            break;
        case start_long_press:                 //开始长按
        case start_double_and_long_press:      //开始双击并长按
            break;
        case long_long_press_trig:             //连续长按
        case double_and_long_long_press_trig:  //开始双击并连续长按
            break;
        case end_short_press_and_wait:         //短按结束并完成等待(短按结束后等待一点时间,可用于短按和双击共存)
            break;
        case end_short_press:                  //短按结束(释放)
        case end_double_press:                 //双击结束(释放)
            break;
        case end_long_press:                   //长按结束(释放)
        case end_double_and_long_press:        //双击并长按结束(释放)
            break;
        default:break;
    }
}

  • 28
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值