標題: 單片機C語言程序看似邏輯正確的代碼卻無法運行,百思不得其解 [打印本頁]

作者: hxdby    時間: 2022-1-15 19:54
標題: 單片機C語言程序看似邏輯正確的代碼卻無法運行,百思不得其解
大家好!

本人做一個帶按鍵設置和數(shù)碼管顯示的板子,現(xiàn)在想實現(xiàn)一個功能,就是在開機時,數(shù)碼管先顯示歡迎界面,如顯示HELLO,顯示3秒后自動進入按鍵設置界。HELLO界面只在開機時顯示一次,后面就一直顯示按鍵設置界面。

這部分程序如下:

uint8_t    number_cnt=3;
uint8_t    next_step=0;


int main(void)
{

   switch (next_step)
   {

     case 0:

      do
       {
          WELCOME_DISPLAY();  // HELLO顯示函數(shù),開機后執(zhí)行該函數(shù)數(shù)碼管顯示HELLO
       } while (number_cnt !=0)  //number_cnt初值為3,在定時器中斷中自減直到0跳出循環(huán)

      if (number_cnt==0)
       {
             next_step=1;  //跳轉到case 1, 執(zhí)行case 1中的程序
       }

      break;


     case 1:

      while(1)
     {
     KEY_SET_DISPLAY();   //按鍵設置程序
     }

     break;

    }

}



ISR(TIMER1_vect)    //定時器中斷服務程序,1s進一次中斷
{

      if (number_cnt !=0)
        {
           number_cnt --;
        }

     else
       {
          next_step=1;
       }

}

上述程序從邏輯上看,看不出什么問題(也可能是我的能力有限,看不出問題),應該是能實現(xiàn)上述功能,但是實際情況是,我把代碼燒錄進板子后,開機后HELLO確實顯示出來了,但是過了大概3秒多,HELLO消失后,數(shù)碼管就黑屏了。感覺是沒有進入到case 1中去,沒有執(zhí)行KEY_SET_DISPLAY();,不太理解為啥沒有跳轉到case 1中去,因為我在case 0中有設置跳轉條件,當number_cnt=0的時候,就跳轉到next_step=1, number_cnt
在中斷中自減,肯定會最終減到0.

還是因為switch case中不能有while(1)循環(huán)?

百思不得其解,希望各位大佬賜教!感謝!

作者: TEC    時間: 2022-1-15 22:43
switch只執(zhí)行了一次,main函數(shù)就結束了,next_step值變成1的時候,沒再調用switch函數(shù)了,因此沒有進入while(1)循環(huán)。
作者: 溫xyz    時間: 2022-1-15 22:53
switch (next_step)沒有大循環(huán),只執(zhí)行到case 0就跳出來了,不會執(zhí)行case 1 這部分代碼。
作者: wulin    時間: 2022-1-16 10:35
看似邏輯正確的代碼實則不然


測試程序 仿真.rar (82.88 KB, 下載次數(shù): 6)




作者: 鄧文雄ABC    時間: 2022-1-17 08:52
改一下循環(huán)條件,其它都按圖刪除

51hei圖片_20220117085056.png (28.46 KB, 下載次數(shù): 52)

51hei圖片_20220117085056.png

作者: hxdby    時間: 2022-1-18 20:53
wulin 發(fā)表于 2022-1-16 10:35
看似邏輯正確的代碼實則不然

謝謝您提供的仿真程序!感謝
作者: hxdby    時間: 2022-1-18 20:56
鄧文雄ABC 發(fā)表于 2022-1-17 08:52
改一下循環(huán)條件,其它都按圖刪除

感謝!我最后就用了個while(number_cnt>0), 其他都刪除了,看來我的代碼能力還是比較欠缺啊,寫了一堆無用的東西!
作者: 13205495918    時間: 2022-1-19 08:44
我個人覺得case0的break刪除就能向后運行了,或者就按5樓的改法。
#include <iostream>
using namespace std;
int main()
{
   int m = 1;
        switch (m)
        {
                case 1:
                        cout<<1<<endl;
                case 2:
                        cout<<2<<endl;
                        break;
                case 3:
                        cout<<3<<endl;
                        break;
                default:
                        cout<<5<<endl;
                        break;
        }
   return 0;
}

answer:1,2
不會上傳圖片,就把敲得驗證程序直接粘過來了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1