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

* RunTask 中改变,用 于对外 反馈实时的运 动状态。 */ void KeyTa sk(void) // 按键的任务 函数,放在主 函数内 { if(0==vG u8KeySec) { return; //按键的触发 序号是 0 意味着无按 键触发 ,直接退出当 前函数,不执 行此函数下面 的代码 } switch(v Gu8KeySec) //根据不同的 按键触发序 号执行对 应的代码 { case 1 : //1 号按 键…

100%1 / 836
{
Su8Lock=1;
BeepOpen();
}
else
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
void KeyScan(void) //此函数放在定时中断里每 1ms 扫描一次
{
static unsigned char Su8KeyLock1;
static unsigned int Su16KeyCnt1;
//【启动】按 K1 的扫描识别
if(0!=KEY_INPUT1)
{
Su8KeyLock1=0;
Su16KeyCnt1=0;
}
else if(0==Su8KeyLock1)
{
Su16KeyCnt1++;
if(Su16KeyCnt1>=KEY_FILTER_TIME)
{
Su8KeyLock1=1;
vGu8KeySec=1; //触发 1 号键
}
}
}
/* 注释二:
* KeyTask 中只改变 Gu8RunStart 的值,用于总启动开关。而运动状态 Gu8RunStatus 是在运动函
* RunTask 中改变,用于对外反馈实时的运动状态。
*/
void KeyTask(void) //按键的任务函数,放在主函数内
{
if(0==vGu8KeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8KeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //1 号按键。【启动】按键 K1
if(0==Gu8RunStatus) //根据当前运动的状态来决定“总开关”是否能受按键的控制
{
Gu8RunStart=1; //总开关“打开”
}
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发按键后,发出固定长度的声音
vGu8BeepTimerFlag=1;
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
default:
vGu8KeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触
break;
}
}
/* 注释三:
* 本节故意引入三个变量:计数器 Gu16RunCnt,左延时 Gu16ReturnLeftTime,下延时 Gu16GoDownTime。
* 在人机界面的场合,这三个变量可以用来扩展实现设置参数的功能。比如,如果有数码管,可以通过
* 显示 Gu16RunCnt 的数值来让客户看到当前设备的计数器。如果有数码管和按键,可以通过切换到某个
* 界面下,修 Gu16ReturnLeftTime Gu16GoDownTime 的数值,让客户对设备进行延时参数的设置。
*/
void RunTask(void) //运动控制的任务函数,放在主函数内
{
static unsigned char Su8RunStep=0; //运行的步骤
//当总开关处于“停止”并且“步骤不为 0”时,强制把步骤归零。
if(0!=Su8RunStep&&0==Gu8RunStart)
{
Su8RunStep=0; //步骤归零
}
switch(Su8RunStep) //屡见屡爱的 switch 又来
{
case 0:
if(1==Gu8RunStart) //总开关“打开
{
Gu8RunStatus=1; //及时设置 Gu8RunStatus 的运动状态为“运行
GoRight() ; //“水平气缸”往右跑。P1.4 LED 灯“灭”
Su8RunStep=1; //切换到下一步
}
break;
case 1:
if(0==vGu8SensorRight) //直到碰到了“右感应器”(按 K2)“机械臂”才往下移动。
{
GoDown(); //“垂直气缸”往下跑。P1.5 LED 灯“灭
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=Gu16GoDownTime; //向下移动 3 秒的延时赋值
vGu8RunTimerFlag=1; //启动定时器
Su8RunStep=2; //切换到下一步
}
break;
case 2:
if(0==vGu16RunTimerCnt) //当定时的 3 秒时间到,“机械臂”才往上移动,开始原路返回。
{
GoUp(); //“垂直气缸”往上跑。P1.5 LED 灯“亮
Su8RunStep=3; //切换到下一步
}
break;
case 3:
if(0==vGu8SensorUp) //直到碰到了“上感应器”(按下 K3),滑块才往左移动
{
GoLeft() ; //“水平气缸”往左跑。P1.4 LED 灯“亮”
vGu8RunTimerFlag=0;
vGu16RunTimerCnt=Gu16ReturnLeftTime; //向左移动 2 秒的延时赋值
vGu8RunTimerFlag=1; //启动定时器