我必须做一个汇编程序。我应该让戒指柜台像: -
功能,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
答案 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)<< - 执行重置
希望这会有所帮助