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

第九十六节: 独立按键“一键两用”的短按与长按。 【96.1 “一键两用”的短按与长按。 】 上图 96.1.1 独立 按键电路 上图 96.1.2 L ED 电路 上图 96.1.3 有源 蜂鸣器电路 某些项目 , 当外部按键的资 源比较少的时 候, 一个按键也可以 “一键 多用” 。 “一键多用” 有很 多种玩法, 比如, 谍战 片的无线电通 信,依赖一个按键的“不同敲击频率” 就可 以发送内容丰 富的情报 。本节 “一键两

100%1 / 836
{
Gu8LedStatus=0;
LedClose(); //LED
}
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
第九十六节: 独立按键“一键两用”的短按与长按。
【96.1 “一键两用”的短按与长按。
上图 96.1.1 独立按键电路
上图 96.1.2 LED 电路
上图 96.1.3 有源蜂鸣器电路
某些项目当外部按键的资源比较少的时候,一个按键也可以“一键多用”“一键多用”有很多种玩法,
比如,谍战片的无线电通信,依赖一个按键的“不同敲击频率”就可以发送内容丰富的情报。本节“一键两
用”也是属于“一键多用”的众多玩法之一。短按与长按”的原理是依赖按键按下的时间长度”来区
识别。“短按”是指从按下的“下降沿”到松手的“上升沿”时间,“长按”是指从按下的“下降沿”到一直
按住不松手的“低电平持续时间本节的例程功能如下1)K1 “短按”一次(25ms)LED 要么从灭”
变成“亮”,要么从“亮”变成“灭”在两种状态之间切换。(2)K1 “长按一次(500ms)蜂鸣器发
“嘀”的一声。代码如下
#include "REG52.H"
#define KEY_VOICE_TIME 50 //按键“长按”触发后发出的声音长度 50ms
#define KEY_SHORT_TIME 25 //按键的“短按”兼“滤波”的“稳定时间”25ms
#define KEY_LONG_TIME 500 //按键的“长按”兼“滤波”的“稳定时间”500ms
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); //单击按键任务函数,放在主函数
sbit P3_4=P3^4; //蜂鸣
sbit P1_4=P1^4; //LED
sbit KEY_INPUT1=P2^2; //K1 按键识别的输入口
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
unsigned char Gu8LedStatus=0; //记录 LED 灯的状态,0 代表灭,1 代表亮
volatile unsigned char vGu8SingleKeySec=0; //单击按键的触发序号
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();