按键消抖好像没作用
用ATTINY24A做一个按键控制IO输出的功能。功能是:开机后,按键控制一个IO输出电平切换,依次为:高电平---》方波---》低电平。每按一次键,切换一种状态.如此循环,不停的检测按键输入。
我的问题是:只做 高---低 电平输出切换时,按键消抖好像没作用
还有什么现象?能再详细描述下吗? 大约有20%-30%次的按键按下后没作用 调不同的DELAY时间,有变化,但不解决问题 加入方波输出 加入方波输出 那一段代码后,程序卡死了一直输出方波,按键无效。
在下是菜鸟,调了很长时间都没有进展。
贴上原代码如下,请路过大佬们帮忙指点一下。谢谢!
#include <avr/io.h>
void delay (unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1000;j++);
}
}
/////////////////////////////////////////////////////////////////////
int main(void)
{
unsigned char temp=0;
// unsigned char count = 0;
unsigned char V6=0;
DDRB = 0x0F;
PORTB = 0x00;//初始化,输出低
while(1)
{
temp = (PINA & (_BV(DDA0)));//KEY按下 检测
delay(2);
while(!(PINA & (_BV(DDA0))));//KEY释放 检测
delay(2);
switch(V6)
{
case 0:
if((temp==0)&&(V6==0))
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出高
}
else
{
V6=0;
DDRB = 0x0F;
PORTB = 0x00; //输出保持低
}
break;
////////////////////////////////////////////////////////////////////////
case 1:
if((temp==0)&&(V6==1))
{
V6=2;
while (1)//输出方波
{
DDRB = 0x0F;
PORTB = 0x00; //输出低
delay(10);
DDRB = 0x0F;
PORTB = 0x01; //输出高
delay(10);
if(temp==0)
break;
}
}
else
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出保持高
}
break;
///////////////////////////////////////////////////////////////////////
case 2:
if((temp==0)&&(V6==2))
{
V6=0;
DDRB = 0x0F;
PORTB = 0x00; //输出低
}
else
{
V6=1;
DDRB = 0x0F;
PORTB = 0x01; //输出保持高
}
break;
default:
{
DDRB = 0x0F;
PORTB = 0x00; //输出低
}
}
}
return 0;
}
看下来逻辑有点复杂。分成两个部分比较好。一部分只做按键检测,一部分根据按键结果来控制信号输出。这样比较清晰。
如果有程序框图,可能更好分析一些
程序都在方波delay中,delay的时候自然无法检测按钮。。。
谢谢大神关注,此问题已解。
怎么解决的,是延时的问题吗 按键消抖没作用可能是消抖时间不够或者按键本身有问题。 调整消抖算法中的延时时间。延时时间过短可能无法完全消除抖动 如果按键本身有问题,比如按下或松开时没有进行相应的电平转换,那么消抖电路也无法发挥作用。 按键的电路连接正确,如按键引脚与控制器的连接、引脚上的上拉/下拉电阻等 在主程序中没有正确调用消抖函数 消抖算法可能没有正确实现 如果按键抖动的频率过高,可能会超过按键消抖的处理能力 按键的电路设计或器件可能存在问题,导致无法正确检测按键状态。 按键消抖的时间设置过短或过长都会影响按键消抖的效果,需要根据具体的应用场景进行调整。
页:
[1]
2