标签:调整 include -- init 计数器 定时中断 时间 self i++
#include "REG52.H"
#define const_voice_short 40
/*
调整抖动时间阈值的大小,,可以更改按键的触发灵敏度
去抖动的时间本质上等于累计定时中断次数的时间
*/
#define const_key_time12 20 //按键去抖动延时的时间
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelayLong);
void T0_time();
void key_service();
void key_scan();
sbit key_sr1=P0^0;
sbit key_sr2=P0^1;
sbit key_gnd_dr=P0^4;
sbit beep_dr=P1^5;
unsigned char ucKeySec=0;
unsigned int uiKeyTimeCnt12=0;
unsigned char ucKeyLock12=0;
unsigned int uiVoiceCnt=0;
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
key_service();
}
}
/*
两个按键没有被全部按下时,按键的自锁标志和去抖动延时计数器一直清零
只有按键被全部按下时,去抖动延时计数器开始累加,在还没有累加到阈值
const_key_time12时,如果在这个期间由于外界干扰或者按键抖动,而使
IO口突然瞬发到高电平,这个时候马上把延时计数器清零了。
如果按键按下的时间超过了阈值const_key_time12,马上把自锁标志ucKeyLock12
置位,防止按住按键不松手一直触发。并把ucKeySec赋值,组合按键触发
*/
void key_scan()
{
if(key_sr1==1||key_sr2==1)
{
ucKeyLock12=0;
uiKeyTimeCnt12=0;
}
else if(ucKeyLock12==0)
{
uiKeyTimeCnt12++;
if(uiKeyTimeCnt12>const_key_time12)
{
uiKeyTimeCnt12=0;
ucKeyLock12=1;
ucKeySec=1;
}
}
}
void key_service()
{
switch(ucKeySec)
{
case 1:
uiVoiceCnt=const_voice_short;
ucKeySec=0;
break;
}
}
void T0_time() interrupt 1
{
TF0=0;
TR0=0;
key_scan();
if(uiVoiceCnt!=0)
{
uiVoiceCnt--;
beep_dr=0;
}
else
{
;
beep_dr=1;
}
TH0=0xf8;
TL0=0x2f;
TR0=1;
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i<uiDelayLong;i++)
for(j=0;j<500;j++)
;
}
void initial_myself()
{
key_gnd_dr=0;
beep_dr=1;
TMOD=0x01;
TH0=0xf8;
TL0=0x2f;
}
void initial_peripheral()
{
EA=1;
ET0=1;
TR0=1;
}
两个独立按键的组合按键触发------基于上一例略作改动
标签:调整 include -- init 计数器 定时中断 时间 self i++
原文地址:https://www.cnblogs.com/TheFly/p/11965250.html