OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3928|回复: 12

关于跳出循环

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-8-3
在线时间
29 小时
发表于 2017-8-3 17:39:06 | 显示全部楼层 |阅读模式
2金钱
          主程序的循环,
       while(flag3)
         {
                while(flag1)        //对应按键key0,
                {       
                        TIM_SetCompare1(TIM1,300);
                        LED1=1;
                        delay_ms(500);
                        TIM_SetCompare1(TIM1,0);
                        LED1=0;
                  delay_ms(500);                       
                }       

                while(flag2)        //对应按键key1,
                {
                        delay_ms(10);
                        LED1=1;
                        if(dir)led0pwmval++;
                        else led0pwmval--;
                        if(led0pwmval>300)dir=0;
                        if(led0pwmval==0)dir=1;
                        TIM_SetCompare1(TIM1,led0pwmval);
          }

         }
为什么while(flag3)这个循环一旦进入之后就出不来了!我设定了按键使flag3取反!


最佳答案

查看完整内容[请看2#楼]

确定按键按下后是否能处理到flag3的取反程序。或者按键按下是否触发中断函数,由中断函数处理flag3的取反。上面的程序看不到flag3的取反程序,如果直接将flag3的取反程序放在外面,又不通过任何中断去处理可能就永远执行不到了。可以将flag3的处理程序放在while(flag3)里面。另外while(flag2)与while(flag3)是否会出现死循环也需要注意下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-7-5
在线时间
20 小时
发表于 2017-8-3 17:39:07 | 显示全部楼层
确定按键按下后是否能处理到flag3的取反程序。或者按键按下是否触发中断函数,由中断函数处理flag3的取反。上面的程序看不到flag3的取反程序,如果直接将flag3的取反程序放在外面,又不通过任何中断去处理可能就永远执行不到了。可以将flag3的处理程序放在while(flag3)里面。另外while(flag2)与while(flag3)是否会出现死循环也需要注意下。
回复

使用道具 举报

0

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-6-19
在线时间
55 小时
发表于 2017-8-3 18:12:18 | 显示全部楼层
while外面取反了吧
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-8-3
在线时间
29 小时
 楼主| 发表于 2017-8-3 18:31:52 | 显示全部楼层
jokeym 发表于 2017-8-3 18:12
while外面取反了吧

我设置的是按键按下,flag3取反,可是,并不能起到跳出循环的效果
回复

使用道具 举报

29

主题

311

帖子

0

精华

高级会员

Rank: 4

积分
747
金钱
747
注册时间
2016-5-21
在线时间
199 小时
发表于 2017-8-3 19:08:38 | 显示全部楼层
peanut 发表于 2017-8-3 18:31
我设置的是按键按下,flag3取反,可是,并不能起到跳出循环的效果

只取反了flag3,又没取反flag2 flag1,那么就是死在while(flag1)里面啊,这个while出不来
回复

使用道具 举报

3

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2017-7-16
在线时间
24 小时
发表于 2017-8-3 19:42:23 | 显示全部楼层
上面说得对,我觉得某些情况用if比while好用
回复

使用道具 举报

17

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2532
金钱
2532
注册时间
2016-3-6
在线时间
393 小时
发表于 2017-8-4 08:07:03 | 显示全部楼层
里面还有循环
路漫漫其修远兮,吾将上下而求索。
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-10-20
在线时间
64 小时
发表于 2017-8-4 08:38:46 | 显示全部楼层
本帖最后由 hasaki 于 2017-8-4 08:42 编辑

首先你所谓的取反是按一下取反然后值不变还是只有按的时候取反如果值不变那么1和2是不是也是这样如果也是那么你就需要保证你想跳出外面循环是 里面的循环条件不成立
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2017-8-4 10:11:43 | 显示全部楼层
程序逻辑问题,你应该把功能线理清楚了。不然像你这个肯定死在某个while中了
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2017-8-4 10:39:50 | 显示全部楼层
仿真看死哪了
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-8-4 13:50:39 | 显示全部楼层
逻辑问题、死机、通信不正常(spi、i2c、uart)。。。。,单步调试立刻找到问题。
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-8-3
在线时间
29 小时
 楼主| 发表于 2017-8-7 10:38:16 | 显示全部楼层

死在while(flag3)。进去了就出不来了
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-8-1
在线时间
15 小时
发表于 2017-8-7 16:38:40 | 显示全部楼层
peanut 发表于 2017-8-7 10:38
死在while(flag3)。进去了就出不来了

进入了while(flag3)后无按键扫描程序。。。进入了死循环  怎会出得来
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 04:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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