在STM8單片機上面實現代碼為:
//按鍵按下去會出現下降沿,設置按鍵IO口GPIOB4所在的外部端口B下降沿觸發中斷 void exit_init(void) { EXTI_DeInit(); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY); }
//按鍵按下中斷服務程序 INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4) { if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按鍵下降沿 { key_fall_flag = 1;//生成按鍵按下標志 } }
//周期1ms的定時器中斷服務程序 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23) { if(key_fall_flag==1)//發生按鍵按下事件 { if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按鍵持續按下 { if(key_holdon_ms <= 2000) { key_holdon_ms++; } else //按鍵按下到2000ms就判斷長按時間成立,生成長按標志 { key_holdon_ms = 0; short_key_flag=0;//清短按鍵標志 key_long_down = 1;//長按鍵標志置位 key_fall_flag = 0;//清按鍵按下標志 } } else //按鍵抬起 { if(key_holdon_ms>50)//按下時間大于50ms,生成單擊標志 { key_holdon_ms=0; short_key_flag=1; key_long_down =0; key_fall_flag=0;
//距離上次單擊時間在100~500ms之間,則認為發生連擊事件 if(keyupCnt>100&& keyupCnt<500) { doubleClick= TRUE; short_key_flag=0; }
keyUpFlag= TRUE;//單擊抬起按鍵后,生成按鍵抬起標志 } else //按鍵持續時間小于50ms,忽略 { key_holdon_ms=0; short_key_flag=0; long_key_flag=0; key_fall_flag=0; } }
}
if(keyUpFlag)//單擊抬起后,啟動計數,計數到500ms keyupCnt++; if(keyupCnt>500)
keyupCnt= 0; keyUpFlag= FALSE; } }
|