![]() |
12樓說得好,在第23行的for開始中已經重新給i賦值為0了,所以第29行的i=0是多余的,且n應該重新賦值才能讓for循環中語句正常工作,所以把第29行改為n=1就可以實現流水燈了。 |
你還是弄個豆包AI編程吧,要快很多 |
keemee 發表于 2025-3-27 02:01 默認就是data,加不加效果一樣,并不是錯的。 |
為何是亂亮? |
keemee 發表于 2025-3-27 01:56 為何是亂亮? |
keemee 發表于 2025-3-27 01:49 有沒有可能*2就是被編譯為左移了,事實上8次后就永遠都是0了。就是全都滅的狀態了。樓主并沒有說這個流水燈只流一次還是一直流。 |
sunwind001 發表于 2025-3-26 20:20 還是要看看書的,當然也可以自己試試看,全局的變量和參數是不是一個,以及各自的作用范圍 |
data是錯的 |
sgq657785 發表于 2025-3-24 11:58 溢出并不影響亮燈,亂亮而已,關鍵問題不對 |
188610329 發表于 2025-3-24 09:46 他前面定義時n=1呀 |
普中的板子,不太懂,不知有沒有LED流水燈的總開關,或者控制芯片 |
paladina 發表于 2025-3-24 08:59 溢出了影響流水燈依次亮,也能亂亮 |
延時函數內部沒有使用傳進來的參數,變成了很短的定時函數 |
mirvv 發表于 2025-3-24 09:40 一次定義全局變量,多次使用并不會無限增加內存占用 |
xiaobendan001 發表于 2025-3-24 10:23 沒有警告,我是想在最開頭聲明nTime,延時函數直接用我聲明的nTime,這樣不可以嗎 |
mirvv 發表于 2025-3-24 09:40 請問這應該怎么釋放內存 |
xiaobendan001 發表于 2025-3-24 10:23 我沒考慮到char的范圍,現在改一改,延時函數那邊我已經改過了,把30行和29行換一個位置就都能流了,感謝 ![]() |
CQ123 發表于 2025-3-26 14:12 好的,這樣改就可以流水了 |
188610329 發表于 2025-3-24 09:46 n = 1;啊 |
把最后的i=0改成n=1; |
第29行i=0無意義,改成n=1即可。 |
主要是8次循環后n沒有重新置1,后面就溢出了 |
把最后的i=0改成n=1; |
代碼原理大概沒啥問題。但是你延時函數的參數沒有使用。就是調用的時候的500沒起作用。顏色400周期后退出,400周期很快的,就是可能一瞬間就完成了8個LED的流水,你沒看到。實際上是7個,因為你輸出時是先N*2的。這樣第一個實際上是沒有亮過的。如5樓那樣改下延時讓參數起作用試試看。 而且你聲明是全局的NTIME變量,然后在形參里面也用了NTIME,并且沒有指明類型。這習慣不好,容易混淆。不指定類型的參數會是什么類型?另外這種編譯時不會有警告嗎?如果是你聲明的CHAR類型那么你傳給他一個500是超了范圍的。 |
你還是很有想象力的,不過要注意N的階乘容易溢出 |
188610329 發表于 2025-3-24 09:46 人家N不是初始化=1了? |
n = 0, n*2 依然 = 0, n*2*2*2*2…… 也依然是 0 從頭到尾 n = 0, 從頭得尾 P2 = 0xff 你希望 怎么流水燈?? |
sunwind001 發表于 2025-3-23 16:59 你的unsigned char n = 1,是全局變量,不釋放內存,你這一直循環的話,char類型最大256,多循環幾次就char就溢出了就是這個變量n錯了; |
呃。我猜你是想表達是的P2 = 0XFF << 1 ? |
#include <STC89C5xRC.H> void DelayXms(unsigned int ms) { unsigned int i, j; for (i = ms; i > 0; i--) for (j = 110; j > 0; j--); } void main() { unsigned char i; while(1) { for(i=0; i<8; i++) { P2 = 0xFF - (0x01 << i); // 逐位點亮 DelayXms(500); } } } 1.查看一下你的LED端口是否為P2等等,確認硬件端口正確 2.參數類型確認 3.端口移位操作 |
用移位操作,你的n=n*2 會超出0XFF while(1) { for(i = 0; i < 7; i++) { P2 = ~(0x01 << i); DelayXms(500); } |
延時函數那邊已經修改過了 |
把while(1)框架刪除,是全亮而且板子一直響 |