我试着通过玩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这行得通吗?我把发光二极管连接到PortD上,按钮连接到端口/点对点。这基本上是我想用C写的(我精通C,而不是汇编)。也许这会让事情变得更清楚一些。
DDRD = 0xFF; // set to output
DDRB = 0; // set to input
PORTB = 255; // enable pull-up resistors
while (1) {
PORTD = ~PINB;
}发布于 2013-09-18 13:55:28
PINA和PORTA指的是相同的物理引脚。AVR有两个名称来区分输入和输出。
上面的代码有一半的引脚(0到3)被配置为输出,而引脚4到7是带脉冲的输入。
代码的下一部分并不是很清楚。您正在读取0到3作为输入,然后移动,以便写入引脚4至7,以及引脚1。这是不兼容的初始设置的引脚。电流仍然会流出一个输入引脚,但它的设计并不好。
你有按钮和leds连接在同一个引脚上吗?然后,您应该使用一个或另一个在一个别针,并设置DDR和拉适当。确定按钮是如何连接的。他们把输入拉低到地面还是高到Vcc?
我不认为在使用轮询代码的同时有一个引脚是输入和输出。如果您希望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 testhttps://stackoverflow.com/questions/18863119
复制相似问题