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

第九十八节: 独立按键按住不松手的“先加速后匀速”的 触发。 【98.1 “先加速后匀速”的触发。 】 上图 98.1.1 独立 按键电路 上图 98.1.2 灌入 式驱动 8 个 LE D 上图 98.1.3 有源 蜂鸣器电路 当 “连续 加” 或者 “连续减” 的数据范围很大 的时候 , 就需要按键 的加速 与匀速相结 合的触发方 式。 “ 加 速” 是指按住按键不 松手, 按键刚开始触发 是从慢到快的 渐进过程 , 当 “加 速”…

100%1 / 836
{
static unsigned char Su8Lock=0;
if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0)
{
if(0==Su8Lock)
{
Su8Lock=1;
BeepOpen();
}
else
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
第九十八节: 独立按键按住不松手的“先加速后匀速”的触发。
【98.1 “先加速后匀速”的触发。
上图 98.1.1 独立按键电路
上图 98.1.2 灌入式驱动 8 LED
上图 98.1.3 有源蜂鸣器电路
“连续加”或者“连续减”的数据范围很大的时候就需要按键的加速与匀速相结合的触发方式。
速”是指按住按键不松手,按键刚开始触发是从慢到快的渐进过程“加速”到某个特别快的速度的时候,
就“不再加速”,而是以该“恒定高速”进行“连续匀速”触发。这种触发方式“加速”和“匀速”是相辅
相成缺一不可的,为什么?假如没有“加速”只有“匀速,那么刚按下按键就直接以最高速的“匀速”进
行,就会跑过头,缺乏微调功能;而假如没有“匀速”只有“加速”,那么按下按键不松手后,速度就会一
直不断飙升,最后失控过冲。
本节例程实现的功能如下
(1)要更改一个“设置参数”(一个全局变量,参数的范围是 0 800。
(2)8 个受“设置参数”控制的跑马灯在某一时刻只有 1 LED 亮,每触发一次 K1 按键,该“设置
数”就自减 1,最小值为 0;相反,每触发一 K2 按键,该“设置参数”就自加 1,最大值为 800。
(3)LED 灯实时显示“设置参数”的范围状态
只有第 0 LED 灯亮:0<=“设置参数”<100。
只有第 1 LED 灯亮:100<=“设置参数”<200。
只有第 2 LED 灯亮:200<=“设置参数”<300。
只有第 3 LED 灯亮:300<=“设置参数”<400。
只有第 4 LED 灯亮:400<=“设置参数”<500。
只有第 5 LED 灯亮:500<=“设置参数”<600。
只有第 6 LED 灯亮:600<=“设置参数”<700。
只有第 7 LED 灯亮:700<=“设置参数”<=800。
(4)按键“单击一次蜂鸣器就鸣叫一次,但是,当按键“从单击进入连击”后,蜂鸣器就不鸣叫。
#include "REG52.H"
#define KEY_VOICE_TIME 50
#define KEY_SHORT_TIME 25 //按键单击的“滤波”时间
#define KEY_ENTER_CONTINUITY_TIME 300 //按键“从单击进入连击”的间隔时间
#define KEY_CONTINUITY_INITIAL_TIME 80 //按键“连击”起始的预设间隔时间
#define KEY_SUB_DT_TIME 8 //按键在“加速”时每次减小的时间。
#define KEY_CONTINUITY_MIN_TIME 10 //按键时间减小到最后的“匀速”间隔时间。
#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 显示状态)