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

AVR单片机按键消抖程序问题请教

[复制链接]
3844|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiweiminiou|  楼主 | 2021-9-1 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzsh 于 2021-9-4 23:51 编辑

大佬们好!我用ATTINY24A做一个按键控制IO输出的功能。
功能是:开机后,按键控制一个IO输出电平切换,依次为:高电平---》方波---》低电平。每按一次键,切换一种状态.如此循环,不停的检测按键输入。
我的问题是:
1、只做 高---低 电平输出切换时,按键消抖好像没作用,大约有20%-30%次的按键按下后没作用。(调不同的DELAY时间,有变化,但不解决问题)
2、加入方波输出 那一段代码后,程序卡死了一直输出方波,按键无效。
在下是菜鸟,调了很长时间都没有进展。
贴上原代码如下,请路过大佬们帮忙指点一下。谢谢!
#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;
}

使用特权

评论回复
沙发
lcczg| | 2021-9-1 17:30 | 只看该作者
看下来逻辑有点复杂。分成两个部分比较好。一部分只做按键检测,一部分根据按键结果来控制信号输出。这样比较清晰。

使用特权

评论回复
板凳
pzsh| | 2021-9-4 23:52 | 只看该作者
如果有程序框图,可能更好分析一些

使用特权

评论回复
地板
jiweiminiou|  楼主 | 2021-9-10 09:01 | 只看该作者
谢谢楼上两位大神关注,此问题已解。

使用特权

评论回复
5
wooda| | 2021-9-10 12:19 | 只看该作者
程序都在方波delay中,delay的时候自然无法检测按钮。。。

使用特权

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

本版积分规则

2

主题

8

帖子

0

粉丝