从单片机基础到程序框架(全集 2019pdf版).pdf - 第557页
Gu8RunStat us=0; //状态切换到 “停止”状 态 vGu8BeepTi merFlag=0 ; vGu16BeepT imerCnt=K EY_VOICE_TIM E; //触发按键后 ,发出固定长 度的声音 vGu8BeepTi merFlag=1 ; vGu8KeySec =0; //响应按键服 务处理程序后 ,按键 编号必须清零 ,避免一直触 发 break; } } void RunTa sk(void) // …

}
/* 注释一:
* 本节破题的关键:
* 在 KeyTask 和 RunTask 两个任务函数之间,主要是靠 Gu8RunStart 和 Gu8RunStatus 这两个
* 全局变量来传递信息。
*/
void KeyTask(void) //按键的任务函数,放在主函数内
{
if(0==vGu8KeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8KeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //1 号按键。【启动暂停】按键 K1
if(0==Gu8RunStatus) //当跑马灯处于“停止”状态时
{
Gu8RunStart=1; //总开关“打开”。
Gu8RunStatus=1; //状态切换到“启动”状态
}
else if(1==Gu8RunStatus) //当跑马灯处于“启动”状态时
{
Gu8RunStatus=2; //状态切换到“暂停”状态
}
else //当跑马灯处于“暂停”状态时
{
Gu8RunStatus=1; //状态切换到“启动”状态
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发按键后,发出固定长度的声音
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 2: //2 号按键。【停止】按键 K2
Gu8RunStart=0; //总开关“关闭”。

Gu8RunStatus=0; //状态切换到“停止”状态
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发按键后,发出固定长度的声音
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
void RunTask(void) //跑马灯的任务函数,放在主函数内
{
static unsigned char Su8RunStep=0; //运行的步骤
//当总开关处于“停止”并且“步骤不为 0”时,强制把步骤归零,跑马灯初始化。
if(0!=Su8RunStep&&0==Gu8RunStart)
{
Su8RunStep=0; //步骤归零
//跑马灯处于初始化的状态
P1_4=0; //第 1 个灯亮
P1_5=1; //第 2 个灯灭
P1_6=1; //第 3 个灯灭
P3_3=1; //第 4 个灯灭
}
switch(Su8RunStep) //屡见屡爱的 switch 又来了
{
case 0:
if(1==Gu8RunStart) //总开关“打开”
{
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=0; //定时器清零
Su8RunStep=1; //切换到下一步,启动
}
break;
case 1:
if(1==Gu8RunStatus&&0==vGu16RunTimerCnt) //当前处于“启动”状态,并且定时器等于 0
{
P1_4=0; //第 1 个灯亮
P1_5=1; //第 2 个灯灭

P1_6=1; //第 3 个灯灭
P3_3=1; //第 4 个灯灭
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=RUN_TIME; //用于控制跑马灯跑动速度的定时器
vGu8RunTimerFlag=1; //启动定时器
Su8RunStep=2; //切换到下一步
}
break;
case 2:
if(1==Gu8RunStatus&&0==vGu16RunTimerCnt) //当前处于“启动”状态,并且定时器等于 0
{
P1_4=1; //第 1 个灯灭
P1_5=0; //第 2 个灯亮
P1_6=1; //第 3 个灯灭
P3_3=1; //第 4 个灯灭
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=RUN_TIME; //用于控制跑马灯跑动速度的定时器
vGu8RunTimerFlag=1; //启动定时器
Su8RunStep=3; //切换到下一步
}
break;
case 3:
if(1==Gu8RunStatus&&0==vGu16RunTimerCnt) //当前处于“启动”状态,并且定时器等于 0
{
P1_4=1; //第 1 个灯灭
P1_5=1; //第 2 个灯灭
P1_6=0; //第 3 个灯亮
P3_3=1; //第 4 个灯灭
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=RUN_TIME; //用于控制跑马灯跑动速度的定时器
vGu8RunTimerFlag=1; //启动定时器
Su8RunStep=4; //切换到下一步
}
break;
case 4:
if(1==Gu8RunStatus&&0==vGu16RunTimerCnt) //当前处于“启动”状态,并且定时器等于 0
{
P1_4=1; //第 1 个灯灭