找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1870|回复: 7
打印 上一主题 下一主题
收起左侧

单片机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)循环?

百思不得其解,希望各位大佬赐教!感谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:625730 发表于 2022-1-15 22:43 | 只看该作者
switch只执行了一次,main函数就结束了,next_step值变成1的时候,没再调用switch函数了,因此没有进入while(1)循环。
回复

使用道具 举报

板凳
ID:8222 发表于 2022-1-15 22:53 | 只看该作者
switch (next_step)没有大循环,只执行到case 0就跳出来了,不会执行case 1 这部分代码。
回复

使用道具 举报

地板
ID:213173 发表于 2022-1-16 10:35 | 只看该作者
看似逻辑正确的代码实则不然


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



回复

使用道具 举报

5#
ID:301968 发表于 2022-1-17 08:52 | 只看该作者
改一下循环条件,其它都按图删除

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

51hei图片_20220117085056.png
回复

使用道具 举报

6#
ID:997026 发表于 2022-1-18 20:53 | 只看该作者
wulin 发表于 2022-1-16 10:35
看似逻辑正确的代码实则不然

谢谢您提供的仿真程序!感谢
回复

使用道具 举报

7#
ID:997026 发表于 2022-1-18 20:56 | 只看该作者
邓文雄ABC 发表于 2022-1-17 08:52
改一下循环条件,其它都按图删除

感谢!我最后就用了个while(number_cnt>0), 其他都删除了,看来我的代码能力还是比较欠缺啊,写了一堆无用的东西!
回复

使用道具 举报

8#
ID:908826 发表于 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
不会上传图片,就把敲得验证程序直接粘过来了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表