从单片机基础到程序框架(全集 2019pdf版).pdf - 第427页
解答: 首先,我们 要明白 C 语言的 语法中, if(条件 1) { } else if(条件 2) { } 以上语句是 一对组合语 句,不能分开来看。当 (条件 1)成立的时候,它是绝对不会判 断 (条件 2) 的 。 当(条件 1)不成立 的时候, 才会判断(条 件 2) 。 回到刚才 的问题,当程 序执行到( 条件 2) e lse i f(0==Su8Comb inationKe yLock)的时候, 就已经默认 了 (条 件…

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,防止两个按键按住不松手的时候不断触发组合
按键。这样,组合按键只能同时按下一次触发一次,任意松开其中一个按键后再同时按下一次两个按键,又
触发一次新的组合按键。

第九十五节: 两个独立按键的“电脑键盘式”组合按键。
【95.1 “电脑键盘式”组合按键。】
上图 95.1.1 独立按键电路
上图 95.1.2 LED 电路
上图 95.1.3 有源蜂鸣器电路
上一节也讲了由 K1 和 K2 构成的组合按键,但是这种组合按键是普通的组合按键,因为它们的 K1 和 K2
是不分先后顺序的,你先按住 K1 然后再按 K2,或者你先按住 K2 然后再按 K1,效果都一样。本节讲的组合