基于51单片机独立按键无延时消抖程序

本文介绍了一个基于51单片机的按键消抖处理程序,通过定时器中断实现精确的时间控制,有效避免了因机械按键抖动带来的误操作。文中详细展示了按键扫描函数的设计思路及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <REGX52.H>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar counter1=0; //消抖计时
uint counter2=0;  //按下结束计时
bit Start=0; //消抖起始标志位
bit Over=0;	 //消抖结束标志位
sbit Key1=P3^1;
sbit Key2=P3^0;
sbit LED1=P2^0;
sbit LED2=P2^1;

void	Timer0_init()	//晶振频率12MHZ
{
	TMOD=0x02;	//8位自动重装载
	TH0=156;	//自动重装载值
	TL0=156;	//装填初值
	ET0=1;		//开定时器0中断
	EA=1;		//开总中断
	TR0=1;		//开定时器
}
void	Timer0_Routine() interrupt 1	//0.1ms中断
{
	if(Start==1) counter1++;
	if(Over==1)
	{
		if(++counter2==1000){	//一般按键按下到弹起时间间隔为100ms,长按连击效果
			counter2=0;
			Over=0;
		}
	}
}
void Key_scan()
{
	if(counter1<150){	//按下15ms内不执行后续代码,达到消抖效果
		Start=1;
		return;
	}
	if(counter1>150) //15ms消抖结束
	{
		Start=0;counter1=0;
		//判断按键状态,执行相应按键任务
		if(Key1==0){
			LED1=!LED1;	//按键1任务,把你想要执行的任务放在这里
			//KEY1_Task();
			Over=1;return;
		}
		else if(Key2==0){
			LED2=!LED2;	//按键2任务
			//KEY2_Task();
			Over=1;return;
		}
		else;
	}
}
void main()
{
	Timer0_init();
	while(1)
	{		
		if(Key1==0||Key2==0){	//把用到的按键都添加到此处
			if(Over==0) Key_scan();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值