2016-09-19 92 views
0

我必須做一個彙編程序。我應該像一個環網櫃的工作: -Ring counter avr彙編器,

功能,8個指示燈:

(0000 000X, 0000 00X0, 0000 0X00, 0000 X000, 000X 0000, 00X0 0000, 0X00 0000, X000 0000) 

我已經作出了計劃,但它的工作,如:

(0000 000x, 0000 00xx, 0000 0xxx, 0000 xxxx, 000x xxxx, 00xx xxxx,0xxx xxxx,xxxx xxxx) 

有人可以幫助我如何一個一個做LED燈?

我的代碼

.include "m2560def.inc" 
ldi r20, HIGH(RAMEND) ; R20 = high part of RAMEND address 
out SPH,R2      ; SPH = high part of RAMEND address 
ldi R20, low(RAMEND) ; R20 = low part of RAMEND address 
out SPL,R20  ; SPL = low part of RAMEND address 
ldi r20, 0xFF 
out DDRA, r20 
ldi r20, 0b10000001  
out PORTA, r20 
loop_1: ; Begin a loop 
    rcall Delay 
    lsl r20 
    out PORTA,r20 
    cpi r20,0x00 ; 
    breq reset 
jmp loop_1 
Delay: 
    inc r16 
    cpi r16,0xFF  
    brne del_1 
ret go back to loop 
del_1:  
    inc r21 
    cpi r21,0xFF 
    brne del_1 
jmp Delay  
reset: 
    ldi r20, 0xFF 
    out PORTA, r20 
ret 

回答

1

你的信息是有點少見,所以我必須找出自己在做什麼:)

從我看到,您正在使用ATMEGA微控制器

如果「復位」是關斷所有的LED

reset: 
    ldi r20, 0xFF 
    out PORTA, r20 

那麼這個代碼電話功能對我來說,端口上的0會打開LED。

lsl r20 

lsl左移,插入一個ZERO,它將打開LED,這不是你想要的。

你必須把最右邊位(不要問我,我怎麼了,我不familliar與Atmel)

我會嘗試:

sec 
rol r20 

(這應該設置進標誌和羅爾將其轉換爲1到r20)

0

林不知道有關「環形計數器」,但我想你想讓跑步領導? 1(0b0000 0001)
第一ROL::(0b0000 0010)
..
..
如果是的話,那麼也許使用ROL會改變我
初始化值這可以幫助

ldi r20,0xff 
out PORTA,r20 ;output initialization 
ldi r23,1  ;unused registers 

loop : ;main loop 
out PORTA,i 
rcall delay ; you can use your delay function, i assume its correct 
rol r23  ; rotate the value 
cpi r23,0  ; this is "reset" when the led reach the 8th 
brne loop  ;back to loop 
ldi r23,1  ; reset the value 
rjmp loop  ;back to loop 

第7卷:(0b1000 0000)
8卷:(0b0000 0000)< < - 在這裏進行重置

希望這有助於