微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > AVR,用两个按钮控制LED灯问题,感觉我程序没错,但控制...

AVR,用两个按钮控制LED灯问题,感觉我程序没错,但控制...

时间:10-02 整理:3721RD 点击:
基本描述:PA0接按键1,按一下按键1,执行一次“下一步”;
                  PA1接按键2,按一下按键2,执行一次“上一步”;
                  PA2、PA3、PA4分别接个LED灯
问题描述:我无论怎么按PA0,就只有PA2的灯灭,PA3、4没反应。“上一步”程序也无法执行。我感觉程序卡在了i==1处,不知怎么回事
程序如下:
#include <iom128v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint unsigned int
uchar i=0;                                    //    设置个全局变量i

void xiayibu()                                //子程序:下一步。
{
i++;
if(i==1){PORTA|=BIT(PA2);}        //让PA2的灯灭
if(i==2){PORTA|=BIT(PA3);        
            PORTA|=BIT(PA4);}        //让PA3、4的灯灭
if(i==3){PORTA&=~BIT(PA3);}    //让PA3的灯亮
if(i==4){PORTA&=~BIT(PA4);}    //让PA4的灯亮
if(i==5){PORTA&=~BIT(PA2);i=0;}//让PA2的灯亮
}

void shangyibu()                           //子程序:上一步。这个子程序的作用是让程序向上回一步
{
i--;
if(i==0){PORTA&=~BIT(PA2);}
if(i==1){PORTA&=~BIT(PA3);
            PORTA&=~BIT(PA4);}
if(i==2){PORTA|=BIT(PA3);}
if(i==3){PORTA|=BIT(PA4);}
if(i==4){PORTA|=BIT(PA2);}
}

main()
{uchar j;
DDRA=0X1C;//0001  1100
PORTA=0X03;//0000  0011
while(1)
{
    if((PINA&BIT(PA0))==0)
      {
        for(j=0;j<11400;j++)
        if((PINA&BIT(PA0))==0)          //延时消抖,延时10MS
        xiayibu();                                //子程序:下一步
      }
    if((PINA&BIT(PA1))==0)
      {   
        for(j=0;j<11400;j++)
         if((PINA&BIT(PA1))==0)
         shangyibu();                            //子程序:上一步
      }
    }
}

新手提问,有奖励呀!

不知是不是全局变量传递时出现的问题

等待高手ing

你这程序本身就不严谨,当i=0,又执行i--,i就等于ff了

全局变量i的问题么,放到子函数里,新手我也是,明天试试

初学AVR,,,目测状况出现在这里。
if((PINB&BIT(PB0))==0)
      {
        for(j=0;j<11400;j++)
        if((PINB&BIT(PB0))==0)          //延时消抖,延时10MS
        xiayibu();                                //子程序:下一步
      }
你去抖的问题,,,一个for循环,,,1140次判断if();修改1140次状态。

我的想法是先按“下一步”,才能执行“上一步”。我可以加个判断在“上一步”之前。但我现在的问题是它“下一步”都执行不了

大哥,能说详细点吗?我还不是很理解。

当你PA0按下,条件成立,进入FOR(j=0;j<1140;j++)if(PINA&BIT(PA0)==0)xiayibu()在你按下的过程,是不停在改变状态的。一直在执行的。10ms要执行1140次

问题解决,我用proteus仿真,发现问题确定为硬件:把连LED灯的叫上拉还是叫下拉的哪个电阻由1k改为100就行了。
话说回来,我没有一点高兴,这一周挣扎的时间让我的血都冷了
不过还是感谢各位的帮助。

问题已找到,谢谢了

问题已找到,谢谢了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top