标题: 关于C语言if语句的执行分析 [打印本页]

作者: jianuli    时间: 2021-3-16 18:54
标题: 关于C语言if语句的执行分析
大家好,有个语句执行顺序想不通,如图,t是按键按下累计,当按键按到4时,也就是t为4时让LED4依次自动亮到LED8,但是发现有时不是从LED4开始亮的,按到4后有时亮LED6开始、有时LED7开始、有时LED8开始。这是为什么呢,不是按顺序下来的吗?不要说if语句不能这样用,我只想知道为什么而已,谢谢啦,还有不关按键和延时的事,我改了还是会出现

IMG_20210316_184239.jpg (1.09 MB, 下载次数: 76)

IMG_20210316_184239.jpg

作者: zuiqf1978    时间: 2021-3-16 21:00
是不是需加延时?
作者: a4732710    时间: 2021-3-16 21:39
按键处理问题
作者: a4732710    时间: 2021-3-16 21:41
程序是按顺序执行的
作者: wulin    时间: 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,进入下次循环。单片机玩的就是逻辑与时间,楼主这段代码的逻辑与时间都存在问题。


作者: 547886405    时间: 2021-3-16 23:40
按键状态应该是通过中断获取的吧。中断发生的时候,程序可能正在执行5个t==4语句中的任意一个,这个是随机的,取决于中断的时间。如果按键采用扫描的方式,应该可以规避这个问题。
作者: a4732710    时间: 2021-3-16 23:45
while(1)顺序执行非常快的。你的t=4不知道什么时候出现。比如while顺序执行到第二或者第三个t==4后才出现t=4。那它肯定在那个if(t==4)执行
作者: liugao888    时间: 2021-3-16 23:50
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那么程序会按照你的设计正常进入,而如果中断进入时间在你的第二个或者第三个第四个中间那么就会出现随机状态。
作者: a4732710    时间: 2021-3-16 23:59
本帖最后由 a4732710 于 2021-3-17 00:05 编辑

你这样改while中第5行if((t==4)&&(LED3==0)就会顺序执行
或者改按键处理方法if……自己想肯定按顺序执行了
作者: liugao888    时间: 2021-3-17 00:03
if(t==4)不能做成多个,需要把多个整合成一个。按键为中断进入,时间为随机。如果进入时间刚好停留在多个if(t==4)前后就会出现跳过前面的if(t==4)过程。
作者: a4732710    时间: 2021-3-17 07:43
要想每次都从LED4亮起,需要从第5行改起i((t==4)&&(LED3==0))
第6行if((t==4)&&(LED4==0))第7行if((t==4)&&(LED5==0))依此类推
也可以改按键处理程序
作者: aking991    时间: 2021-3-17 08:11
你应该用
if(){
}
else if(){
}
else{
}
应用这样的判断顺序就不会出现你说的样子了,祝你顺利
作者: design003    时间: 2021-3-17 08:58
做程序还是要严谨些,   机器是不会出错的,这是做开发的根基。这样的程序架构本身就不合理,要知道延时300对于单片机来说是很长的时间足够单片机做很多事情了。在此期间你处理了t值就会出现你所说的现象
作者: 名字不是重点    时间: 2021-3-17 09:37
超过3个的并列IF,请使用Switch
作者: hjh800512    时间: 2021-3-17 09:48
路过,看了下虽然看不懂,但是帮你顶。
作者: jianuli    时间: 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也按顺序运行完吧,还是不能理解
作者: jianuli    时间: 2021-3-17 12:52
547886405 发表于 2021-3-16 23:40
按键状态应该是通过中断获取的吧。中断发生的时候,程序可能正在执行5个t==4语句中的任意一个,这个是随机 ...

按键我用扫描做的程序或延时做的程序,LED也都会跑飞
作者: jianuli    时间: 2021-3-17 12:54
a4732710 发表于 2021-3-16 23:45
while(1)顺序执行非常快的。你的t=4不知道什么时候出现。比如while顺序执行到第二或者第三个t==4后才出现t= ...

我的理解像你一样,但是程序不是从上边执行下来的吗?
作者: jianuli    时间: 2021-3-17 12:57
liugao888 发表于 2021-3-16 23:50
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那 ...

谢谢回复,这样写是为了验证自己的想法,正规点不会这样写的
作者: jianuli    时间: 2021-3-17 12:57
a4732710 发表于 2021-3-16 23:59
你这样改while中第5行if((t==4)&&(LED3==0)就会顺序执行
或者改按键处理方法if……自己想肯定按顺序执行了

谢谢回复
作者: jianuli    时间: 2021-3-17 12:59
liugao888 发表于 2021-3-16 23:50
程序if (t==4)不应该使用4个,需要整合到一个里面。如果你的按键中断进入时间刚好在第一个if (t==4)之前那 ...

谢谢回复,我的理解跟你一样,发帖跟大家交流下
作者: jianuli    时间: 2021-3-17 13:00
liugao888 发表于 2021-3-17 00:03
if(t==4)不能做成多个,需要把多个整合成一个。按键为中断进入,时间为随机。如果进入时间刚好停留在多个 ...

嗯,应该是这样。谢谢回复
作者: jianuli    时间: 2021-3-17 13:01
aking991 发表于 2021-3-17 08:11
你应该用
if(){
}

嗯,正规点还是这样写的,谢谢回复
作者: jianuli    时间: 2021-3-17 13:06
15830266185 发表于 2021-3-17 08:58
做程序还是要严谨些,   机器是不会出错的,这是做开发的根基。这样的程序架构本身就不合理,要知道延时300 ...

是的,谢谢回复,以后会注意的,会写规范点,这里写出来仅交流用,
作者: jianuli    时间: 2021-3-17 13:07
名字不是重点 发表于 2021-3-17 09:37
超过3个的并列IF,请使用Switch

嗯,有时Switch比if不好用
作者: jianuli    时间: 2021-3-17 13:08
不一一回复啦,谢谢大家啦,从大家的回复中知道答案啦




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1