C语言的按键开关防抖程序~

检测到按键之后,防抖程序延时一定时间之后是继续检测按键是按下 还是检测按键已经松开?

key为按键,规定按下为低电平
if(key==0)
{
delay(50); //延时50ms,消抖
if(key==0) //再判断是否按下
{
while(!key); 松手检测
··················································
该按键按下要实现的功能程序
··················································
}
}
我的习惯是这样写
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-24
外部中断,要求是低电平/下降沿触发。
你应该把按键改成接地,不要接电源。

另外,程序缺少延时,这样,按一下键,会加上很多次的。
试试如下程序:
#include <reg52.h>
unsigned char code tab[] = {
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
unsigned char a, b, c;
//-------------------------------
void delay(unsigned int k)
{
unsigned int i, j;
for(i = 0; i < k; i++)
for(j = 0; j < 121; j++);
}
//-------------------------------
void main()
{
IT0 = 1;
EX0 = 1;
EA = 1;
while(1) {
P0 = tab[c];
}
}
//-------------------------------
void key()interrupt 0
{
c++;
if(c > 10) c = 0;
delay(200); //延时一会
}
//-------------------------------
第2个回答  2011-09-24
两个思路:
第一个是,若有按键按下,添加延迟程序,延迟过后若按键还是按下,则判断为确定按下

第二个是,若你用的硬件有中断,则用中断。中断设置为下降沿有效(低电平有效的话就是出现一次低电平就中断一次,达不到防抖效果)。
第3个回答  2011-09-24
自己定义
前者类似PC键盘,长时间按键被当做按了多次
后者则是将一对“按下-释放”动作当做按键一次本回答被提问者采纳

C语言的按键开关防抖程序~
if(key==0){ delay(50); \/\/延时50ms,消抖 if(key==0) \/\/再判断是否按下 { while(!key); 松手检测 ···该按键按下要实现的功能程序 ···} } 我的习惯是这样写

请教,51单片机C语言,按键防抖
if(0==sw1)delay(100);\/\/很短的延时,防抖 if(0==sw1){ ...;} while(!sw) 的意思是松开按键才有效,就是松开按键才会执行下一条语句,不能起到防抖作用

如何用C语言实现按键功能?
主要就是按键检测,防抖呗。首先给出检测按键代码:(我这个事4*4键盘。具体你要根据实际情况编写)uchar TestKey(){ uchar cord_h,cord_l;P6=0x0f;cord_h=P6&0x0f;if(cord_h!=0x0f){ Delay_Xms(1);if(cord_h!=0x0f){ cord_h=P6&0x0f;P6=cord_h|0xf0;cord_l=P6&0xf0;return...

求一单片机c语言程序:两个按键控制两个led,按键按住不放led闪烁,松手...
一个按键时程序如下:while(1){ if(key==0)\/\/按键按下 { delayms(20);\/\/延时消抖 if(key==0)\/\/再次判断按键是否按下 { while(key==0)\/\/按键没有抬起 { led=!led; delayms(200);}\/\/LED闪烁 } } else led=0;}

c语言按键控制程序
{delay_us(50); 延迟50us,软件滤波防抖动 if(keypress==true) 检测有键被按下 key_value=P1;提取键值 {switch(key_value) 识别是那个键被按下了 case 0x01: XXX;break; case 0x02:XXX;BREAK;进入对应工步或者动作即可。 ... } } } ...

汇编语言或C语言编写一个控制灯闪烁的程序
我写的这个程序应该可以,按一下灯亮,再按一下灯灭 include "REG52.H"sbit LED1_01 = P1^1; \/\/LED灯 sbit KEY0_01 = P1^2; \/\/按键 void Delay_1ms(unsigned int Time){ unsigned int x, y;for(x = Time; x > 0; x--)for(y = 120; y > 0; y--);} int ma...

AVR 单片机C语言怎样实现按键按一下led灯闪烁 再按一下led灯灭如此反复...
用状态机写:函数1:LED闪烁 main(){ while(1){ if(KEY)State = ~State;if(State)LED闪烁 else LED熄灭 } }

c语言按键抖动问题
先要把按键的端口设置为输入,如果没有的话,默认引脚都会是高电平,所以你说检测松开能检测到,其实是端口一直是高电平。只能帮你这么多,我没用过你这款单片机,猜一下是128不?另外按键去抖动用普通的delay函数就可以,何必搞中断,中断本来就是件麻烦事,对程序运行效果影响很大。

求程序C语言LED开关 一个LED一个按钮按一下长开 再按一下关
void main(void){ unsigned char a,b;p1^0=1; \/\/作为按键输入,在准双向IO口中应该置位 p1^1=1; \/\/关闭LED while(1){ if(p1^0==0){ for(a=20;a>0;a--) for(b=250;b>0;b--);\/\/去抖 if(p1^0==0){ wait:\/\/按键已经按下 if(p1^0==1){ \/\/按键放开 p1^1=~p1^1...

用单片机c语言一个按键控制led的闪烁和熄灭,就是按一下闪烁,再按就熄灭...
首先你的贴出来的程序不完整,最好贴出完整代码!其次,如果你的程序没问题的话,你的LED闪烁是必须在你按住按键且不能弹起情况下才会发生的,你是一直按着吗?而且注意你n的类型,因为你这样一直加,会溢出的

相似回答