从单片机基础到程序框架(全集 2019pdf版).pdf - 第421页
击触发, K2 单击触发, K1 与 K2 的组合触发。 这三类触发 可以看作是 底层的 按键驱动程序 , 在按键应用层的 任务 函数 Si ngleKeyTask 和 Combin ationKeyTa sk 中, 可以 根据 项目 的 实际 需要 进行 响应 。本 节程 序例 程要 实现的功能 是: (1)K1 单击让 LED 变成“亮”的状态。 (2 )K2 单击 让 LED 变成“灭”的状态。 (3)K1 与 K2 的组合按键 …

第九十四节: 两个独立按键构成的组合按键。
【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)
{

CombinationKeyTask(); //组合按键任务函数
SingleKeyTask(); //单击按键任务函数
}
}
void T0_time() interrupt 1
{
VoiceScan();
KeyScan(); //按键识别的驱动函数
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
LedClose(); //初始化关闭 LED
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}