![]() |
發布時間: 2021-3-16 18:54
正文摘要:大家好,有個語句執行順序想不通,如圖,t是按鍵按下累計,當按鍵按到4時,也就是t為4時讓LED4依次自動亮到LED8,但是發現有時不是從LED4開始亮的,按到4后有時亮LED6開始、有時LED7開始、有時LED8開始。這是為什么 ... |
不一一回復啦,謝謝大家啦,從大家的回復中知道答案啦 |
名字不是重點 發表于 2021-3-17 09:37 嗯,有時Switch比if不好用 |
15830266185 發表于 2021-3-17 08:58 是的,謝謝回復,以后會注意的,會寫規范點,這里寫出來僅交流用, |
aking991 發表于 2021-3-17 08:11 嗯,正規點還是這樣寫的,謝謝回復 |
liugao888 發表于 2021-3-17 00:03 嗯,應該是這樣。謝謝回復 |
liugao888 發表于 2021-3-16 23:50 謝謝回復,我的理解跟你一樣,發帖跟大家交流下 |
a4732710 發表于 2021-3-16 23:59 謝謝回復 |
liugao888 發表于 2021-3-16 23:50 謝謝回復,這樣寫是為了驗證自己的想法,正規點不會這樣寫的 |
a4732710 發表于 2021-3-16 23:45 我的理解像你一樣,但是程序不是從上邊執行下來的嗎? |
547886405 發表于 2021-3-16 23:40 按鍵我用掃描做的程序或延時做的程序,LED也都會跑飛 |
wulin 發表于 2021-3-16 22:44 謝謝回復,t在沒有按鍵控制為0時,不能自行清0吧,就算清0也按順序運行完吧,還是不能理解 |
路過,看了下雖然看不懂,但是幫你頂。 |
超過3個的并列IF,請使用Switch![]() |
做程序還是要嚴謹些, 機器是不會出錯的,這是做開發的根基。這樣的程序架構本身就不合理,要知道延時300對于單片機來說是很長的時間足夠單片機做很多事情了。在此期間你處理了t值就會出現你所說的現象 |
你應該用 if(){ } else if(){ } else{ } 應用這樣的判斷順序就不會出現你說的樣子了,祝你順利 |
要想每次都從LED4亮起,需要從第5行改起i((t==4)&&(LED3==0)) 第6行if((t==4)&&(LED4==0))第7行if((t==4)&&(LED5==0))依此類推 也可以改按鍵處理程序 |
if(t==4)不能做成多個,需要把多個整合成一個。按鍵為中斷進入,時間為隨機。如果進入時間剛好停留在多個if(t==4)前后就會出現跳過前面的if(t==4)過程。 |
本帖最后由 a4732710 于 2021-3-17 00:05 編輯 你這樣改while中第5行if((t==4)&&(LED3==0)就會順序執行 或者改按鍵處理方法if……自己想肯定按順序執行了 |
程序if (t==4)不應該使用4個,需要整合到一個里面。如果你的按鍵中斷進入時間剛好在第一個if (t==4)之前那么程序會按照你的設計正常進入,而如果中斷進入時間在你的第二個或者第三個第四個中間那么就會出現隨機狀態。 |
while(1)順序執行非?斓摹D愕膖=4不知道什么時候出現。比如while順序執行到第二或者第三個t==4后才出現t=4。那它肯定在那個if(t==4)執行 |
按鍵狀態應該是通過中斷獲取的吧。中斷發生的時候,程序可能正在執行5個t==4語句中的任意一個,這個是隨機的,取決于中斷的時間。如果按鍵采用掃描的方式,應該可以規避這個問題。 |
假設變量t由外部中斷遞增,且周期遠大于delays_2ms(300),那么LED1、2、3隨t遞增分別點亮,當t=4時,LED4~8逐一點亮至全滅。如果t遞增周期小于LED4~8逐一點亮過程,t沒有機會清0,程序跑飛,亮燈隨機停留在LED4~7。要等到t溢出歸0,進入下次循環。單片機玩的就是邏輯與時間,樓主這段代碼的邏輯與時間都存在問題。 |
程序是按順序執行的 |
按鍵處理問題 |
是不是需加延時? |