supernan 发表于 2023-1-8 11:20

按键消抖好像没作用

用ATTINY24A做一个按键控制IO输出的功能。
功能是:开机后,按键控制一个IO输出电平切换,依次为:高电平---》方波---》低电平。每按一次键,切换一种状态.如此循环,不停的检测按键输入。
我的问题是:只做 高---低 电平输出切换时,按键消抖好像没作用

zwll 发表于 2023-1-8 16:45


还有什么现象?能再详细描述下吗?

supernan 发表于 2023-1-8 16:47

大约有20%-30%次的按键按下后没作用

supernan 发表于 2023-1-8 16:49

调不同的DELAY时间,有变化,但不解决问题

supernan 发表于 2023-1-8 16:51

加入方波输出

supernan 发表于 2023-1-8 16:53

加入方波输出 那一段代码后,程序卡死了一直输出方波,按键无效。
在下是菜鸟,调了很长时间都没有进展。
贴上原代码如下,请路过大佬们帮忙指点一下。谢谢!
#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;
}

jiahy 发表于 2023-1-8 16:56


看下来逻辑有点复杂。分成两个部分比较好。一部分只做按键检测,一部分根据按键结果来控制信号输出。这样比较清晰。

spark周 发表于 2023-1-8 16:58

如果有程序框图,可能更好分析一些

zhaoxqi 发表于 2023-1-8 17:03

程序都在方波delay中,delay的时候自然无法检测按钮。。。

supernan 发表于 2023-1-8 17:05

谢谢大神关注,此问题已解。

1564564 发表于 2023-8-23 09:08

怎么解决的,是延时的问题吗

lzbf 发表于 2023-9-7 09:46

按键消抖没作用可能是消抖时间不够或者按键本身有问题。

tabmone 发表于 2023-9-7 10:06

调整消抖算法中的延时时间。延时时间过短可能无法完全消除抖动

sdCAD 发表于 2023-9-7 10:12

如果按键本身有问题,比如按下或松开时没有进行相应的电平转换,那么消抖电路也无法发挥作用。

primojones 发表于 2023-9-7 10:26

按键的电路连接正确,如按键引脚与控制器的连接、引脚上的上拉/下拉电阻等

vivilyly 发表于 2023-9-7 10:37

在主程序中没有正确调用消抖函数            

louliana 发表于 2023-9-7 11:41

消抖算法可能没有正确实现            

usysm 发表于 2023-9-7 12:03

如果按键抖动的频率过高,可能会超过按键消抖的处理能力

sdlls 发表于 2023-9-7 12:09

按键的电路设计或器件可能存在问题,导致无法正确检测按键状态。

belindagraham 发表于 2023-9-7 12:14

按键消抖的时间设置过短或过长都会影响按键消抖的效果,需要根据具体的应用场景进行调整。
页: [1] 2
查看完整版本: 按键消抖好像没作用