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

/********************************
	按独立按键使数码管加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;
	}
}
时间: 2024-08-01 05:14:53

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

从简单的按键消抖开始

笔者正在接受FPGA的线上培训,以接近尾声,就水平来说算是入门.设计时发现做些设计总结非常重要,可以帮助自己理清思路,同时也能得到很好的复习,便于日后回顾.之前一直在做altera FPGA的相关学习,对xilinx还不是很熟悉,借着这个契机,将比较基础常用的设计在VIVADO开发环境中过一遍,对我来说是个不错的选择.废话不多说,进入今天的正题. 众所周知,硬件按键都存在机械抖动.所以一次人为按下的动作会触发数次按键按下的行为.所谓"按键消抖"模块的功能就是将抖动滤除掉,保证对按键状态

09A-独立按键消抖实验01——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的: 1.复习状态机的设计思想并以此为基础实现按键消抖 2.单bit异步信号同步化以及边沿检测 3.在激励文件中学会使用随机数发生函数$random 4.仿真模型的概念 实验平台:芯航线FPGA核心板 实验原理: ????按键在电子设计中使用的最多,从复位到控制设置均可以看到其身影.现在按键的功能也种类也越来越多,例如多向按键.自锁按键.薄膜按键等.普通按键其硬件示意图如图9-1所示. 图9-1 按键示意图 芯航线开发板所载的为两脚贴片按键,分别位于开发板

09B-独立按键消抖实验02——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的: 1.复习按键的设计 2.用模块化设计的方式实现每次按下按键0,4个LED显示状态以二进制加法格式加1,每次按下按键1,4个LED显示状态以二进制加法格式减1 实验平台:芯航线FPGA核心板 实验原理:???? ????在上一讲中设计并验证了独立按键的消抖,这里基于上一讲的按键消抖模块来实现一个加减法计数器,并以此学习模块化的设计方式. ????在设计过程中,相对大一点的工程经常通常不会写在一个设计文件中,通常会针对不同的功能设计出不同的子文件,最后在

按键消抖之终极解决方案

1.按键消抖的原理 图1.按键抖动示意图 我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开.抖动时间由按键的机械特性所决定,一般为5ms~10ms.所以我们在做按键检测时都要加一个消抖的过程. 按键消抖主要有两种方案: 一是延时重采样:二是持续采样. 从理论上来说,延时(如10ms)重采样的准确率肯定低于持续采样. 2.按键消抖的方法 (1)延时重采样 延时重采样的意思是,当第一次检测到键值由'1'变为'0'时,再

jQueryAjax模拟按键消抖(可设置抖动延迟时间)

在硬件中,按键等都会有抖动现象,如何消除抖动,不重复触发事件呢,这就要用到消抖机制了. 这是我用jQuery模拟硬件消抖原理,额,可能是吧...又不对的地方,希望有高手指点指点. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

关于按键消抖实验

对于特权同学按键消抖程序的理解:(程序源码见<深入浅出玩转FPGA>P191) 第一个always块中,在每个时钟周期(clk)对按键值进行采样 第二个always块中,利用边沿脉冲检测法,当key_rst有下降沿时,key-an将输出一个周期的高脉冲 第三个always块中,利用cnt进行循环计数(计数时间周期大约20ms),当keg-an为1时,cnt将清零,然后从零开始计数(由此产生一个20ms,从而消除抖动部分的影响) 第四个always块中,每当cnt从0计数到20'hfffff(即

按键消抖学习

KevinChen的博客——KevinChen's Blog [博客大赛]按键消抖之终极解决方案 http://bbs.ednchina.com/BLOG_ARTICLE_3020402.HTM EE_FPGA基础教程系列 -- 按键消抖  http://wenku.baidu.com/link?url=CGJkd0CRwzW-dreuF5FSiNWbUDHGE6HQIO3A8kWmERPkJmkr9vh2YOPLq3vKC8wvkaLxOa4iwSVM-ESqiODsvJwOrOpNTS24_

Verilog HDL那些事_建模篇笔记(实验三:按键消抖)

实验三:按键消抖 首先将按键消抖功能分成了两个模块,电平检查模块和10ms延迟模块.电平检测模块用来检测按键信号的变化(是否被按下),10ms延迟模块用来稳定电平检查模块的输入,进而稳定按键信号,防止其抖动而产生的信号跳变而影响输出. 设计思路:     1.当电平检测模块检查到按键被按下(输入由高电平变为低电平),则拉高H2L_Sig电平,然后拉低. 2.10ms延迟模块,检测到H2L_Sig高电平,则对其进行10ms过滤,拉高输出. 3.当按键被释放,电平检测模块会拉高L2H_Sig电平,然

FPGA培训专家 V3学院带你学习 按键消抖 和 边缘检测

FPGA培训专家 V3学院 一般情况下,我们从按下按键到松开基本需要大于几十毫秒的时间,系统时钟的周期处于纳秒级,因此我们按下一次按键会被大于十万个时钟的上升沿采集到,然而我们希望的是按下一次按键只被一次上升沿采集到,不然会被认为按了多次按键,所以我们需要对我们的按键进行处理.假设按键在没被按下时为高电平,被按下时处于低电平,如图1所示的波形图. 图1 按键波形图 由图1 分析可知在key被按下时有且仅有一个key的上升沿和一个key的下降沿,我们可以通过检测key的上升沿或者下降沿来确定按键被