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

第九十七节: 独立按键按住不松手的连续均匀触发。 【97.1 按住不松手的连续均匀触发。 】 上图 97.1.1 独立 按键电路 上图 97.1.2 灌入 式驱动 8 个 LE D 上图 97.1.3 有源 蜂鸣器电路 在电脑上删 除某个文件 某行文字的时 候, 单击一次 “退格 按键[B ackspace]” , 就删除一个 文字, 如果 按

100%1 / 836
if(Su16KeyCnt1>=KEY_LONG_TIME) //“长按”兼“滤波”的“稳定时间”KEY_LONG_TIME
{
Su8KeyLock1=1; //此时“长按”触发才“自锁”
Su8KeyShortFlag=0; //既然此时“长按”有效,那么就要废除潜在的“短按
vGu8SingleKeySec=2; //触发 K1 的“长按”
}
}
}
void SingleKeyTask(void) //单击按键任务函数,放在主函数内
{
if(0==vGu8SingleKeySec)
{
return; //按键的触发序号是 0 意味着无按键触发,直接退出当前函数,不执行此函数下面的代码
}
switch(vGu8SingleKeySec) //根据不同的按键触发序号执行对应的代
{
case 1: //K1“短按”触发的任务
if(0==Gu8LedStatus)
{
Gu8LedStatus=1;
LedOpen(); //LED
}
else
{
Gu8LedStatus=0;
LedClose(); //LED
}
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
case 2: //K1“长按”触发的任务
vGu8BeepTimerFlag=0;
vGu16BeepTimerCnt=KEY_VOICE_TIME; //触发一次“长按”后,发出“嘀”一声
vGu8BeepTimerFlag=1;
vGu8SingleKeySec=0; //响应按键服务处理程序后,按键编号必须清零,避免一直触发
break;
}
}
第九十七节: 独立按键按住不松手的连续均匀触发。
【97.1 按住不松手的连续均匀触发。
上图 97.1.1 独立按键电路
上图 97.1.2 灌入式驱动 8 LED
上图 97.1.3 有源蜂鸣器电路
在电脑上删除某个文件某行文字的时候,单击一次“退格按键[Backspace]”就删除一个文字,如果
住“退格按键[Backspace]”不松手,就会“连续均匀”的触发“删除”的功能,自动逐个把整行文字删除
清空,这就“按住不松手的连续均匀触发”应用案例之一。除此之外,在很多需要人机交互的项目中都有
这样的功能,为了快速加减某个数值,按住某个按键不松手,某个数值有节奏地快速往上加或者快速往下减。
这种“按住不松手连续均匀触发的按键识别,在程序上有“3 时间”需要留意, 1 是按键单击的“滤
波”时间 2 按键从单进入击”的间时间(此时间“单击”“连”的界线,第 3
个是按键“连击”的间隔时间
本节能如1)8 按键马灯 1 LED K1
按键,“亮的 LED”就“往左边跑一步”相反,每触发一次 K2 按键“亮的 LED”就“往右边跑一步”。如果
按住 K1 或者 K2 不松手就连续触发,“亮的 LED”就“连续跑”,一直跑到左边或者右边的尽头。2)按键每
“单击”一次蜂鸣器就鸣叫一次,但是,当按键“从单击进入连击”后,蜂鸣器就不鸣叫。
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_SHORT_TIME 25 //按键单击的“滤波”时间 25ms
#define KEY_ENTER_CONTINUITY_TIME 300 //按键“从单击进入连击”的间隔时间 300ms
#define KEY_CONTINUITY_TIME 80 //按键“连击”的间隔时间 80ms
#define BUS_P0 P0 //8 LED 灯一一对应单片机 P0 口总线
void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void BeepOpen(void);
void BeepClose(void);
void VoiceScan(void);
void KeyScan(void);
void KeyTask(void);
void DisplayTask(void); //显示的任务函数(LED 显示状态)
sbit P3_4=P3^4; //蜂鸣
sbit KEY_INPUT1=P2^2; //K1 按键识别的输入口
sbit KEY_INPUT2=P2^1; //K2 按键识别的输入口
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
unsigned char Gu8LedStatus=0; //LED 灯的状态
unsigned char Gu8DisplayUpdate=1; //显示的刷新标志