温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

简单的定时器实现按键消抖,还望大家多指点!

发布时间:2020-04-02 19:38:32 来源:网络 阅读:876 作者:阳子8527 栏目:开发技术
/********************************
	按独立按键使数码管加1
********************************/
 #include <reg52.h>

 #define uchar unsigned char
 
 sbit KEY = P1 ^ 0;											 //定义独立按键
 bit KEYSTA = 1;											 //按键的初始状态
 uchar code DispCode[] = {0xc0,0xf9,0xa4,0xb0,				 //共阳数码管
                          0x99,0x92,0x82,0xf8,
                          0x80,0x90,0x88,0x83,
                          0xc6,0xa1,0x86,0x8e};
void Timer0Init();											//定时器初始化函数
void KeyProcess();											//按键处理函数

void main()
{
	Timer0Init();
	KeyProcess();
}

void Timer0Init()
{
	TMOD |= 0x01;
	TH0 = 0xF8;			  //定时2MS
	TL0 = 0xCD;
	EA =1;
	ET0 = 1;
	TR0 = 1;
}
void KeyProcess()
{
	bit lasttime = 1;						 //定义前一次按键值,初始化为1;
	uchar count = 0;						 //计数值初始化为0;
	KEY = 0x01;								 //按键初始化;
	P0 =  DispCode[count];					 //数码管初始化;
	while(1)
	{
		if (KEYSTA != lasttime)				 //如果“当前按键状态”与“前一次按键状态”不同,说明按键有动作;
		{
			if (lasttime == 1)				 //如果按键有动作了,那么前一次按键状态为“弹起”(lasttime == 1),说明按键按下时,会响应动作;
			{
				count++;
				if (count >= 16)			 //计数加到16清零,只用一个共阳数码管;
				{
					count = 0;
				}
				P0 =  DispCode[count];		 //共阳数码管显示相应的值;
			}
			lasttime = KEYSTA;				 //如果按键有动作,就更新前一次按键的值;
		}
	}
}

void Timer0IRQ() interrupt 1				//2MS中断一次
{
	static keybuf = 0xFF;					//定义一个静态按键缓存变量,且值为FF;主要是暂存按键状态;
	TH0 = 0xF8;			                    //重新写入初值;
	TL0 = 0xCD;
	
	keybuf = (keybuf << 1) | KEY;		    //左移一位,使当前的按键状态移到按键缓存中;
	if (keybuf == 0)						//如果移8次,按键状态都为0,说明按键真正按下;
	{
		KEYSTA = 0;						    //确定按键状态为按键;
	}
	else if (keybuf == 0xFF)				//如果移8次,按键状态都为1,说明按键未按下
	{
		KEYSTA = 1;
	}
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI