找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5287|回复: 9
收起左侧

switch case 叠加while 循环问题求教

[复制链接]
ID:85607 发表于 2016-2-12 23:37 | 显示全部楼层 |阅读模式
各位大神 求教问题。   我用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;
     }
}

回复

使用道具 举报

ID:105425 发表于 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)   
}
回复

使用道具 举报

ID:85607 发表于 2016-2-14 14:41 | 显示全部楼层
william_2016 发表于 2016-2-14 14:16
按照你的意图,修改了下代码,如下:
void main(void)
{

多谢,多谢,我试试啊
回复

使用道具 举报

ID:72781 发表于 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)死循环里就可以了
回复

使用道具 举报

ID:72781 发表于 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
}
回复

使用道具 举报

ID:72781 发表于 2016-2-14 20:29 | 显示全部楼层
对了,尽量不要用goto语句。
回复

使用道具 举报

ID:85607 发表于 2016-2-15 16:20 | 显示全部楼层
暗光 发表于 2016-2-14 20:29
对了,尽量不要用goto语句。

好的,多谢~
回复

使用道具 举报

ID:98591 发表于 2016-2-16 15:08 来自手机 | 显示全部楼层
暗光 发表于 2016-2-14 20:29
对了,尽量不要用goto语句。

为什么尽量不用goto啊,主函数里跳转我觉得很方便啊,从一个while(1)跳到另一个模式的while(1)
回复

使用道具 举报

ID:72781 发表于 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的值就可以
回复

使用道具 举报

ID:74145 发表于 2016-2-19 12:13 | 显示全部楼层
暗光 发表于 2016-2-17 13:22
有一句话说:编译水平与使用goto语句的次数成反比,goto语句的确很灵活方便,但是他会破坏程序严谨的结构 ...

学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表