![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - 請問一下,8051的先進魔人大大們
(https://www.pcdvd.com.tw/showthread.php?t=638029)
|
---|
引用:
哦...這點小弟到是疏忽了;採用的是單顆紅藍雙色LED(即一顆 LED裡有紅藍兩種顏色) ,所以紅藍一起亮是呈現紫色 嗯....大大您先看看小弟的想法 現在要讓紅色 32 顆 LED 左旋;藍色 32顆 LED 右旋 因為一個埠只有 8 個 I/O 只能驅動 8 顆 LED 所以 8 X 4( P0 & P1 & P2 & P3 總共 4個埠) = 32 顆 LED 然後要讓 P0 & P1 & P2 & P3 動作可以連續下去 所以採用 RRC 和 RLC 這兩個旋轉指令;這樣紅色和藍色 4 個埠的值就可以連續位移下去 所以先讓紅色 4 個埠 的資料都位移一次透過LED顯示出來 藍色 4 個埠 的資料都位移一次透過LED顯示出來 這樣我們看起來,就好像紅色藍色LED各自從 P0.6 移動 不知道大大您目前知道小弟的觀念和想法了嗎!?@_@!? |
那如何決定要亮紅的藍的?
都是32個,表每一PIN一定接紅藍各一,你是輸出LO時點亮的吧。 LED是3PIN吧。 你的程式似乎有個隱藏的大BUG,我51只玩半年,而是4年前的事了,不過我總覺得會有這個BUG,也可能我多慮,這個就由其他熟人出來証實了。 |
引用:
光看這二行…就會覺得…上面是多寫的… A=#40H 再輸出A,那當然是01000000b 囉…… 我已經很久沒碰了…還是看得懂ㄝ~~~ 當然如果是mov A,40H 那又另當別論了… |
引用:
沒錯!!LED就是3的PIN 大大您真內行!^^! 小弟想到一點可能就是 的C值就有問題 因為左旋完之後接著又右旋 那就是左旋完之後的 C值又被右旋接著繼續用 但這就是小弟不太懂的地方 如果真的是這樣 那應該紅藍LED還是會繼續左旋右 旋下去,只是右旋的動作會不正確才對 可是現在看起來只有右旋才有動作....Orz |
引用:
大大您真是一語驚醒夢中人呀....!^^! 小弟終於明白了!n_n!甘溫唷.....!^^! |
引用:
:D :D 想到了呀,沒錯,這就是BUG所在,事實上你是在旋轉33bit 而你一開始在旋轉前的 C的內值是如何你不知道,所以你要準備2個bit用來各別存放第33bit的狀態。 例如: C_RLC_LAST_STA REG 48H.0 C_RRC_LAST_STA REG 48H.1 在你的 L_CHANGE: 中的第一行及RET前一行加上 MOV C,C_RLC_LAST_STA (我忘了有沒有這樣的用法,若沒有就自行替換) ....... 原本程式 ...... MOV C_RLC_LAST_STA,C RET 同樣在 R_CHANGE: 也是加入... MOV C,C_RRC_LAST_STA ........ MOV C_RRC_LAST_STA,C RET 而程式一開始就先把1存入C_RLC_LAST_STA 及C_RRC_LAST_STA 內。 而至於為何沒出錯,可能與你目前程式比較單純有關,等程式一大這BUG就會慢慢顯現出來。 你工作的地方沒有ICE或模擬器嗎? 這用單步追蹤幾次就差不多知道問題所在了。 |
引用:
.CHIP 8052 ;---------------------------------------------- ORG 0000H LCALL DELAY RL_C REG 30H.0 RR_C REG 30H.1 SETB 30H.0 SETB 30H.1 ;---------------------------------------------- MOV 40H,#DFH MOV 41H,#FFH MOV 42H,#FFH MOV 43H,#FFH MOV 44H,#DFH MOV 45H,#FFH MOV 46H,#FFH MOV 47H,#FFH ;---------------------------------------------- LOOP: MOV C,RL_C LCALL L_DATA MOV A,40H MOV P0,A MOV A,41H MOV P1,A MOV A,42H MOV P2,A MOV A,43H MOV P3,A MOV RL_C,C LCALL DELAY1 ;---------------------------------------------- MOV C,RR_C LCALL R_DATA MOV A,44H MOV P0,A MOV A,45H MOV P1,A MOV A,46H MOV P2,A MOV A,47H MOV P3,A MOV RR_C,C LJMP LOOP ;------------------------------------------- 大大我有改了,可是跑出來的結果還是一樣只有右旋的說...Orz 呃...大大我待的只是間小小的在做電玩(就是八大行業的那種電玩)的小小企業社而已!>"<!沒有您所謂的 ICE或模擬器 的說~"~ |
你把左右旋的程式對調看看,結果如何。
當然我所提的方式,也是有問題存在的,因為你只有32個LED,要做33次轉動,那一定有一次LED會全不亮。 OK,白天有空繼續 :Q |
引用:
大大小弟找到了,就是延遲時間啦....XD MOV C,RR_C LCALL R_DATA MOV A,44H MOV P0,A MOV A,45H MOV P1,A MOV A,46H MOV P2,A MOV A,47H MOV P3,A MOV RR_C,C LJMP LOOP 還要再補上一行延遲時間副程式....不然8051太快會顯示不出!^^! 另外小弟對8051的記憶體架構有點問題和疑問可以方便和大大討論嗎!? |
跟著我不好吧,我只玩半年而已,你有到"雷兒"吧,那邊比我專的一堆 :D
|
所有的時間均為GMT +8。 現在的時間是08:10 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。