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

次单击与第 2 次单 击的时间 间隔。 程序例程要 实现的功能 是: (1) 单击改变 LED 灯的 显示状态, 单击一次 L ED 从原来 “灭” 的状态变成 “亮 ” 的状态, 或者从原来 “亮” 的状态变成 “灭” 的状态, 依次循环切 换。 (2) 双击则蜂鸣器发 出 “嘀” 的一 声。 代码如下: #include " REG52.H" #define KE Y_VOICE_T IME 50 //按键触发后…

100%1 / 836
第九十三节: 独立按键鼠标式的单击与双击。
【93.1 鼠标式的单击与双击。
上图 93.1.1 独立按键电路
上图 93.1.2 LED 电路
上图 93.1.3 有源蜂鸣器电路
鼠标的左键可以触发单击,也可以触发双击双击的规则是这样的两次单击如果第 1 次单击与第
2 次单击的时间比较“短”时候,则这两次单击就构成双击。编写这个程序的最大亮点是如何控制好第 1
次单击与第 2 次单击的时间间隔。
程序例程要实现的功能是:(1)单击改变 LED 灯的显示状态,单击一次 LED 从原来“灭”的状态变成“亮
的状态,或者从原来“亮”的状态变成“灭”的状态,依次循环切换。(2)双击则蜂鸣器发“嘀”的一声。
代码如下:
#include "REG52.H"
#define KEY_VOICE_TIME 50 //按键触发后发出的声音长度
#define KEY_FILTER_TIME 25 //按键滤波的“稳定时间”25ms
#define KEY_INTERVAL_TIME 250 //连续两次单击之间的最大有效时 250ms
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 DoubleKeyTask(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; //单击按键的触发序号
volatile unsigned char vGu8DoubleKeySec=0; //双击按键的触发序号
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
SingleKeyTask(); //单击按键任务函数
DoubleKeyTask(); //双击按键任务函数
}
}
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)
{
/* 注释一:
* 把 LED 的初始化放 PeripheralInitial 而不是放在 SystemInitial,是因为 LED 显示内容对上电
* 瞬间的要求不高。但是,如果是控制继电器,则应该把继电器的输出初始化放在 SystemInitial。
*/
//根据 Gu8LedStatus 的值来初始化 LED 当前的显示状态,0 代表灭,1 代表亮
if(0==Gu8LedStatus)
{
LedClose(); //关闭 LED
}
else