超值时LED灯闪烁,不超值时LED灭,但是按键时lLED亮?

  • huihui163
  • LV5工程师
  • |      2017-05-19 08:51:56
  • 浏览量 1578
  • 回复:7
本帖最后由 huihui163 于 2017-5-19 08:53 编辑

PD_ODR_bit.ODR4=0;//初始化状态​

if((s1==0)&&(s2==1)) {delay(200); if((s1==0)&&(s2==1)){while((s1==0)&&(s2==1));PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;}} ​

if(Data > S_Data) //超值时LED灯闪烁,​

{delay(50); PB_ODR_bit.ODR3 = 0; PC_ODR_bit.ODR0 = 0; PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;} // PD_ODR_bit.ODR4=1时LED亮 else {PC_ODR_bit.ODR0 = 1;PD_ODR_bit.ODR4=0;}

在else里如果不加PD_ODR_bit.ODR4=0;这个语句的话,超值时LED灯闪烁,不超值时正好led在亮的状态,那么led就一直亮,现在我把在else里加上PD_ODR_bit.ODR4=0;这个语句​后,按键时led亮一下就灭了

是不是有冲突啊,怎么解决?

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:3
heaton426 2017-05-21

PD_ODR_bit.ODR4=0;//初始化状态​ if((s1==0)&&(s2==1)&&(Data

{

delay(200);

// if((s1==0)&&(s2==1))

{

while((s1==0)&&(s2==1));//判断按键s1并检测其松开

PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;//led灯状态反转

}

} ​ else if(Data > S_Data) //超值时LED灯闪烁,​ {

delay(50);

PB_ODR_bit.ODR3 = 0;

PC_ODR_bit.ODR0 = 0;

PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;//超值led状态反转

} // PD_ODR_bit.ODR4=1时LED亮 else {

PC_ODR_bit.ODR0 = 1;

PD_ODR_bit.ODR4=0;//在不按键也不超值时灯灭,这样造成了你一按键闪一下,就灭。

}

主要看你要达到什么样的效果,你先说出的想要达到的状况,好方便给你找出问题
0   回复
举报
发布
huihui163 回复 2017-05-22
你好,这样if语句和else语句有冲突的,按一下灯闪一下就灭
if((s1==0)&&(s2==1)&&(Data  S_Data)

        {delay(50); PB_ODR_bit.ODR3 = 0; PC_ODR_bit.ODR0 = 0;  PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;} // PD_ODR_bit.ODR4=1时LED亮

       else  

      {

        PC_ODR_bit.ODR0 = 1;PD_ODR_bit.ODR4=0;

        

      } 
0   回复
举报
huihui163 2017-05-20
您分析的非常不错,现在能不能把这个冲突解决啊,
0   回复
举报
发布
SingleYork 2017-05-19
很显然是冲突了! 先抛开按键程序不看,就看你后面的if……else……语句(只看有问题的LED代码):
if(Data > S_Data)  //超值时LED灯闪烁,​

{

        delay(50); 

        PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;

} // PD_ODR_bit.ODR4=1时LED亮

else  

{

        PD_ODR_bit.ODR4 = 0;

} 
上面这个代码是不是意味着只有两种情况,即: 一、正常情况下(未超时)PD_ODR_bit.ODR4 = 0;也就是灯一直是灭的; 二、超时,PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;也就是PD_ODR_bit.ODR4=1。 假设,你的程序正常运行的时候,肯定是不超时的,也就是一下代码一直被执行: else { PD_ODR_bit.ODR4 = 0; } 那么灯肯定一直都是灭的!这个时候我们再来看按键程序:
if((s1==0)&&(s2==1)) 

{

        delay(200); 

        if((s1==0)&&(s2==1))

        {

                while((s1==0)&&(s2==1));

                PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;

        }

} ​
也就是说,正常运行的时候,按键按下,再松开后肯定会先执行PD_ODR_bit.ODR4 = !PD_ODR_bit.ODR4;也就是PD_ODR_bit.ODR4=1,那么灯肯定就亮了!但是如果此时还一直未超时的话,又会执行以下代码:
else  

{

        PD_ODR_bit.ODR4 = 0;

}
那么灯又会灭了!由此可见,你每次按下按键再松开后,LED总是会亮一下然后又灭了!只有超时的时候,LED才会闪烁!
1   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子