久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6874|回復: 37
打印 上一主題 下一主題
收起左側

C語言while(1)里是不能賦值嗎?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:734017 發表于 2020-12-14 22:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 happy2058 于 2020-12-15 15:52 編輯

int minute=30,sec=0;
unsigned char Key_tmp = 9;
void main()
        {
               
               
                Timer1(1);        中斷,一毫秒進一次,1 秒鐘時間減1
                EA=1;
        
               
        while(1)
                {
        
                        minute=25;
                        sec=55;                        覆蓋上面初值。然后為什么只運行一次?
                        minutesec();                    這里是數碼管顯示,正常的
                                if(Key_tmp==9)    這里也不運行
                                {
                                        minute=1;
                                        sec=0;
                                }
                                
               
                }
        }       顯示的
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=1 ;
                                          sec=0;
                                          //ET1 = 1;
                  //EA = 1;
                                        }
                                }
                }       
}
中斷的
unsigned char tmp;
unsigned char T1RH = 0;  //T0重載值的高字節
unsigned char T1RL = 0;  //T0重載值的低字節
Counter=0;




void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //臨時變量

    tmp = 12000000 / 12;           //定時器計數頻率
    tmp = (tmp * ms) / 1000;       //計算所需的計數值
    tmp = 65536 - tmp;             //計算定時器重載值
    tmp = tmp + 18;                //補償中斷響應延時造成的誤差
    T1RH = (unsigned char)(tmp>>8);//定時器重載值拆分為高低字節
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1為模式1
    TH1 = T1RH;     //加載T1重載值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中斷
    TR1 = 1;        //啟動T1
}

void InterruptTimer1() interrupt 3
{
       
                TH1 = T1RH;  //重新加載重載值
    TL1 = T1RL;
                Counter++;

       
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
       
}
       


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:88256 發表于 2020-12-14 23:12 | 只看該作者
不是不行,是你的程序有問題
minute=25;
sec=55;                        覆蓋上面初值。然后為什么只運行一次?
這兩句不應該放在循環里,否則送顯示一直顯示25分55秒,也就是你認為的只運行一次(實際上不止,只是人眼視覺暫留)

if(Key_tmp==9)    這里也不運行
{
   minute=1;
   sec=0;
}
這個也一樣,雖然賦值1分0秒,但是重新循環馬上被更改賦值為25分55秒,還沒進入顯示就被更改了,當然無效,必須把第一個紅色部分的刪除

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:136485 發表于 2020-12-15 08:26 | 只看該作者
能賦值啊,當為真時一直執行循環里的程序,為假時不執行里面的程序

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:743654 發表于 2020-12-15 08:47 | 只看該作者
while(1)是死循環,while(1)循環的語句會重復執行

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:860332 發表于 2020-12-15 09:18 | 只看該作者
while循環里面是可以賦值的,只是你顯示的參數每次回來之后都會被你 minute=25;
                        sec=55; 給重新賦值了,導致你顯示的都是這些值 minute=25;
                        sec=55; 所以才會認為是代碼錯了,只是你的邏輯問題沒搞好

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:856541 發表于 2020-12-15 09:48 | 只看該作者
你這個程序只能顯示25分55秒,

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:856541 發表于 2020-12-15 09:54 | 只看該作者
1 程序有問題,你這個程序只會顯示25分55秒。 2 你覺得if程序部分沒有運行是因為在if函數里面你沒有調用顯示函數minutesec(),他其實運行了只是你看不到。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:860369 發表于 2020-12-15 10:19 | 只看該作者
1.minute=25;
    sec=55;                        覆蓋上面初值。然后為什么只運行一次?

   每次循環都重新復制一次  所以不會變

2. if(Key_tmp==9)    這里也不運行
                                {
                                        minute=1;
                                        sec=0;
                                }
這里一直不會為真  所以不會運行

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

9#
ID:734017 發表于 2020-12-15 14:18 | 只看該作者
謝謝大家,上午測試了一下,實際情況和大家說的不相同

