标题: 单片机C语言程序看似逻辑正确的代码却无法运行,百思不得其解 [打印本页]

作者: hxdby    时间: 2022-1-15 19:54
标题: 单片机C语言程序看似逻辑正确的代码却无法运行,百思不得其解
大家好!

本人做一个带按键设置和数码管显示的板子,现在想实现一个功能,就是在开机时,数码管先显示欢迎界面,如显示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显示函数,开机后执行该函数数码管显示HELLO
       } while (number_cnt !=0)  //number_cnt初值为3,在定时器中断中自减直到0跳出循环

      if (number_cnt==0)
       {
             next_step=1;  //跳转到case 1, 执行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;
       }

}

上述程序从逻辑上看,看不出什么问题(也可能是我的能力有限,看不出问题),应该是能实现上述功能,但是实际情况是,我把代码烧录进板子后,开机后HELLO确实显示出来了,但是过了大概3秒多,HELLO消失后,数码管就黑屏了。感觉是没有进入到case 1中去,没有执行KEY_SET_DISPLAY();,不太理解为啥没有跳转到case 1中去,因为我在case 0中有设置跳转条件,当number_cnt=0的时候,就跳转到next_step=1, number_cnt
在中断中自减,肯定会最终减到0.

还是因为switch case中不能有while(1)循环?

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

作者: TEC    时间: 2022-1-15 22:43
switch只执行了一次,main函数就结束了,next_step值变成1的时候,没再调用switch函数了,因此没有进入while(1)循环。
作者: 温xyz    时间: 2022-1-15 22:53
switch (next_step)没有大循环,只执行到case 0就跳出来了,不会执行case 1 这部分代码。
作者: wulin    时间: 2022-1-16 10:35
看似逻辑正确的代码实则不然


测试程序 仿真.rar (82.88 KB, 下载次数: 4)




作者: 邓文雄ABC    时间: 2022-1-17 08:52
改一下循环条件,其它都按图删除

51hei图片_20220117085056.png (28.46 KB, 下载次数: 16)

51hei图片_20220117085056.png

作者: hxdby    时间: 2022-1-18 20:53
wulin 发表于 2022-1-16 10:35
看似逻辑正确的代码实则不然

谢谢您提供的仿真程序!感谢
作者: hxdby    时间: 2022-1-18 20:56
邓文雄ABC 发表于 2022-1-17 08:52
改一下循环条件,其它都按图删除

感谢!我最后就用了个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.51hei.com/bbs/) Powered by Discuz! X3.1