我想使用的是外部中断的方式,int0,int1,而不是查询的方式。不好意思啊,都没有我想要的答案,还是要谢谢大家了!
我通过设置下降沿触发,再在中断程序里面加入了延时(通过一次次试验确定的延时大小)解决的抖动问题,暂时就这样子了,能用。
单片机 按键作为外部中断的输入,怎么使用软件防抖动?c语言,谢谢。
答案:4 悬赏:70 手机版
解决时间 2021-02-08 12:46
- 提问者网友:像風在裏
- 2021-02-07 20:43
最佳答案
- 五星知识达人网友:怀裏藏嬌
- 2021-02-07 20:53
进入中断后,关闭这个外部中断,同时启动一个50ms的定时器,退出这个外部中断。在那个50ms定时到时,判断这个外部中断引脚的电平 ,确定是否为抖动。
全部回答
- 1楼网友:你哪知我潦倒为你
- 2021-02-08 01:13
出个偏招,一般按键时间比抖动时间长吧,你先设置为上升沿触发,中断进入后记个标志,再把中断设置为下降沿触发,这样按键松开时又触发一次,再记个标志。然后又设置上升沿。完成一次按键捕获
- 2楼网友:刀戟声无边
- 2021-02-07 23:36
主要是时间延迟,一般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,
7a64e58685e5aeb931333264643665 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楼网友:猎心人
- 2021-02-07 21:58
这程序,看着眼熟。
是从那个问题,转载来的?
原题的要求,是什么了,有些忘记了,得再去看看。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