while(1)
                {        
                        minute=25;               上電顯示,只運行一次
                        sec=55;                        
                        minutesec();           顯示函數,中斷1ms進,標志加到1000 sec減1.   數管碼每秒刷新字數。      
                                if(Key_tmp==9)    這個函數不運行
                                {
                                        minute=1;
                                        sec=0;
                                }
                   }
顯數函數
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=33 ;
                                          sec=33;
                                          
                  EA = 1;
                                        }
                                }
                }       
最終數碼管顯示停在 33 33

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

10#
ID:734017 發表于 2020-12-15 14:19 | 只看該作者
lj200666 發表于 2020-12-15 10:19
1.minute=25;
    sec=55;                        覆蓋上面初值。然后為什么只運行一次?

謝謝,unsigned char Key_tmp = 9;不為真嗎?
回復

使用道具 舉報

11#
ID:734017 發表于 2020-12-15 14:21 | 只看該作者
hhdsdy 發表于 2020-12-14 23:12
不是不行,是你的程序有問題
minute=25;
sec=55;                        覆蓋上面初值。然后為什么只運 ...

謝謝,實際情況,只賦值一次,數碼管一直在刷新減1.真到關中斷
回復

使用道具 舉報

12#
ID:734017 發表于 2020-12-15 14:24 | 只看該作者
本帖最后由 happy2058 于 2020-12-15 14:26 編輯
1714461639 發表于 2020-12-15 09:18
while循環里面是可以賦值的,只是你顯示的參數每次回來之后都會被你 minute=25;
                         ...

謝謝,minute=25;sec=55;這個確實只運行了一次,數碼管顯示一直在減,minute=25;sec=55;不能重新覆蓋
回復

使用道具 舉報

13#
ID:734017 發表于 2020-12-15 14:25 | 只看該作者
東來鄉殺馬特 發表于 2020-12-15 09:48
你這個程序只能顯示25分55秒,

不會,中斷可以減時間,minute=25; sec=55; 不會重新覆蓋
回復

使用道具 舉報

14#
ID:734017 發表于 2020-12-15 14:30 | 只看該作者
東來鄉殺馬特 發表于 2020-12-15 09:54
1 程序有問題,你這個程序只會顯示25分55秒。 2 你覺得if程序部分沒有運行是因為在if函數里面你沒有調用顯 ...

時間會變,可以做加減。就是不能重新在while(1)里賦值
回復

使用道具 舉報

15#
ID:734017 發表于 2020-12-15 14:38 | 只看該作者
本帖最后由 happy2058 于 2020-12-15 14:39 編輯
東來鄉殺馬特 發表于 2020-12-15 09:54
1 程序有問題,你這個程序只會顯示25分55秒。 2 你覺得if程序部分沒有運行是因為在if函數里面你沒有調用顯 ...

程序可以25:54
回復

使用道具 舉報

16#
ID:451629 發表于 2020-12-15 14:44 | 只看該作者
你這個是一直賦值顯示的問題,要把第一次賦值放在while循環外面

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

17#
ID:553941 發表于 2020-12-15 14:49 | 只看該作者
我覺得,這么討論沒意義,大伙只看到了他給這兩個函數賦值,并沒有看到他顯示函數中調用的是什么變量,也許是另一個變量,當然不受這個影響。還有中斷服務程序中的內容,不貼完整代碼,不發表自己的意見。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

18#
ID:553941 發表于 2020-12-15 14:52 | 只看該作者
我猜測最大的一個可能是他的顯示函數中還有一個while(1),所以這個會只執行一次,if也不判斷,因為在顯示函數里面死循環了

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

19#
ID:734017 發表于 2020-12-15 15:04 | 只看該作者
13303022280 發表于 2020-12-15 14:49
我覺得,這么討論沒意義,大伙只看到了他給這兩個函數賦值,并沒有看到他顯示函數中調用的是什么變量,也許 ...

