|
#define KEY_TIMEOUT_MS 3000
#define KEY_PRESSED 1 //按鍵按下
#define KEY_RELEASED 0 //按鍵釋放
unsigned char isTimerRunningFlag = 0;
unsigned int SysTickCnt = 0;
unsigned int OldSysTickCnt = 0;
unsigned char KeyStatus = KEY_RELEASED;
void delay_ms(unsigned int T_ms)
{
unsigned int TickTmp = GetSysTick();
while(GetSysTick()-TickTmp < T_ms){}
}
unsigned char keyPressed(void)
{
//自己綁定到按鍵IO上,當(dāng)有按鍵按下時(shí),返回真,否則返回0
}
unsigned int GetSysTick(void)
{
//自己完善定時(shí)任務(wù),開(kāi)啟一個(gè)定時(shí)器,讓其1ms產(chǎn)生一次中斷,在中斷里調(diào)用:SysTickCnt++;
return SysTickCnt;
}
void main(void)
{
//按鍵初始化
//定時(shí)器初始化
while(1)
{
//檢測(cè)按鍵按下,啟動(dòng)計(jì)時(shí)
if(keyPressed() == 1 && KeyStatus == KEY_RELEASED)
{
delay_ms(20);//消除按鍵抖動(dòng)
if(keyPressed() == 1)
{
KeyStatus = KEY_PRESSED;
isTimerRunningFlag = 1;
OldSysTickCnt = GetSysTick();
}
}
//檢測(cè)到按鍵釋放,關(guān)閉計(jì)時(shí)
if(keyPressed() == 0)
{
KeyStatus = KEY_RELEASED;
isTimerRunningFlag = 0;
}
//檢測(cè)按鍵保持時(shí)長(zhǎng)是否超過(guò)3秒
if(isTimerRunningFlag == 1)
{
if( (GetSysTick()-OldSysTickCnt) > KEY_TIMEOUT_MS )//3000ms超時(shí)
{
//在這里寫(xiě)入你想實(shí)現(xiàn)的功能
//do something
/* 清除定時(shí)任務(wù),保證一次按鍵只執(zhí)行一次*/
isTimerRunningFlag = 0;
}
}
}
} |
|