微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第13节:按住一个独立按键不松手的加速匀速触发

第13节:按住一个独立按键不松手的加速匀速触发

时间:11-22 来源:互联网 点击:
开场白:

上一节讲了按住一个独立按键不松手的连续步进触发功能,这节要教会大家如何在上一节的基础上,略作修改,就可以实现按键的加速匀速触发。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。

(2)实现功能:两个独立按键S1和S5,S1键作为加键。S5键做为减键。每按一次S1键则被设置参数uiSetNumber自加1。如果按住S1键不松手超过1秒钟,被设置参数uiSetNumber以不断变快的时间间隔往上自加1,这个称为加速触发的功能,直到到达极限值,则以固定的速度加1,这个过程叫匀速。S5作为减法按键,每触发一次,uiSetNumber就减1,其加速和匀速触发功能跟S1按键一样。当被设置参数uiSetNumber小于500的时候,LED灯灭;当大于或者等于500的时候,LED灯亮。需要注意的是:

第一步:每次按下去触发一次单击按键,如果按下去到松手的时间不超过1秒,则不会进入连续加速触发模式。

第二步:如果按下去不松手的时间超过1秒,则进入连续加速触发模式。按键触发节奏不断加快,蜂鸣器鸣叫的节奏也不断加快。直到它们都到达一个极限值,然后以此极限值间隔匀速触发。在刚开始加速的时候,按键触发与蜂鸣器触发的步骤是一致的,等它们任意一个达到极限值的时候,急促的声音跟按键的触发不一致,并不是蜂鸣器每叫一次,按键就触发一次。实际上加速到最后,按键触发的速度远远比蜂鸣器的触发速度快。

(3)源代码讲解如下:

#include "REG52.H"

#define const_voice_short 40 //蜂鸣器短叫的持续时间

#define const_key_time1 20 //按键去抖动延时的时间

#define const_key_time2 20 //按键去抖动延时的时间

#define const_time_1s 444 //1秒钟的时间需要的定时中断次数

#define const_initial_set 160 //连续触发模式的时候,按键刚开始的间隔触发时间

#define const_min_level 30 //连续触发模式的时候,按键经过加速后,如果一旦发现小于这个值,则直接变到最后的间隔触发时间

#define const_sub_dt 10 //按键的"加速度",相当于按键间隔时间每次的变化量

#define const_last_min_set 5 //连续触发模式的时候,按键经过加速后,最后的间隔触发时间

#define const_syn_min_level 45 //产生同步声音的最小阀值 这个时间必须要比蜂鸣器的时间略长一点。

void initial_myself();

void initial_peripheral();

void delay_long(unsigned int uiDelaylong);

void T0_time(); //定时中断函数

void key_service(); //按键服务的应用程序

void key_scan(); //按键扫描函数 放在定时中断里

void led_run(); //led灯的应用程序

sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键

sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键

sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平

sbit beep_dr=P2^7; //蜂鸣器的驱动IO口

sbit led_dr=P3^5; //LED的驱动IO口

unsigned char ucKeySec=0; //被触发的按键编号

unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器

unsigned int uiKeyCtntyCnt1=0; //按键连续触发的间隔延时计数器

unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志

unsigned int uiSynCtntyCnt1=0; //产生按键同步声音的计数器

unsigned int uiCtntyTimeSet1=const_initial_set; //按键每次触发的时间间隔,这数值不断变小,导致速度不断加快

unsigned int uiCtntySynSet1=const_initial_set;//同步声音的时间间隔,这数值不断变小,导致速度不断加快

unsigned char ucCtntyFlag1=0; //是否处于连续加速触发模式的标志位

unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器

unsigned int uiKeyCtntyCnt2=0; //按键连续触发的间隔延时计数器

unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志

unsigned int uiSynCtntyCnt2=0; //产生按键同步声音的计数器

unsigned int uiCtntyTimeSet2=const_initial_set; //按键每次触发的时间间隔,这数值不断变小,导致速度不断加快

unsigned int uiCtntySynSet2=const_initial_set; //同步声音的时间间隔,这数值不断变小,导致速度不断加快

unsigned char ucCtntyFlag2=0; //是否处于连续加速触发模式的标志位

unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器

unsigned int uiSetNumber=0; //设置的数据

void main()

{

initial_myself();

delay_long(100);

initial_peripheral();

while(1)

{

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top