程序的多任務(wù)和資源復(fù)用舉例
/*---------------------------------------------------------------------------*/
/*按鍵掃描,包含兩個(gè)掃描任務(wù)*/
/**********************************************
每次系統(tǒng)時(shí)間進(jìn)入一次,20ms.這里把20MS判斷放進(jìn)來(lái),好看點(diǎn)
按鍵掃描循環(huán)
為簡(jiǎn)單化,沒(méi)使用隊(duì)列保存鍵值,使用標(biāo)志
那些重復(fù)發(fā)出N鍵,在這個(gè)結(jié)構(gòu)中非常容易加上
**********************************************/
void Key_MainLoop()
{
if(fSYS_20ms==0)return;
switch(mKey1SwapTask){
case 0:/***有按鍵按下嗎?***/
if(iKey1==0){
mKey1SwapTask=1;
}
break;
case 1: /***鍵按下去抖延時(shí)***/
mKey1SwapTask=2; /***延時(shí)一個(gè)系統(tǒng)時(shí)間***/
break;
case 2: /***鍵值判斷***/
if(iKey1==0){
fKey1=1; /*按鍵有效*/
mKey1SwapTask=3; /*去按鍵去抖*/
}
else mKey1SwapTask=0; /*抖動(dòng)*/
break;
case 3: /***有松開(kāi)嗎?***/
if(iKey1==1){
mKey1SwapTask=4;
}
break;
case 4: /***鍵松開(kāi)去抖延時(shí)***/
mKey1SwapTask=5; /***延時(shí)一個(gè)系統(tǒng)時(shí)間***/
break;
case 5: /***鍵值判斷***/
if(iKey1==1){
mKey1SwapTask=0; /*去按鍵檢測(cè)開(kāi)始*/
}
else mKey1SwapTask=3; /*抖動(dòng)*/
break;
}
switch(mKey2SwapTask){
case 0:/***有按鍵按下嗎?***/
if(iKey2==0){
mKey2SwapTask=1;
}
break;
case 1: /***鍵按下去抖延時(shí)***/
mKey2SwapTask=2; /***延時(shí)一個(gè)系統(tǒng)時(shí)間***/
break;
case 2: /***鍵值判斷***/
if(iKey2==0){
fKey2=1; /*按鍵有效*/
mKey2SwapTask=3; /*去按鍵去抖*/
}
else mKey2SwapTask=0; /*抖動(dòng)*/
break;
case 3: /***有松開(kāi)嗎?***/
if(iKey2==1){
mKey2SwapTask=4;
}
break;
case 4: /***鍵松開(kāi)去抖延時(shí)***/
mKey2SwapTask=5; /***延時(shí)一個(gè)系統(tǒng)時(shí)間***/
break;
case 5: /***鍵值判斷***/
if(iKey2==1){
mKey2SwapTask=0; /*去按鍵檢測(cè)開(kāi)始*/
}
else mKey2SwapTask=3; /*抖動(dòng)*/
break;
}
}
評(píng)論