打印
[PIC®/AVR®/dsPIC®产品]

按键消抖好像没作用

[复制链接]
1328|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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时间,有变化,但不解决问题

使用特权

评论回复
5
supernan|  楼主 | 2023-1-8 16:51 | 只看该作者
加入方波输出

使用特权

评论回复
6
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;
}

使用特权

评论回复
7
jiahy| | 2023-1-8 16:56 | 只看该作者

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

使用特权

评论回复
8
spark周| | 2023-1-8 16:58 | 只看该作者
如果有程序框图,可能更好分析一些

使用特权

评论回复
9
zhaoxqi| | 2023-1-8 17:03 | 只看该作者
程序都在方波delay中,delay的时候自然无法检测按钮。。。

使用特权

评论回复
10
supernan|  楼主 | 2023-1-8 17:05 | 只看该作者
谢谢大神关注,此问题已解。

使用特权

评论回复
11
1564564| | 2023-8-23 09:08 | 只看该作者
怎么解决的,是延时的问题吗

使用特权

评论回复
12
lzbf| | 2023-9-7 09:46 | 只看该作者
按键消抖没作用可能是消抖时间不够或者按键本身有问题。

使用特权

评论回复
13
tabmone| | 2023-9-7 10:06 | 只看该作者
调整消抖算法中的延时时间。延时时间过短可能无法完全消除抖动

使用特权

评论回复
14
sdCAD| | 2023-9-7 10:12 | 只看该作者
如果按键本身有问题,比如按下或松开时没有进行相应的电平转换,那么消抖电路也无法发挥作用。

使用特权

评论回复
15
primojones| | 2023-9-7 10:26 | 只看该作者
按键的电路连接正确,如按键引脚与控制器的连接、引脚上的上拉/下拉电阻等

使用特权

评论回复
16
vivilyly| | 2023-9-7 10:37 | 只看该作者
在主程序中没有正确调用消抖函数              

使用特权

评论回复
17
louliana| | 2023-9-7 11:41 | 只看该作者
消抖算法可能没有正确实现              

使用特权

评论回复
18
usysm| | 2023-9-7 12:03 | 只看该作者
如果按键抖动的频率过高,可能会超过按键消抖的处理能力

使用特权

评论回复
19
sdlls| | 2023-9-7 12:09 | 只看该作者
按键的电路设计或器件可能存在问题,导致无法正确检测按键状态。

使用特权

评论回复
20
belindagraham| | 2023-9-7 12:14 | 只看该作者
按键消抖的时间设置过短或过长都会影响按键消抖的效果,需要根据具体的应用场景进行调整。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

730

主题

10412

帖子

6

粉丝