从单片机基础到程序框架(全集 2019pdf版) - 第577页

* 在 KeyTask 和 RunTa sk 两个任务函 数之间,主要 是靠 Gu8Ru nStart、G u8RunStatu s、Gu8RunDi rection、 * Gu16RunSpe edTimeDate 这四 个全局变量来 传递信息 。 */ void KeyTa sk(void) // 按键的任务 函数,放在主 函数内 { if(0==vG u8KeySec) { return; //按键的触发 序号是 0 意味着无按 …

100%1 / 836
{
Su16KeyCnt1++;
if(Su16KeyCnt1>=KEY_FILTER_TIME)
{
Su8KeyLock1=1;
vGu8KeySec=1; //触发 1 号键
}
}
//【速度】按 K2 的扫描识别
if(0!=KEY_INPUT2)
{
Su8KeyLock2=0;
Su16KeyCnt2=0;
}
else if(0==Su8KeyLock2)
{
Su16KeyCnt2++;
if(Su16KeyCnt2>=KEY_FILTER_TIME)
{
Su8KeyLock2=1;
vGu8KeySec=2; //触发 2 号键
}
}
//【方向】按 K3 的扫描识别
if(0!=KEY_INPUT3)
{
Su8KeyLock3=0;
Su16KeyCnt3=0;
}
else if(0==Su8KeyLock3)
{
Su16KeyCnt3++;
if(Su16KeyCnt3>=KEY_FILTER_TIME)
{
Su8KeyLock3=1;
vGu8KeySec=3; //触发 3 号键
}
}
}
/* 注释一:
* 本节破题的关键:
* KeyTask RunTask 两个任务函数之间,主要是靠 Gu8RunStart、Gu8RunStatus、Gu8RunDirection、
* Gu16RunSpeedTimeDate 这四个全局变量来传递信息
*/
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
//每按一次 K2 按键Gu8RunSpeed 就在 0、12 三者之间切换,并且根据 Gu8RunSpeed 的数值,
//对 Gu16RunSpeedTimeDate 赋值不同的速度时间参数,从而控制速度档位
if(0==Gu8RunSpeed)
{
Gu8RunSpeed=1; //“中”
Gu16RunSpeedTimeDate=RUN_TIME_MIDDLE; //赋值“中”档的时间参
}
else if(1==Gu8RunSpeed)
{
Gu8RunSpeed=2; //“快”档
Gu16RunSpeedTimeDate=RUN_TIME_FAST; //赋值“快”档的时间参数
}
else
{
Gu8RunSpeed=0; //“慢”档
Gu16RunSpeedTimeDate=RUN_TIME_SLOW; //赋值“慢”档的时间参数
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发按键后,发出固定长度的声音
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
case 3: //3 号按键。【方向】按键 K3
//每按一次 K3 按键,Gu8RunDirection 就在 0 1 之间切换,从而控制方向
if(0==Gu8RunDirection)
{
Gu8RunDirection=1;
}
else
{
Gu8RunDirection=0;
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发按键后,发出固定长度的声音
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
}
}
/* 注释二:
* “速度”是受 Gu16RunSpeedTimeDate 具体数值大小的影
*/
void RunTask(void) //跑马灯的任务函数,放在主函数
{
static unsigned char Su8RunStep=0; //运行的步骤