code unsigned char Led2_One[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char Led2_Two[10] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xff,0xff};
void Send_Data(unsigned int uiDataOne, unsigned int uiDataTwo)
{          
      unsigned int i = 0;       
          /* 將片選信號置為低電平 */
          HC595RCK = 0;
       
          /* 輸入第一個數據:uiDataOne */
          for (i = 0; i < 8; i++)
          {
                /* 給出脈沖信號,首先將CLK置為0 */
                    HC595CLK = 0;
                        if (0 != (uiDataOne & 0x80))
                        {
                    HC595DATA = 1;   
                      }
                    else
                    {
                    HC595DATA = 0;
                }
                        /* 給出脈沖信號,首先將CLK置為1 */
                        HC595CLK = 1;
                        /* 準備第二個數據 */
                        uiDataOne = uiDataOne << 1;
      }
               
          /* 輸入第二個數據:uiDataTwo */
          for (i = 0; i < 8; i++)
          {
                /* 給出脈沖信號,首先將CLK置為0 */
                    HC595CLK = 0;
                    if (0 != (uiDataTwo & 0x80))
                        {
                    HC595DATA = 1;   
                }
                        else
                        {
                    HC595DATA = 0;
                }
                        /* 給出脈沖信號,首先將CLK置為1 */
                        HC595CLK = 1;
                        /* 準備第二個數據 */
                        uiDataTwo = uiDataTwo << 1;
      }
               
          /* 將片選信號置為高電平 */
          HC595RCK = 1;
}
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=33 ;
                                          sec=33;
                                          EA = 1;
                                        }
                                }
                }       
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

20#
ID:860399 發表于 2020-12-15 15:05 | 只看該作者
while(1)就是個死循環,目的是為了無意義消耗時間 相當于延時

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

21#
ID:734017 發表于 2020-12-15 15:06 | 只看該作者
本帖最后由 happy2058 于 2020-12-15 15:09 編輯
13303022280 發表于 2020-12-15 14:52
我猜測最大的一個可能是他的顯示函數中還有一個while(1),所以這個會只執行一次,if也不判斷,因為在顯示函 ...

void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //臨時變量
   
    tmp = 12000000 / 12;           //定時器計數頻率
    tmp = (tmp * ms) / 1000;       //計算所需的計數值
    tmp = 65536 - tmp;             //計算定時器重載值
    tmp = tmp + 18;                //補償中斷響應延時造成的誤差
    T1RH = (unsigned char)(tmp>>8);//定時器重載值拆分為高低字節
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1為模式1
    TH1 = T1RH;     //加載T1重載值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中斷
    TR1 = 1;        //啟動T1
}

void InterruptTimer1() interrupt 3
{
        
                TH1 = T1RH;  //重新加載重載值
    TL1 = T1RL;
                Counter++;

      
        
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
        
}
回復

使用道具 舉報

22#
ID:381466 發表于 2020-12-15 15:11 | 只看該作者
下面給minute和sec賦的值在下一個循環的開始就被覆蓋了吧
回復

使用道具 舉報

23#
ID:734017 發表于 2020-12-15 15:16 | 只看該作者
13303022280 發表于 2020-12-15 14:49
我覺得,這么討論沒意義,大伙只看到了他給這兩個函數賦值,并沒有看到他顯示函數中調用的是什么變量,也許 ...

利害,我沒太注意那部份,應該和你說的一樣
code unsigned char Led2_One[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char Led2_Two[10] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xff,0xff};
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=1 ;
                                          sec=0;
                                          //ET1 = 1;
                  //EA = 1;
                                        }
                                }
                }       
}

void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //臨時變量
   
    tmp = 12000000 / 12;           //定時器計數頻率
    tmp = (tmp * ms) / 1000;       //計算所需的計數值
    tmp = 65536 - tmp;             //計算定時器重載值
    tmp = tmp + 18;                //補償中斷響應延時造成的誤差
    T1RH = (unsigned char)(tmp>>8);//定時器重載值拆分為高低字節
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1為模式1
    TH1 = T1RH;     //加載T1重載值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中斷
    TR1 = 1;        //啟動T1
}

void InterruptTimer1() interrupt 3
{
       
                TH1 = T1RH;  //重新加載重載值
    TL1 = T1RL;
                Counter++;

       
       
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
       
}
       
回復

使用道具 舉報

24#
ID:734017 發表于 2020-12-15 15:50 | 只看該作者
13303022280 發表于 2020-12-15 14:52
我猜測最大的一個可能是他的顯示函數中還有一個while(1),所以這個會只執行一次,if也不判斷,因為在顯示函 ...

