標(biāo)題: STM8單片機(jī)按鍵 短按 雙擊 長按源代碼 [打印本頁]
作者: 131415yy 時間: 2018-10-10 11:52
標(biāo)題: STM8單片機(jī)按鍵 短按 雙擊 長按源代碼
在STM8單片機(jī)上面實(shí)現(xiàn)代碼為:
//按鍵按下去會出現(xiàn)下降沿,設(shè)置按鍵IO口GPIOB4所在的外部端口B下降沿觸發(fā)中斷
void exit_init(void)
{
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY);
}
//按鍵按下中斷服務(wù)程序
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
{
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按鍵下降沿
{
key_fall_flag = 1;//生成按鍵按下標(biāo)志
}
}
//周期1ms的定時器中斷服務(wù)程序
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23)
{
if(key_fall_flag==1)//發(fā)生按鍵按下事件
{
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按鍵持續(xù)按下
{
if(key_holdon_ms <= 2000)
{
key_holdon_ms++;
}
else //按鍵按下到2000ms就判斷長按時間成立,生成長按標(biāo)志
{
key_holdon_ms = 0;
short_key_flag=0;//清短按鍵標(biāo)志
key_long_down = 1;//長按鍵標(biāo)志置位
key_fall_flag = 0;//清按鍵按下標(biāo)志
}
}
else //按鍵抬起
{
if(key_holdon_ms>50)//按下時間大于50ms,生成單擊標(biāo)志
{
key_holdon_ms=0;
short_key_flag=1;
key_long_down =0;
key_fall_flag=0;
//距離上次單擊時間在100~500ms之間,則認(rèn)為發(fā)生連擊事件
if(keyupCnt>100&& keyupCnt<500)
{
doubleClick= TRUE;
short_key_flag=0;
}
keyUpFlag= TRUE;//單擊抬起按鍵后,生成按鍵抬起標(biāo)志
}
else //按鍵持續(xù)時間小于50ms,忽略
{
key_holdon_ms=0;
short_key_flag=0;
long_key_flag=0;
key_fall_flag=0;
}
}
}
if(keyUpFlag)//單擊抬起后,啟動計數(shù),計數(shù)到500ms
keyupCnt++;
if(keyupCnt>500)
keyupCnt= 0;
keyUpFlag= FALSE;
}
}
作者: 蘿莉最棒了 時間: 2019-7-1 16:04
還是沒有應(yīng)用起來
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |