ajuda com interrupções em assembly

olá pessoal, beleza? então, finalmente consegui entender o assembly do 8051, e ja comecei a fazer alguns experimentos,
esse circuito aqui que eu montei e filmei funcionando, deveria fazer o seguinte, ele tem 4 teclas e 4 leds, as teclas vão no P0 e os leds em P2
três das quatro teclas pressionadas apaga um led cada uma e a outra ativa um sequencial.
só que quando eu ativo essa função, o programa fica preso no delay, eu ainda to meio cru no assembly e queria saber se tem algum meio de quebrar esse loop por meio das interrupções ou das teclas do port P0.
eu escolhi tentar dar um break pelo int 0
este é o codigo fonte:
asm code
video do circuito funcionando
esse circuito aqui que eu montei e filmei funcionando, deveria fazer o seguinte, ele tem 4 teclas e 4 leds, as teclas vão no P0 e os leds em P2
três das quatro teclas pressionadas apaga um led cada uma e a outra ativa um sequencial.
só que quando eu ativo essa função, o programa fica preso no delay, eu ainda to meio cru no assembly e queria saber se tem algum meio de quebrar esse loop por meio das interrupções ou das teclas do port P0.
eu escolhi tentar dar um break pelo int 0
este é o codigo fonte:
asm code
org 0000h
ajmp start
;-------------interrupção--------------
org 0003h
acall start
reti
;-----------------------------------------
mov A,#00h
mov A,P2
start:
;-----------configuração dos registradores de interrupção------
mov a,#10000001b
mov ie,a
mov a,#00000001b
mov ip,a
mov a,#00000001b
mov tcon,a
;---------------------------------------------------------------------
mov a,#000h
mov P0,a
loop:
jb P2.0,butt2 ;Botão 1 pressionado? Não, pula para butt2
setb B.0 ;Sim, seta flag0
sjmp testButt1 ;Desvia para testButt1
butt2:
jb P2.1,butt3 ;Botão 2 pressionado? Não, pula para butt3
setb B.1 ;Sim, seta flag1
sjmp testButt2 ;Desvia para testButt2
butt3:
jb P2.2,butt4 ;Botão 3 pressionado? Não, pula para butt4
setb B.2 ;Sim, seta flag2
sjmp testButt3 ;Desvia para testButt3
butt4:
jb P2.3,loop ;Botão 4 pressionado? Não, pula para loop
setb B.3 ;Sim, seta flag3
sjmp testButt4 ;Desvia para testButt4
testButt1:
jnb P2.0,$
clr B.0
mov a,#010h
mov P0,a
sjmp loop
testButt2:
jnb P2.1,$
clr B.1
mov a,#020h
mov P0,a
sjmp loop
testButt3:
jnb P2.2,$
clr B.2
mov a,#040h
mov P0,a
sjmp loop
testButt4:
jnb P2.3,$
clr B.3
call main
sjmp loop
;------------------sequencial------------------
MAIN:
MOV P0,#10H
CALL DELAY500MS
MOV P0,#20H
CALL DELAY500MS
MOV P0,#40H
CALL DELAY500MS
MOV P0,#80H
CALL DELAY500MS
JMP MAIN
DELAY500MS: ; rotina de delay
MOV R1,#0FFh ;MOVE O VALOR 250 DECIMAL PARA O REGISTRADOR R1
AUX1:
MOV R2,#0FFH ; 1X 500 MOVE O VALOR 249 DECIMAL PARA O REGISTRADOR R2
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500
NOP ; 1X 500 3000uS
AUX2:
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
NOP ; 1X 500 X 500 = 250000
DJNZ R2,AUX2 ; 2X 500 X 500 = 250000
DJNZ R1,AUX1 ; 2X 500 TOTAL 1,754000uS ou, 1,75 segundos
RET
end
video do circuito funcionando