應該和你說的一樣,
回復

使用道具 舉報

25#
ID:453198 發表于 2020-12-17 11:04 | 只看該作者
我建議你把C預言基礎學扎實了再試試
回復

使用道具 舉報

26#
ID:862112 發表于 2020-12-17 14:07 | 只看該作者
程序有問題,你這個程序只會顯示25分55秒。 2 你覺得if程序部分沒有運行是因為在if函數里面你沒有調用顯示函數minutesec(),他其實運行了只是你看不到。下面給minute和sec賦的值在下一個循環的開始就被覆蓋了吧

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

27#
ID:852300 發表于 2020-12-17 17:21 | 只看該作者
樓主是把簡單的功能寫復雜了!還不講對電路的具體要求!用兩個while(1)在這個小程序里不必要也不應該的。。。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

28#
ID:843617 發表于 2020-12-17 19:10 | 只看該作者
前兩句不參與循環
回復

使用道具 舉報

29#
ID:863028 發表于 2020-12-18 20:26 | 只看該作者
while()語句括號中是一個邏輯表達式,用以判斷while循環是否需要繼續執行?梢允琴x值語句。  while循環的bai一般格式為:  while(expr)  {      ;//body  }

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

30#
ID:517466 發表于 2020-12-19 07:42 | 只看該作者
你的程序邏輯就有問題。主循環里使用了minutesec這個函數,而這個函數里又用了while(1)循環,試問,一直在函數minutesec里循環,那么條不出去,主循環又怎么可能被執行?
所以程序執行的順序是:主循環中的分秒賦值語句只被執行了一次后,執行minutesec函數,進入這個函數的死循環,就退不出來了。主循環的if判斷就肯定不會被執行了。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

31#
ID:517466 發表于 2020-12-19 07:49 | 只看該作者
你想循環顯示分秒對應的數碼管,完全可以在主循環中處理,一個循環就夠了,要做亮滅時間的配比處理,否則顯示亮度會比較弱。led和k做成全局變量。
回復

使用道具 舉報

32#
ID:863315 發表于 2020-12-19 12:02 | 只看該作者
while (1)是個死循環,會一直循環 while (1)里的內容

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

33#
ID:863358 發表于 2020-12-19 13:31 | 只看該作者
while(1)不就是一直循環嗎
回復

使用道具 舉報

34#
ID:862052 發表于 2020-12-19 14:20 | 只看該作者
while(1)是死循環
回復

使用道具 舉報

35#
ID:863386 發表于 2020-12-19 14:27 | 只看該作者
while(1)  是死循環可以一直執行,里面可以對變量賦值
回復

使用道具 舉報

36#
ID:863848 發表于 2020-12-20 11:27 | 只看該作者
while(1)死循環
回復

使用道具 舉報

37#
ID:861923 發表于 2020-12-20 12:53 | 只看該作者
沒有break中斷,不是就執行一次,而是一直在執行,死循環

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人综合 | 成人精品在线 | 黄色小视频免费观看 | 国产精品aaa| 在线观看黄色小说 | 久久视频一区二区 | 四虎在线观看视频 | av大全在线观看 | 最新理论片 | 天堂中文资源在线 | 黄色一级片网站 | 国产亚洲天堂 | 亚洲成人高清 | 五月婷婷开心 | 99精品网站 | 日本精品视频在线观看 | 久久久免费观看 | 日韩一级在线观看 | 在线视频日韩 | 欧美性久久 | 四虎8848精品成人免费网站 | 免费三级网站 | 99热亚洲 | 狠狠做深爱婷婷综合一区 | 亚洲www.| 黄色免费网 | 天堂资源 | 日韩精品网站 | 天天摸天天干 | 国产精品国产三级国产专区52 | 天堂一区二区三区 | 人人澡人人爽 | 亚洲欧美另类在线 | 日日摸天天添天天添破 | 欧美伦理一区二区 | 酒色成人网 | 在线中文字幕视频 | 黄色激情视频在线观看 | 欧美三级三级三级爽爽爽 | 日韩在线视频免费观看 | 国产精品乱码一区二区视频 |