找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4780|回复: 25
收起左侧

关于C语言if语句的执行分析

  [复制链接]
ID:777834 发表于 2021-3-16 18:54 来自触屏版 | 显示全部楼层 |阅读模式
大家好,有个语句执行顺序想不通,如图,t是按键按下累计,当按键按到4时,也就是t为4时让LED4依次自动亮到LED8,但是发现有时不是从LED4开始亮的,按到4后有时亮LED6开始、有时LED7开始、有时LED8开始。这是为什么呢,不是按顺序下来的吗?不要说if语句不能这样用,我只想知道为什么而已,谢谢啦,还有不关按键和延时的事,我改了还是会出现
IMG_20210316_184239.jpg
回复

举报

ID:366464 发表于 2021-3-16 21:00 | 显示全部楼层
是不是需加延时?
回复

举报

ID:151846 发表于 2021-3-16 21:39 | 显示全部楼层
按键处理问题
回复

举报

ID:151846 发表于 2021-3-16 21:41 | 显示全部楼层
程序是按顺序执行的
回复

举报

ID:213173 发表于 2021-3-16 22:44 | 显示全部楼层
假设变量t由外部中断递增,且周期远大于delays_2ms(300),那么LED1、2、3随t递增分别点亮,当t=4时,LED4~8逐一点亮至全灭。如果t递增周期小于LED4~8逐一点亮过程,t没有机会清0,程序跑飞,亮灯随机停留在LED4~7。要等到t溢出归0,进入下次循环。单片机玩的就是逻辑与时间,楼主这段代码的逻辑与时间都存在问题。

回复

举报

ID:892852 发表于 2021-3-16 23:40 | 显示全部楼层
按键状态应该是通过中断获取的吧。中断发生的时候,程序可能正在执行5个t==4语句中的任意一个,这个是随机的,取决于中断的时间。如果按键采用扫描的方式,应该可以规避这个问题。
回复

举报

ID:151846 发表于 2021-3-16 23:45 | 显示全部楼层
while(1)顺序执行非常快的。你的t=4不知道什么时候出现。比如while顺序执行到第二或者第三个t==4后才出现t=4。那它肯定在那个if(t==4)执行
回复

举报

ID:68800 发表于 2021-3-16 23:50 | 显示全部楼层
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那么程序会按照你的设计正常进入,而如果中断进入时间在你的第二个或者第三个第四个中间那么就会出现随机状态。
回复

举报

ID:151846 发表于 2021-3-16 23:59 | 显示全部楼层
本帖最后由 a4732710 于 2021-3-17 00:05 编辑

你这样改while中第5行if((t==4)&&(LED3==0)就会顺序执行
或者改按键处理方法if……自己想肯定按顺序执行了
回复

举报

ID:68800 发表于 2021-3-17 00:03 | 显示全部楼层
if(t==4)不能做成多个,需要把多个整合成一个。按键为中断进入,时间为随机。如果进入时间刚好停留在多个if(t==4)前后就会出现跳过前面的if(t==4)过程。
回复

举报

ID:151846 发表于 2021-3-17 07:43 | 显示全部楼层
要想每次都从LED4亮起,需要从第5行改起i((t==4)&&(LED3==0))
第6行if((t==4)&&(LED4==0))第7行if((t==4)&&(LED5==0))依此类推
也可以改按键处理程序
回复

举报

ID:65956 发表于 2021-3-17 08:11 | 显示全部楼层
你应该用
if(){
}
else if(){
}
else{
}
应用这样的判断顺序就不会出现你说的样子了,祝你顺利
回复

举报

ID:798631 发表于 2021-3-17 08:58 | 显示全部楼层
做程序还是要严谨些,   机器是不会出错的,这是做开发的根基。这样的程序架构本身就不合理,要知道延时300对于单片机来说是很长的时间足够单片机做很多事情了。在此期间你处理了t值就会出现你所说的现象
回复

举报

ID:824490 发表于 2021-3-17 09:37 | 显示全部楼层
超过3个的并列IF,请使用Switch
回复

举报

ID:889178 发表于 2021-3-17 09:48 | 显示全部楼层
路过,看了下虽然看不懂,但是帮你顶。
回复

举报

ID:777834 发表于 2021-3-17 12:50 来自触屏版 | 显示全部楼层
wulin 发表于 2021-3-16 22:44
假设变量t由外部中断递增,且周期远大于delays_2ms(300),那么LED1、2、3随t递增分别点亮,当t=4时,LED4~8 ...

谢谢回复,t在没有按键控制为0时,不能自行清0吧,就算清0也按顺序运行完吧,还是不能理解
回复

举报

ID:777834 发表于 2021-3-17 12:52 来自触屏版 | 显示全部楼层
547886405 发表于 2021-3-16 23:40
按键状态应该是通过中断获取的吧。中断发生的时候,程序可能正在执行5个t==4语句中的任意一个,这个是随机 ...

按键我用扫描做的程序或延时做的程序,LED也都会跑飞
回复

举报

ID:777834 发表于 2021-3-17 12:54 来自触屏版 | 显示全部楼层
a4732710 发表于 2021-3-16 23:45
while(1)顺序执行非常快的。你的t=4不知道什么时候出现。比如while顺序执行到第二或者第三个t==4后才出现t= ...

我的理解像你一样,但是程序不是从上边执行下来的吗?
回复

举报

ID:777834 发表于 2021-3-17 12:57 来自触屏版 | 显示全部楼层
liugao888 发表于 2021-3-16 23:50
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那 ...

谢谢回复,这样写是为了验证自己的想法,正规点不会这样写的
回复

举报

ID:777834 发表于 2021-3-17 12:57 来自触屏版 | 显示全部楼层
a4732710 发表于 2021-3-16 23:59
你这样改while中第5行if((t==4)&&(LED3==0)就会顺序执行
或者改按键处理方法if……自己想肯定按顺序执行了

谢谢回复
回复

举报

ID:777834 发表于 2021-3-17 12:59 来自触屏版 | 显示全部楼层
liugao888 发表于 2021-3-16 23:50
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那 ...

谢谢回复,我的理解跟你一样,发帖跟大家交流下
回复

举报

ID:777834 发表于 2021-3-17 13:00 来自触屏版 | 显示全部楼层
liugao888 发表于 2021-3-17 00:03
if(t==4)不能做成多个,需要把多个整合成一个。按键为中断进入,时间为随机。如果进入时间刚好停留在多个 ...

嗯,应该是这样。谢谢回复
回复

举报

ID:777834 发表于 2021-3-17 13:01 来自触屏版 | 显示全部楼层
aking991 发表于 2021-3-17 08:11
你应该用
if(){
}

嗯,正规点还是这样写的,谢谢回复
回复

举报

ID:777834 发表于 2021-3-17 13:06 来自触屏版 | 显示全部楼层
15830266185 发表于 2021-3-17 08:58
做程序还是要严谨些,   机器是不会出错的,这是做开发的根基。这样的程序架构本身就不合理,要知道延时300 ...

是的,谢谢回复,以后会注意的,会写规范点,这里写出来仅交流用,
回复

举报

ID:777834 发表于 2021-3-17 13:07 来自触屏版 | 显示全部楼层
名字不是重点 发表于 2021-3-17 09:37
超过3个的并列IF,请使用Switch

嗯,有时Switch比if不好用
回复

举报

ID:777834 发表于 2021-3-17 13:08 来自触屏版 | 显示全部楼层
不一一回复啦,谢谢大家啦,从大家的回复中知道答案啦
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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