标题: switch case 叠加while 循环问题求教 [打印本页]

作者: babylu200661    时间: 2016-2-12 23:37
标题: switch case 叠加while 循环问题求教
各位大神 求教问题。   我用if也试了,用goto也试了,就是不能顺利跳转

我的问题是我有三个case 我要怎么定义 i  才能在这个三个case中进行循环  就是第一次执行case1 第二次执行 case2 第三次执行case3  第四次执行case1 --- 如此循环。

主程序如下:
void main(void)
{
          P3M0=0x08;
        TMOD=0x11;
        IE=0x88;
        PWM=0;
        OUT=0;
        i=1
        switch(i)
        {
         case 1:                       
         { while(i==1)
         {
                          measure();
                if(time>1600)PWM=1;
                else PWM=0;
     }
      i=i+1;break;
         }
         case 2:
         { while(i==2)
         {
                 measure();
                if(time>1600)OUT=1;
                else OUT=0;
     }
     break;
         }
         case 3:
         { while(i==3)
         {
                 measure();
                if(time>1600)PWM=1,OUT=1;
                else PWM=0,OUT=0;
     }
     break;
         }
         default: break;
     }
}


作者: william_2016    时间: 2016-2-14 14:16
按照你的意图,修改了下代码,如下:
void main(void)
{
    P3M0=0x08;
    TMOD=0x11;
    IE=0x88;
    PWM=0;
    OUT=0;
    unsigned long i=0;
    while(1)
    {    i = i%3; //取3的余数
         switch(i)
         {
          case 0:  //case 1:                        
          {   //while(i==1)
                          {
                                 measure();
                                 if(time>1600)PWM=1;
                                 else PWM=0;
                          }
                           //i=i+1;
                           break;
                }
                  
                case 1:   //case 2:
                  { //while(i==2)
                          {
                                 measure();
                                 if(time>1600)OUT=1;
                                 else OUT=0;
                          }
                    break;
                  }
                  
               case 2: //case 3:
                  { //while(i==3)
                          {
                                 measure();
                                 if(time>1600)PWM=1,OUT=1;
                                 else PWM=0,OUT=0;
                          }
                    break;
                  }
               default: break;
         }
         i++; // 注意,i累加到2的32次后会溢出。需要处理下
     }//end while(1)   
}

作者: babylu200661    时间: 2016-2-14 14:41
william_2016 发表于 2016-2-14 14:16
按照你的意图,修改了下代码,如下:
void main(void)
{

多谢,多谢,我试试啊
作者: 暗光    时间: 2016-2-14 20:23
试试这个,
主程序如下:
void main(void)
{
          P3M0=0x08;
        TMOD=0x11;
        IE=0x88;
        PWM=0;
        OUT=0;
        i=1;
      while(1)//单片机程序要有一个死循环
     {
        switch(i)
        {
           case 1: measure();
                     if(time>1600) PWM=1;
                     else PWM=0;
                     i++;break;
           case 2: measure();
                    if(time>1600) OUT=1;
                    else OUT=0;
                    i++; break;
          case 3: measure();
                    if(time>1600 ) PWM=1; OUT=1;
                    else PWM=0;OUT=0;
                    i=1; break;
          default: i=1; break;
        }//switch
      //此处可以加一个延时,看需求了
     }//while
}
//PS我没有看仔细看程序是干嘛的,也不知道对不对
//其实按照我写的或者我理解的一次没必要用switch,直接写成三个子函数,按顺序写在while(1)死循环里就可以了

作者: 暗光    时间: 2016-2-14 20:27
还有这个
主程序如下:
void main(void)
{
          P3M0=0x08;
        TMOD=0x11;
        IE=0x88;
        PWM=0;
        OUT=0;
        i=1;
      while(1)//单片机程序要有一个死循环
     {
        switch(i)
        {
           case 1: measure();
                     if(time>1600) PWM=1;
                     else PWM=0;
                     break;
           case 2: measure();
                    if(time>1600) OUT=1;
                    else OUT=0;
                    break;
          case 3: measure();
                    if(time>1600 ) PWM=1; OUT=1;
                    else PWM=0;OUT=0;
                     break;
          default: i=1; break;
        }//switch
       i++;
      if(i==4) i=1;
     }//while
}

作者: 暗光    时间: 2016-2-14 20:29
对了,尽量不要用goto语句。
作者: babylu200661    时间: 2016-2-15 16:20
暗光 发表于 2016-2-14 20:29
对了,尽量不要用goto语句。

好的,多谢~
作者: 小蜜蜂o    时间: 2016-2-16 15:08
暗光 发表于 2016-2-14 20:29
对了,尽量不要用goto语句。

为什么尽量不用goto啊,主函数里跳转我觉得很方便啊,从一个while(1)跳到另一个模式的while(1)
作者: 暗光    时间: 2016-2-17 13:22
小蜜蜂o 发表于 2016-2-16 15:08
为什么尽量不用goto啊,主函数里跳转我觉得很方便啊,从一个while(1)跳到另一个模式的while(1)

有一句话说:编译水平与使用goto语句的次数成反比,goto语句的确很灵活方便,但是他会破坏程序严谨的结构化,也就是顺序结构和循环结构在加上单片机的中断,如果编程这在使用的时候不注意使用,会跳过一些重要的语句,而编译器不会发现,而且从一个模式的死循环到另一个死循环完全可以用其他方式代替,没必要跳转。比如while(i==1)跳到while(i==2),只需要改变变量i的值就可以
作者: 迷恋520冬天    时间: 2016-2-19 12:13
暗光 发表于 2016-2-17 13:22
有一句话说:编译水平与使用goto语句的次数成反比,goto语句的确很灵活方便,但是他会破坏程序严谨的结构 ...

学习了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1