Carlos,
;* q_alvos *
.include <C:\Programas\Atmel\AVR Tools\AvrAssembler\Appnotes\1200def.inc>
.def temp=r16 ;define variável temp no registo 16
init:
ser temp ;define temp $FF (255)
out ddrb,temp ;define direção como output
ldi temp,0b11111110 ;copia o valor binário para variável temp
out ddrd,temp ;define a entrada (1ª - PD0)
programa:
clr temp ;limpa o registo
out portb,temp ;coloca porta B a zero
ldi temp,0b01111111 ;
out portd,temp ;define saída porta D
ldi temp,0b00000000
out portb,temp
teste:
sbis pind,0 ;verifica se o botão 1 está carregado
rjmp n1
sbis pind,1 ;verifica se o botão 2 está carregado
rjmp n2
sbis pind,3 ;verifica se o botão 3 está carregado
rjmp n3
sbis pind,5 ;verifica se o botão 4 está carregado
rjmp n4
sbis pind,6 ;verifica se o botão 5 está carregado
rjmp n5
sbis pind,2 ;verifica se o RESET está carregado
rjmp reset
out portb, temp ; mostra variavel temp no display
rjmp teste
n1:
push temp ; salva temp anterior
ldi temp,0b00000110
rjmp teste
n2:
push temp ; salva temp anterior
ldi temp,0b01011011
rjmp teste
n3:
push temp ; salva temp anterior
ldi temp,0b01001111
rjmp teste
n4:
push temp ; salva temp anterior
ldi temp,0b01100110
rjmp teste
n5:
push temp ; salva temp anterior
di temp,0b01101101
rjmp teste
reset:
pop temp ; recupera o temp salvo na pilha
rjmp teste
Dê uma olhada, ainda falta testar se a pilha chegou no limite inferior, e não dar mais pop nesse caso. Sugestão: testar se valor do registrador de pilha (STACK) chegou no valor inicial de endereço na SRAM.