Assembly Atmega128组装项目

Assembly Atmega128组装项目,assembly,avr,Assembly,Avr,我试图通过玩Atmega128板来学习一点组装。我试图使一组8个LED在按下相应按钮时分别打开/关闭 .INCLUDE "m128def.inc" .CSEG .ORG $0 initialize: ldi r16, 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0 out PORTB, r16

我试图通过玩Atmega128板来学习一点组装。我试图使一组8个LED在按下相应按钮时分别打开/关闭

.INCLUDE "m128def.inc"
.CSEG
.ORG $0

initialize:
    ldi     r16, 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0
    out     PORTB, r16          ; Pull up resistors
    ldi     r16, 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3 | 1<<2 | 1<<1 | 1<<0
    out     DDRD, r16           ; set all pins on PORTD to output

test:
    in      r16, PINB           ; input values of buttons
    swap    r16                 ; invert so button pressed makes value low
    out     PORTB, r16          ; output to led
end:
    rjmp    test

PINA和PORTA指的是相同的物理引脚。AVR有两个名称用于区分输入和输出

上面的代码有一半的引脚(0到3)配置为输出,引脚4到7是带上拉的输入

代码的下一部分不是很清楚。您正在读取0到3作为输入,然后移动以写入引脚4到7以及引脚1。这与管脚的初始设置不兼容。电流仍然会从输入管脚流出,但其设计并不能很好地工作

您是否将按钮和LED连接到相同的引脚?然后,您应该在pin上使用一个或另一个,并适当设置DDR和上拉。确定按钮的接线方式。他们将输入拉低至接地还是拉高至Vcc

我不认为有一种方法可以让pin与您正在使用的轮询代码同时成为输入和输出。如果您想将按钮设置为0到3,将输出设置为4到7,则需要稍微更改代码

.INCLUDE "m128def.inc" 
.CSEG 
.ORG $0

initialize:
    ldi r16, 1<<3 | 1<<2 | 1<<1 | 1<<0         ; pullup inputs
    out PORTA, r16 
    ldi r16, 1<<7 | 1<<6 | 1<<5 | 1<<4         ; 4 to 7 are output
    out DDRA, r16
test:
    in r16, PINA
    lsr r16 
    lsr r16
    lsr r16
    lsr r16
    ori r16, 1<<3 | 1<<2 | 1<<1 | 1<<0         ; pullup 0 to 3, and output to 4 to 7
    out PORTA, r16
end:
    rjmp test
。包括“m128def.inc”
.CSEG
.ORG$0
初始化:

ldi r16,1我的编辑是否有助于清理问题?我意识到我的问题中有一些错误,所以我把它清理干净了。@codedude交换指令不是你想要的。它在寄存器字节内交换半字节(4位)。您可能需要NEG。但这只有在按钮将引脚连接到gnd时才起作用。也就是说,输入通常为1,但按下按钮时变为0。此外,代码中的常量不必是这样的长表达式。如果愿意,可以使用0xff。像您一样加载r16两次也是安全的编码实践,但不是必需的。在first out指令之后,它仍然保持0xff。
.INCLUDE "m128def.inc" 
.CSEG 
.ORG $0

initialize:
    ldi r16, 1<<3 | 1<<2 | 1<<1 | 1<<0         ; pullup inputs
    out PORTA, r16 
    ldi r16, 1<<7 | 1<<6 | 1<<5 | 1<<4         ; 4 to 7 are output
    out DDRA, r16
test:
    in r16, PINA
    lsr r16 
    lsr r16
    lsr r16
    lsr r16
    ori r16, 1<<3 | 1<<2 | 1<<1 | 1<<0         ; pullup 0 to 3, and output to 4 to 7
    out PORTA, r16
end:
    rjmp test