找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3015|回復(fù): 7
收起左側(cè)

單片機(jī)C語言程序看似邏輯正確的代碼卻無法運行,百思不得其解

[復(fù)制鏈接]
ID:997026 發(fā)表于 2022-1-15 19:54 | 顯示全部樓層 |閱讀模式
大家好!

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

這部分程序如下:

uint8_t    number_cnt=3;
uint8_t    next_step=0;


int main(void)
{

   switch (next_step)
   {

     case 0:

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

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

      break;


     case 1:

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

     break;

    }

}



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

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

     else
       {
          next_step=1;
       }

}

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

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

百思不得其解,希望各位大佬賜教!感謝!
回復(fù)

使用道具 舉報

ID:625730 發(fā)表于 2022-1-15 22:43 | 顯示全部樓層
switch只執(zhí)行了一次,main函數(shù)就結(jié)束了,next_step值變成1的時候,沒再調(diào)用switch函數(shù)了,因此沒有進(jìn)入while(1)循環(huán)。
回復(fù)

使用道具 舉報

ID:8222 發(fā)表于 2022-1-15 22:53 | 顯示全部樓層
switch (next_step)沒有大循環(huán),只執(zhí)行到case 0就跳出來了,不會執(zhí)行case 1 這部分代碼。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-1-16 10:35 | 顯示全部樓層
看似邏輯正確的代碼實則不然
無標(biāo)題.jpg

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



回復(fù)

使用道具 舉報

ID:301968 發(fā)表于 2022-1-17 08:52 | 顯示全部樓層
改一下循環(huán)條件,其它都按圖刪除
51hei圖片_20220117085056.png
回復(fù)

使用道具 舉報

ID:997026 發(fā)表于 2022-1-18 20:53 | 顯示全部樓層
wulin 發(fā)表于 2022-1-16 10:35
看似邏輯正確的代碼實則不然

謝謝您提供的仿真程序!感謝
回復(fù)

使用道具 舉報

ID:997026 發(fā)表于 2022-1-18 20:56 | 顯示全部樓層
鄧文雄ABC 發(fā)表于 2022-1-17 08:52
改一下循環(huán)條件,其它都按圖刪除

感謝!我最后就用了個while(number_cnt>0), 其他都刪除了,看來我的代碼能力還是比較欠缺啊,寫了一堆無用的東西!
回復(fù)

使用道具 舉報

ID:908826 發(fā)表于 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
不會上傳圖片,就把敲得驗證程序直接粘過來了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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