找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 5746|回復(fù): 9
收起左側(cè)

switch case 疊加while 循環(huán)問(wèn)題求教

[復(fù)制鏈接]
ID:85607 發(fā)表于 2016-2-12 23:37 | 顯示全部樓層 |閱讀模式
各位大神 求教問(wèn)題。   我用if也試了,用goto也試了,就是不能順利跳轉(zhuǎn)

我的問(wèn)題是我有三個(gè)case 我要怎么定義 i  才能在這個(gè)三個(gè)case中進(jìn)行循環(huán)  就是第一次執(zhí)行case1 第二次執(zhí)行 case2 第三次執(zhí)行case3  第四次執(zhí)行case1 --- 如此循環(huán)。

主程序如下:
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;
     }
}

回復(fù)

使用道具 舉報(bào)

ID:105425 發(fā)表于 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的余數(shù)
         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次后會(huì)溢出。需要處理下
     }//end while(1)   
}
回復(fù)

使用道具 舉報(bào)

ID:85607 發(fā)表于 2016-2-14 14:41 | 顯示全部樓層
william_2016 發(fā)表于 2016-2-14 14:16
按照你的意圖,修改了下代碼,如下:
void main(void)
{

多謝,多謝,我試試啊
回復(fù)

使用道具 舉報(bào)

ID:72781 發(fā)表于 2016-2-14 20:23 | 顯示全部樓層
試試這個(gè),
主程序如下:
void main(void)
{
          P3M0=0x08;
        TMOD=0x11;
        IE=0x88;
        PWM=0;
        OUT=0;
        i=1;
      while(1)//單片機(jī)程序要有一個(gè)死循環(huán)
     {
        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
      //此處可以加一個(gè)延時(shí),看需求了
     }//while
}
//PS我沒(méi)有看仔細(xì)看程序是干嘛的,也不知道對(duì)不對(duì)
//其實(shí)按照我寫(xiě)的或者我理解的一次沒(méi)必要用switch,直接寫(xiě)成三個(gè)子函數(shù),按順序?qū)懺趙hile(1)死循環(huán)里就可以了
回復(fù)

使用道具 舉報(bào)

ID:72781 發(fā)表于 2016-2-14 20:27 | 顯示全部樓層
還有這個(gè)
主程序如下:
void main(void)
{
          P3M0=0x08;
        TMOD=0x11;
        IE=0x88;
        PWM=0;
        OUT=0;
        i=1;
      while(1)//單片機(jī)程序要有一個(gè)死循環(huán)
     {
        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
}
回復(fù)

使用道具 舉報(bào)

ID:72781 發(fā)表于 2016-2-14 20:29 | 顯示全部樓層
對(duì)了,盡量不要用goto語(yǔ)句。
回復(fù)

使用道具 舉報(bào)

ID:85607 發(fā)表于 2016-2-15 16:20 | 顯示全部樓層
暗光 發(fā)表于 2016-2-14 20:29
對(duì)了,盡量不要用goto語(yǔ)句。

好的,多謝~
回復(fù)

使用道具 舉報(bào)

ID:98591 發(fā)表于 2016-2-16 15:08 來(lái)自手機(jī) | 顯示全部樓層
暗光 發(fā)表于 2016-2-14 20:29
對(duì)了,盡量不要用goto語(yǔ)句。

為什么盡量不用goto啊,主函數(shù)里跳轉(zhuǎn)我覺(jué)得很方便啊,從一個(gè)while(1)跳到另一個(gè)模式的while(1)
回復(fù)

使用道具 舉報(bào)

ID:72781 發(fā)表于 2016-2-17 13:22 | 顯示全部樓層
小蜜蜂o 發(fā)表于 2016-2-16 15:08
為什么盡量不用goto啊,主函數(shù)里跳轉(zhuǎn)我覺(jué)得很方便啊,從一個(gè)while(1)跳到另一個(gè)模式的while(1)

有一句話說(shuō):編譯水平與使用goto語(yǔ)句的次數(shù)成反比,goto語(yǔ)句的確很靈活方便,但是他會(huì)破壞程序嚴(yán)謹(jǐn)?shù)慕Y(jié)構(gòu)化,也就是順序結(jié)構(gòu)和循環(huán)結(jié)構(gòu)在加上單片機(jī)的中斷,如果編程這在使用的時(shí)候不注意使用,會(huì)跳過(guò)一些重要的語(yǔ)句,而編譯器不會(huì)發(fā)現(xiàn),而且從一個(gè)模式的死循環(huán)到另一個(gè)死循環(huán)完全可以用其他方式代替,沒(méi)必要跳轉(zhuǎn)。比如while(i==1)跳到while(i==2),只需要改變變量i的值就可以
回復(fù)

使用道具 舉報(bào)

ID:74145 發(fā)表于 2016-2-19 12:13 | 顯示全部樓層
暗光 發(fā)表于 2016-2-17 13:22
有一句話說(shuō):編譯水平與使用goto語(yǔ)句的次數(shù)成反比,goto語(yǔ)句的確很靈活方便,但是他會(huì)破壞程序嚴(yán)謹(jǐn)?shù)慕Y(jié)構(gòu) ...

學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表