程序的多任务和资源复用举例
/*---------------------------------------------------------------------------*/
/*按键扫描,包含两个扫描任务*/
/**********************************************
每次系统时间进入一次,20ms.这里把20MS判断放进来,好看点
按键扫描循环
为简单化,没使用队列保存键值,使用标志
那些重复发出N键,在这个结构中非常容易加上
**********************************************/
void Key_MainLoop()
{
if(fSYS_20ms==0)return;
switch(mKey1SwapTask){
case 0:/***有按键按下吗?***/
if(iKey1==0){
mKey1SwapTask=1;
}
break;
case 1: /***键按下去抖延时***/
mKey1SwapTask=2; /***延时一个系统时间***/
break;
case 2: /***键值判断***/
if(iKey1==0){
fKey1=1; /*按键有效*/
mKey1SwapTask=3; /*去按键去抖*/
}
else mKey1SwapTask=0; /*抖动*/
break;
case 3: /***有松开吗?***/
if(iKey1==1){
mKey1SwapTask=4;
}
break;
case 4: /***键松开去抖延时***/
mKey1SwapTask=5; /***延时一个系统时间***/
break;
case 5: /***键值判断***/
if(iKey1==1){
mKey1SwapTask=0; /*去按键检测开始*/
}
else mKey1SwapTask=3; /*抖动*/
break;
}
switch(mKey2SwapTask){
case 0:/***有按键按下吗?***/
if(iKey2==0){
mKey2SwapTask=1;
}
break;
case 1: /***键按下去抖延时***/
mKey2SwapTask=2; /***延时一个系统时间***/
break;
case 2: /***键值判断***/
if(iKey2==0){
fKey2=1; /*按键有效*/
mKey2SwapTask=3; /*去按键去抖*/
}
else mKey2SwapTask=0; /*抖动*/
break;
case 3: /***有松开吗?***/
if(iKey2==1){
mKey2SwapTask=4;
}
break;
case 4: /***键松开去抖延时***/
mKey2SwapTask=5; /***延时一个系统时间***/
break;
case 5: /***键值判断***/
if(iKey2==1){
mKey2SwapTask=0; /*去按键检测开始*/
}
else mKey2SwapTask=3; /*抖动*/
break;
}
}
评论