[問題] 單燈右移(1000P給第一位正確解答)

看板C_and_CPP作者 (謝謝.....)時間14年前 (2011/08/28 15:46), 編輯推噓1(108)
留言9則, 5人參與, 最新討論串1/1
最近練習用 keil C 寫c來操控8051 在做一秒的P0 8bit的單燈右移遇到了一點小問題 code寫完後她是一秒後又移了3個,也就是跑了3+8k 節錄如下 P1mem=1; while(1) { P0=~P1mem; while(systimer!=4999) { } if(P1mem==0x80) P1mem=1; else P1mem<<=1; } void T0_int(void) interrupt 1 { systimer++; if(systimer==5000) { // systimer=5000時為1秒 systimer=0; syssec++; } TF0=0; } 應該是在while迴圈中加一行即可搞定 讓他不要移3+8k,只要1即可 但我想破頭還是想不出來 QQ 麻煩版友們解答~ 謝謝 P.S 明天測試成功後即發出1000p -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.32.121 ※ 編輯: a023087 來自: 59.121.32.121 (08/28 23:46)

08/29 01:04, , 1F
1000P耶~
08/29 01:04, 1F

08/29 01:34, , 2F
收不收ASM!
08/29 01:34, 2F

08/29 09:14, , 3F
~"~
08/29 09:14, 3F

08/29 10:45, , 4F
你應該在while迴圈裡判斷syssec是否加1...
08/29 10:45, 4F

08/29 10:46, , 5F
還有你的程式碼可讀性很差...
08/29 10:46, 5F

08/29 20:41, , 6F
當systimer==4999的時候,你的while loop會瘋狂執行很多次
08/29 20:41, 6F

08/29 20:43, , 7F
解法是在4999的下一行寫: while(systimer==4999);
08/29 20:43, 7F

08/29 20:45, , 8F
比較好的解法是把P1mem的邏輯,從while(1)移到T0_int()的
08/29 20:45, 8F

08/29 20:45, , 9F
if (systimer==5000) 裡面, 反正它剛好一秒會被執行一次.
08/29 20:45, 9F
文章代碼(AID): #1EMcAx6u (C_and_CPP)