定时器消抖,延时消抖处理按键事件

先查看原理图
keys
core
发现板载4个 独立按键,分别连接P34,P35,P36,P37
众所周知 ,机械按键在按下时有抖动,需要做消抖处理,一般抖动时间为10到20ms,这里取20ms

软件延时消抖

使用delay函数进行延时消抖

#include <STC12C5A60S2.H>
#include "digital.h"

sbit S1=P3^4;
int cnt;

void main()
{
	while(1)
	{
		if(S1==0)
		{
			delay(20);
			if(S1==0)
				cnt++;
			while(!S1)
				displayNum(cnt,10);
		}
		displayNum(cnt,10);
	}
	
}

效果还不错

定时器消抖

考虑按键按下有以下几个状态
1、按键未按下,引脚 为高电平
2、按键按下,产生一个下降沿和一系列抖动
3、按键稳定
4、松手,发生一系列抖动,引脚又回到高电平

需要在按下那一刻开启定时器进行计时,至20ms,检测引脚电平,若为低电平,可视为按键按下,然后等待按键释放,在等待中,我们可以继续display数据。

#include <STC12C5A60S2.H>
#include "digital.h"

sbit S1=P3^4;
int count,cnt;

void Timer0_Init(void)		//20微秒@11.0592MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xF9;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;				//使能定时器0中断
}

void main()
{
	Timer0_Init();
	EA=1;
	while(1)
	{
		if(S1==0)
		{
			TR0 = 1;				//定时器0开始计时
		}
		displayNum(cnt,10);
	}
	
}

void Timer0_Isr(void) interrupt 1
{
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xF9;				//设置定时初始值
	TR0=0;
	if(count%1000==0)		//由于定时器是20us,这里将其扩大至20ms
	{
		if(S1==0)
		{
			cnt++;
			count=0;
			while(!S1)		//松手检测
				displayNum(cnt,10);
		}
	}		
}

计数器按键检测

查看手册知P34接单片机T0脚
P34
可配置寄存器TMOD来使T0作为计数器使用
配置计数器
这里需要将T0的C/~T设置为1,其余均为0,即TMOD或上0x04
将其初值分别设置为30255,这样只要有一次按下,就会发生计数器溢出,进入计数器中断服务函数。

#include <STC12C5A60S2.H>
#include "digital.h"

sbit S1=P3^4;
int cnt;

void main()
{	
	TMOD &= 0xF0;
	TMOD |= 0x04;
	TL0=30;
	TH0=255;
	TF0=0;		//清除溢出标志位
	TR0=1;		//开启计数器
	ET0=1;		//开启计数器中断
	EA=1;		//开启总中断
	while(1)
	{
		displayNum(cnt,10);
	}	
}

void Timer0_Isr(void) interrupt 1
{
	TL0=30;
	TH0=255;
	cnt++;
}

在按动时偶尔有双击现象,是引脚不够稳定,没有消抖处理所致

效果图
配套资源
https://download.csdn.net/download/weixin_56719449/87637175?spm=1001.2014.3001.5501

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值