环形计数器avr汇编器,

时间:2016-09-19 23:02:46

标签: assembly avr atmel

我必须做一个汇编程序。我应该让戒指柜台像: -

功能,8个LED:

(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

2 个答案:

答案 0 :(得分:1)

您的信息有点罕见,所以我必须找出您正在做的事情:)

从我看到的,您使用的是AtMega微控制器

如果'重置'是关闭所有LED的功能

reset:
    ldi r20, 0xFF
    out PORTA, r20

然后这段代码告诉我,端口上的0会打开LED。

lsl r20 

向左移动,插入一个ZERO,它将打开LED,这不是你想要的。

你必须打开最右边的位(不要问我怎么样,我不喜欢Atmel)

我会尝试:

sec
rol r20

(这应该设置进位标志,并将rol转换为1进入r20)

答案 1 :(得分:0)

我不确定“响铃计数器”,但我想你想要一个正在运行的led?如果是,那么也许这可以帮助

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

使用rol将改变i
的值 初始化:1(0b0000 0001)
第一卷:(0b0000 0010)
..
..
第7卷:(0b1000 0000)
第8卷:(0b0000 0000)<< - 执行重置

希望这会有所帮助