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

} else { Gu8LedSt atus=0; //标识 并且更改当前 LED 灯的状态。1 就变成 0。 LedClose (); //关闭 LE D } vGu8Single KeySec=0; //响应 按键服务处理 程序后 ,按键编号必 须清零,避免 一直触发 break; } } void Doubl eKeyTask( void) //双击 按键任务函数 ,放在 主函数内 { if(0==vG u8DoubleKey S…

100%1 / 836
{
Su16KeyIntervalCnt1=0; //时间计数器清零
Su8KeyTouchCnt1=0; //清零按键的按下的次数
}
}
}
else if(0==Su8KeyLock1)//有按键按下,且是第一次被按下。此行如有疑问,请看第 92 节的讲解。
{
Su16KeyCnt1++; //累加定时中断次数
if(Su16KeyCnt1>=KEY_FILTER_TIME) //滤波的“稳定时间”KEY_FILTER_TIME,长度 25ms。
{
Su8KeyLock1=1; //按键的自锁,避免一直触
Su16KeyIntervalCnt1=0; //按键有效间隔的时间计数器清零
Su8KeyTouchCnt1++; //记录当前单击的次数
if(1==Su8KeyTouchCnt1) //只按了 1
{
vGu8SingleKeySec=1; //单击任务
}
else if(Su8KeyTouchCnt1>=2) //连续按了两次以上
{
Su8KeyTouchCnt1=0; //统计按键次数清零
vGu8SingleKeySec=1; //单击任务
vGu8DoubleKeySec=1; //双击任务
}
}
}
}
void SingleKeyTask(void) //单击按键任务函数,放在主函数内
{
if(0==vGu8SingleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8SingleKeySec) //根据不同的按键触发序号执行对应的代
{
case 1: //单击任务
//通过 Gu8LedStatus 的状态切换,来反复切换 LED 的“灭”与“亮”的状
if(0==Gu8LedStatus)
{
Gu8LedStatus=1; //标识并且更改当前 LED 灯的状态。0 就变成 1。
LedOpen(); //点亮 LED
}
else
{
Gu8LedStatus=0; //标识并且更改当前 LED 灯的状态。1 就变成 0。
LedClose(); //关闭 LED
}
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
void DoubleKeyTask(void) //双击按键任务函数,放在主函数内
{
if(0==vGu8DoubleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8DoubleKeySec) //根据不同的按键触发序号执行对应的代
{
case 1: //双击任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发双击后,发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8DoubleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
第九十四节: 两个独立按键构成的组合按键。
【94.1 组合按键。
上图 94.1.1 独立按键电路
上图 94.1.2 LED 电路
上图 94.1.3 有源蜂鸣器电路
组合按键的触发,是指两个按键同时按下时的“非单击”触发。一次组合按键的产生必然包含了三类
按键的触发。比如,K1 K2 两个独立按键,当它们产生一次组合按键的操作时,就包含了三类触发K1