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

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

100%1 / 836
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,效果都一样。本节讲的组合