单片机 按键作为外部中断的输入,怎么使用软件防抖动?c语言,谢谢。

我想使用的是外部中断的方式,int0,int1,而不是查询的方式。不好意思啊,都没有我想要的答案,还是要谢谢大家了!

我通过设置下降沿触发,再在中断程序里面加入了延时(通过一次次试验确定的延时大小)解决的抖动问题,暂时就这样子了,能用。

进入中断后,关闭这个外部中断,同时启动一个50ms的定时器,退出这个外部中断。在那个50ms定时到时,判断这个外部中断引脚的电平 ,确定是否为抖动。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-16
出个偏招,一般按键时间比抖动时间长吧,你先设置为上升沿触发,中断进入后记个标志,再把中断设置为下降沿触发,这样按键松开时又触发一次,再记个标志。然后又设置上升沿。完成一次按键捕获本回答被网友采纳
第2个回答  2011-07-02
主要是时间延迟,一般5ms,下面是我自己写的程序,在实验板上时成功的,你看懂了的话,再在程序里面加个松手去抖,这样会更加完美

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void dlm();
void scan1();
void key(uchar x);
void delay(uchar z);
uchar temp,num;
uchar temp,num,table[17]={ 0x00,
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
};
void main()
{
while(1)
{
P0=0xf0;
scan1();
if(num!=0)
{
P2=table[num];
}
}
}

void scan1()
{
if(P0!=0xf0)
{
delay(1);
if(P0!=0xf0);
{
temp=P0;
switch(temp)
{
case 0xe0: {key(0);break;}
case 0xd0: {key(1);break;}
case 0xb0: {key(2);break;}
case 0x70: {key(3);break;}
default:P2=0x00;
}
}
}
}

void key(uchar x)
{

P0=0xfe;
if(P0!=0xfe)
{
num=1+4*x;
}
P0=0xfd;
if(P0!=0xfd)
{
num=2+4*x;
}
P0=0xfb;
if(P0!=0xfb)
{
num=3+4*x;
}
P0=0xf7;
if(P0!=0xf7)
{
num=4+4*x;
}

}

void delay(uchar z)
{
uchar x;
uint y;
for(x=z;x>0;x--)
for(y=300;y>0;y--);
}
第3个回答  2011-07-02
使用多次判断的方法,例如每间隔1ms对按键进行查询一次,如果连续两次查询都为有按键动作,那么就认为外部有按键响应,否则即为噪声。

...关于单片机按键延时防抖方面的问题,使用软件防抖(汇编、C语言均可...
if(key==0) \/\/判断是否有键按下 { delay(xms);\/\/延迟去抖 if(key==0) \/\/如果真的有键按下 { 语句;} while(!key); \/\/松手检测,如果key为1说明松手了,那么!key为假,跳出循环 }

51单片机用c语言设计外部中断流水灯,开发板GTX TX-1C的按键怎么...
1、去抖using和数字 2、加按键去抖动(延时)3、中断返回不用return

单片机怎么用c语言设置I\/O口输入或输出
P1M0=0;P1M1=255; \/\/all 推挽输出 而51单片机的所有IO引脚,在启动后默认都是1。因此,如之前没有对此引脚进行过置0操作的话,可以直接读该引脚。但为了保险起见,也为了使程序通用、可移植,最好在读取之前对此引脚置1。

c语言按键抖动问题
第一,中断函数里面不能喂狗,本来看门狗也是一个高级别的中断,比定时器的优先级高,自然你的中断时间就不对了。第二,你的是飞思卡尔的单片机吧,貌似单片机的IO口有数据方向寄存器,先要把按键的端口设置为输入,如果没有的话,默认引脚都会是高电平,所以你说检测松开能检测到,其实是端口一直是高...

利用stm32的单片机完成下面的要求,程序该怎么写,用C语言
用两个定时器分别对两个LED灯闪烁,KEY1和KEY2要设置为外部中断输入,当进入中断时KEY1_DANG或KEY2_DANG指向下一个档位,并且发送串口。给你提供点思路。void main(){ while(1){ if(key1_dang==0x01)中断定时1设置为0.2秒 if(key1_dang==0x02)中断定时1设置为0.4秒 if(key1_dang==0x...

关于单片机温度控制系统C语言程序中的按键设置程序,请求详细的介绍下按...
0 && KeyLock ==0){ } if(BUTTON_reduce == 0 && KeyLock ==0){ } 按二次时执行 else if(KeyFlag == 2){ if(BUTTON_add == 0 && KeyLock ==0){ } if(BUTTON_reduce == 0 && KeyLock ==0){ } 一楼正解,主要按键扩展标志是用来节省资源的,用最少的按键实现最多的功能!

51单片机使用T0和T1外部脉冲计数,C语言如何编程?
使用T0和T1外部脉冲计数,控制两个电机,到1700个脉冲电机停止,--统计脉冲个数,用外部中断更好。--T0和T1,留着定时用。用四个按键控制,按键1控制电机正转,按键2控制电机反转,按键3控制电机1正转,按键4控制电机2正转,怎么用C语言编程?--编程前,要先设计出来电路。

51单片机怎么用c语言写一个按钮控制一个led的闪烁,按一下开始闪烁,再按...
void scankey()\/\/键盘扫描 { P01=1;\/\/行线给1 if(P02)\/\/如果P02也是1则说明接通 { delay(10);\/\/去抖动10MS if(P02)\/\/再次确定按键按下 { while(P02){flash=flash}\/\/按住按键的动作 flash=~flash;\/\/按键按下后执行动作 } } } void ledflash(){ if(flash){ led=1;\/\/点亮 delay(...

...怎么设置?还有这个单片机的外部中断怎么用?谢谢
1、在硬件选择的左边选择C8051F02X,右边选择C8051F020;2、在peripherals下选择portI\/O设置IO口;如果使用了串行通讯口,就将串行通讯口打勾;P0、P1、P2、P3可以作为通用IO使用;P4至P7口只能作为输出口;3、设置振荡频率,可以选择为内部或外部;设置工作频率;4、设置定时器、中断、通信口、AD转换、...

单片机c语言编了个流水灯,用按键怎么实现它暂停。
void main(void){ uint i;uchar temp;uint Flag1=0; 按键标志位bai uint Flag2=0;while(1){ Flag1 = keyscan();if(Flag1==1)(Flag2=~Flag2); \/\/如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;if(Flag2==1)\/\/ 如果标志位打开就开始流水灯 { temp=0x01;for(i=0;i...

相似回答