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

我想使用的是外部中断的方式,int0,int1,而不是查询的方式。不好意思啊,都没有我想要的答案,还是要谢谢大家了!我通过设置下降沿触发,再在中断程序里面加入了延时(通过... 我想使用的是外部中断的方式,int0,int1,而不是查询的方式。不好意思啊,都没有我想要的答案,还是要谢谢大家了!

我通过设置下降沿触发,再在中断程序里面加入了延时(通过一次次试验确定的延时大小)解决的抖动问题,暂时就这样子了,能用。
展开
 我来答
leiyangcheng
2011-07-02 · TA获得超过445个赞
知道答主
回答量:192
采纳率:100%
帮助的人:178万
展开全部
进入中断后,关闭这个外部中断,同时启动一个50ms的定时器,退出这个外部中断。在那个50ms定时到时,判断这个外部中断引脚的电平 ,确定是否为抖动。
zlovewar3
推荐于2017-12-16 · 超过14用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:27.1万
展开全部
出个偏招,一般按键时间比抖动时间长吧,你先设置为上升沿触发,中断进入后记个标志,再把中断设置为下降沿触发,这样按键松开时又触发一次,再记个标志。然后又设置上升沿。完成一次按键捕获
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
神经质3号
2011-07-02
知道答主
回答量:31
采纳率:0%
帮助的人:23.7万
展开全部
主要是时间延迟,一般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--);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gxbkevin
2011-07-02 · 超过16用户采纳过TA的回答
知道答主
回答量:38
采纳率:0%
帮助的人:38.2万
展开全部
使用多次判断的方法,例如每间隔1ms对按键进行查询一次,如果连续两次查询都为有按键动作,那么就认为外部有按键响应,否则即为噪声。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式