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

第九十四节: 两个独立按键构成的组合按键。 【94.1 组合按键。 】 上图 94.1.1 独立 按键电路 上图 94.1.2 L ED 电路 上图 94.1.3 有源 蜂鸣器电路 组合按键的 触发, 是指 两个按键同 时按下时的“非单击” 触发。一次组合按键的产生 , 必然包含 了三类 按键的触发。比如, K1 与 K2 两个独立按 键, 当它 们产生一次 组合按 键的操作时,就包含了三类触发 : K1 单

100%1 / 836
}
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
击触发,K2 单击触发,K1 K2 的组合触发。这三类触发可以看作是底层的按键驱动程序在按键应用层的
任务函数 SingleKeyTask CombinationKeyTask 中,可以根据项目实际需要进行响应。本节程序例程要
实现的功能是:(1)K1 单击让 LED 变成“亮”的状态。(2)K2 单击 LED 变成“灭”的状态。(3)K1 K2
的组合按键触发让蜂鸣器发出“嘀”的一声。代码如下:
#include "REG52.H"
#define KEY_VOICE_TIME 50 //组合按键触发后发出的声音长度
#define KEY_FILTER_TIME 25 //按键滤波的“稳定时间”25ms
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void LedOpen(void);
void LedClose(void);
void VoiceScan(void);
void KeyScan(void); //按键识别的驱动函数,放在定时中断里
void SingleKeyTask(void); //单击按键任务函数,放在主函数
void CombinationKeyTask(void); //组合按键任务函数,放在主函数
sbit P3_4=P3^4; //蜂鸣
sbit P1_4=P1^4; //LED
sbit KEY_INPUT1=P2^2; //K1 按键识别的输入口
sbit KEY_INPUT2=P2^1; //K2 按键识别的输入口
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
volatile unsigned char vGu8SingleKeySec=0; //单击按键的触发序号
volatile unsigned char vGu8CombinationKeySec=0; //组合按键的触发序
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{