欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5624|回復: 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 單片機教程網

快速回復 返回頂部 返回列表