u8 key_return = NO_KEY; u8 key_tmp = NO_KEY; u8 key_lock = 0;//按鍵自鎖標誌,自己加的 if (key_val == NO_KEY || key_val != key_ctl.key_val) //按鍵沒有按下或者本次按鍵與上一次按鍵不相 ...
u8 key_return = NO_KEY;
u8 key_tmp = NO_KEY;
u8 key_lock = 0;//按鍵自鎖標誌,自己加的
if (key_val == NO_KEY || key_val != key_ctl.key_val) //按鍵沒有按下或者本次按鍵與上一次按鍵不相同
{
if (key_ctl.key_up < KEY_UP_TIMES) //抬鍵防抖延時
{
key_ctl.key_up++;//抬鍵計數
}
else
{
if (key_ctl.key_cnt >= KEY_LONG_TIMES) { //長按抬鍵
key_return = key_ctl.key_val | T_KEY_LONG_UP;
} else if (key_ctl.key_cnt >= KEY_SCAN_TIMES) { //短按抬鍵
key_return = key_ctl.key_val | T_KEY_SHORT_UP;
}
key_tmp = key_ctl.key_val;
key_ctl.key_val = key_val; //把最後一次的按鍵存起來,留待下次使用
key_ctl.key_cnt = 0; //按鍵計時清0
key_lock = 0;
}
}
else
{
key_ctl.key_cnt++;
if (key_ctl.key_cnt == KEY_SCAN_TIMES && key_lock == 0) { //去抖
key_ctl.key_up = 0;
key_lock = 1;//自鎖標誌置1,防止按住按鍵不鬆手後一直觸發
key_return = key_ctl.key_val | T_KEY_SHORT; //短按,暫存按鍵值
} else if (key_ctl.key_cnt == KEY_LONG_TIMES && key_lock == 0) { //長按
key_lock = 1;
key_return = key_ctl.key_val | T_KEY_LONG;
} else if (key_ctl.key_cnt == KEY_LONG_HOLD_TIMES && key_lock == 0) { //連按
key_lock = 1;
key_return = key_ctl.key_val | T_KEY_HOLD;
key_ctl.key_cnt = KEY_LONG_TIMES;
}
key_tmp = key_ctl.key_val;
}
if(key_tmp > 0x1f && key_return >= 0x80) //32-127這些鍵值不支持長按
{
key_return = NO_KEY;
}
return key_return;