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;
}
}
}