当 “滴答中” 和 “大循环” 神同步时,即 “大循环”运行到 “Key_Scan_GKPN_Run” 时,"滴答" 也恰好发生,
那么,就有可能在 “Key->KCC_EN=0” 后 “Key->KCC_EN=1” 前,“Key->KeyOnCount” 被 “滴答” 清零,
然后,按键就失灵了。
static void Key_Scan(Key_Para* Key,uint8_t KPN,GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==0)
{
Key->KCC_EN=0;//按键按下立即清除(松开)计数
if(Key->KeyOnCount>KEY_PRESS_TIME)
{
/*消抖方法为检测到按键被(持续)按下超过20ms*/
Key_Phy_Num|=KPN;//消抖完毕后记录被按下的按键的键值
if(Key->KeyOnCount>KEY_LONG_PRESS_TIME)
{
/*检测到按键被(持续)按下超过3秒*/
Key->KEY_LONG_PRESS=KPL_ENABLE;
Key->KOC_EN=0;
}
}
else
{
/*时间不够启动计数*/
Key->KOC_EN=1;
}
}
else
{
Key->KOC_EN=0;//按键松开立即清除(按下)计数
if(Key->KeyCloseCount>KEY_PRESS_TIME)
{
/*检测到(持续)松开20ms*/
Key->KEY_LONG_PRESS=KPL_DISABLE;//长按松开带消抖,普通单按和组合键松开不需要消抖
Key->KCC_EN=0;
}
else
{
Key->KCC_EN=1;
}
}
}
|