• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

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

huihui163 2017-05-18 浏览量:1381


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 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你的程序没有冲突,就是逻辑的问题,你的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中的问题在于如果你按住s2那么会闪烁,按一下,可能是常亮爷可能是长灭,​这个东西随机和你按的时间有关,(Data > S_Data时,led处在翻转状态,在这段程序外面应该还有循环所以是闪烁的,如果不超时,进入else就把led关闭了自然是量一下就灭了。

    如果你想要改变这个状态的话,你应该把按键哪里做一个变量,用于处理一直按住的情况,识别出是按一下还是一直按住,接下来的处理就好弄了

    • 发布于 2017-05-18
    • 举报
    • 评论 8
    • 0
    • 0
huihui163 回复了 heaton426:你好,我的按键程序是针对S1的while((s1==0)&&(s2==1));就是按键松开led灯才翻转,一直按住不放的话led的状态不会变的, 回复
heaton426 回复了 heaton426:嗯,看错了一个分号,你的程序是((s1==0)&&(s2==1));时一直检测死循环,当s1==0的时候就反转一下,这是第一个if的逻辑,第二个ifelse就是超时闪烁,不超时PC_ODR_bit.ODR0 = 1,至于你说的加了那句PD_ODR_bit.ODR4=0就灭灯了,原因很简单,你只需要在第二个if前面加else就好了,纯逻辑的问题,ifelse的判断,不能if完了接if,必须if完了接elseif,这个和switch case是有区别的 回复
heaton426 回复了 huihui163:如果你不加else,相当于两个if语句,执行完一个if接着执行另一个,当你led亮且不超时的时候,就会执行第二个if的else语句,当让就是PD_ODR_bit.ODR4=0灯灭了,这样说不知可否解决你的问题? 回复
huihui163 回复了 heaton426://********************************************************************************************************** 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;}} else if(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;} 这样吗 回复
heaton426 回复了 heaton426:是的,在第二个if前加else逻辑就变了 回复
heaton426 回复了 heaton426:但这个样子又带来新的问题就是在超时的状态的时候并且s1按了下去的时候进行什么样的处理的问题,如果严谨点的话,在第一个if条件变成s(1==0)&&(s2==1)&&(Data 回复
huihui163 回复了 heaton426:您再费点心帮帮忙,我上面在第二个if前加else ,还是不行,和原来一样, 回复
heaton426 回复了 huihui163:这样吧,你加我qq这里太不方便,345601793 回复

其他答案 数量:3
  • 你这里的程序只有片段,没办法判断具体原因,我估计是你没有加延时的问题


    你尝试一下在PD_ODR_bit.ODR4=0;之后加一句delay(50),看看怎么样

    • 发布于2017-05-19
    • 举报
    • 评论 3
    • 1
    • 0
huihui163 回复了 chen0000009 :非常感谢您的回答,其他程序没啥,就是一个值比较,值大了灯闪烁,值小了(正常工作)按一下S1,灯亮,再按一下灯灭 回复
chen0000009 回复了 huihui163 :你试一下加个延时呢 回复
huihui163 回复了 chen0000009 :加延时不行,值变小时就是正常工作状态,按一下S1,灯亮与灯灭(PD_ODR_bit.ODR4=0)冲突了 回复

  • 嗯,估计是冲突了,当程序进入按键扫描函数时,里面有while死循环,如果while括号内的条件一直满足的话,程序无法走出来,就没法去到下面的if函数。

    调试这种程序的时候可以在疑似卡死的地方加个printf("哈哈哈哈");函数用串口检测程序是不是卡死在那。

    比如

    if((s1==0)&&(s2==1))  {delay(200); if((s1==0)&&(s2==1)){while((s1==0)&&(s2==1));printf("哈哈哈哈");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;  printf("呵呵呵呵");PD_ODR_bit.ODR4 =!PD_ODR_bit.ODR4 ;} 

    • 发布于2017-05-18
    • 举报
    • 评论 4
    • 0
    • 0
huihui163 回复了 donatello :值超了,灯闪烁,但是值不超了那个瞬间如果是灯亮的状态,为啥会一直保持呢 回复
donatello 回复了 huihui163 :调试这种程序的时候可以加个printf("哈哈哈哈")函数用串口检测程序卡死在哪里 回复
huihui163 回复了 donatello :非常感谢您的回答,while循环是等待按键释放,如果不在else里加PD_ODR_bit.ODR4=0;这个的话按键时正常操作的,加了就不行了 回复
donatello 回复了 huihui163 :如果觉得我的答案有帮助的话就采纳吧,谢谢 回复

  • 依照您的邏輯,應該是要先判斷有無超值,來決定閃爍或者按鍵觸發才對,因此改為以下即可

    PD_ODR_bit.ODR4=0;//初始化状态
    
    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;
       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;
         }
       }
    } 
    以上供參考

    • 发布于2017-05-20
    • 举报
    • 评论 2
    • 0
    • 0
huihui163 回复了 MOP :好的非常感谢,我试一下 回复
huihui163 回复了 MOP :超值时LED灯闪烁,不超值瞬间时正好led在亮的状态,那么led就一直亮,怎么解决啊 回复

相关问题

问题达人换一批

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

上海固越电子科技有限公司 版权所有©       投诉、举报邮箱:contact@icxbk.com       客服、投诉、举报电话:021-31029100-9104

经营增值电信业务试点批复:沪通信管自贸[2019]24号 出版物经营许可证:新出发沪批字第Y8445号

沪ICP备18038102号  沪公网安备 31011702004806号 |营业执照