从单片机基础到程序框架(全集 2019pdf版).pdf - 第426页
void Singl eKeyTask( void) //单击 按键任务函数 ,放在 主函数内 { if(0==vG u8SingleKey Sec) { return; //按键的触发 序号是 0 意味着无按 键触发 ,直接退出当 前函数,不执 行此函数下面 的代码 } switch(v Gu8SingleKe ySec) //根据 不同的按键触 发序号执行对 应的代 码 { case 1 : //K1 单 击任务 LedOpen()…

if(Su16KeyCnt1>=KEY_FILTER_TIME)
{
Su8KeyLock1=1;
vGu8SingleKeySec=1; //触发 K1 的单击键
}
}
//K2 按键的单击
if(0!=KEY_INPUT2)
{
Su8KeyLock2=0;
Su16KeyCnt2=0;
}
else if(0==Su8KeyLock2)
{
Su16KeyCnt2++;
if(Su16KeyCnt2>=KEY_FILTER_TIME)
{
Su8KeyLock2=1;
vGu8SingleKeySec=2; //触发 K2 的单击键
}
}
}
void CombinationKeyTask(void) //组合按键任务函数,放在主函数内
{
if(0==vGu8CombinationKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8CombinationKeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //K1 与 K2 的组合按键任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发一次组合按键后,发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8CombinationKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}

void SingleKeyTask(void) //单击按键任务函数,放在主函数内
{
if(0==vGu8SingleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8SingleKeySec) //根据不同的按键触发序号执行对应的代码
{
case 1: //K1 单击任务
LedOpen(); //LED 亮
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 2: //K2 单击任务
LedClose(); //LED 灭
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
【94.2 专题分析:else if(0==Su8CombinationKeyLock)。】
疑问:
if(0!=KEY_INPUT1||0!=KEY_INPUT2)
{
Su8CombinationKeyLock=0;
Su16CombinationKeyCnt=0;
}
else if(0==Su8CombinationKeyLock)//两个按键被同时按下,且是第一次被按下。为什么?
{
Su16CombinationKeyCnt++;
if(Su16CombinationKeyCnt>=KEY_FILTER_TIME)
{
Su8CombinationKeyLock=1;
vGu8CombinationKeySec=1;
}
}

解答:
首先,我们要明白 C 语言的语法中,
if(条件 1)
{
}
else if(条件 2)
{
}
以上语句是一对组合语句,不能分开来看。当(条件 1)成立的时候,它是绝对不会判断(条件 2)的。
当(条件 1)不成立的时候,才会判断(条件 2)。
回到刚才的问题,当程序执行到(条件 2) else if(0==Su8CombinationKeyLock)的时候,就已经默认
了(条件 1) if(0!=KEY_INPUT1||0!=KEY_INPUT2)不成立,这个条件不成立,就意味着 0==KEY_INPUT1 和
0==KEY_INPUT2,也就是有两个按键被同时按下,因此,这里的 else if(0==Su8CombinationKeyLock)等效于
else if(0==Su8CombinationKeyLock&&0==KEY_INPUT1&&0==KEY_INPUT2),而 Su8CombinationKeyLock 是一
个自锁标志位,一旦组合按键被触发后,这个标志位会变 1,防止两个按键按住不松手的时候不断触发组合
按键。这样,组合按键只能同时按下一次触发一次,任意松开其中一个按键后再同时按下一次两个按键,又
触发一次新的组合按键。