Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
.include "m8def.inc"
.cseg
.org 0x0000
rjmp inicio
.org 0x0001
rjmp int_ext0
.org 0x0002
rjmp int_ext1
int_ext0:
sbic pind, 2
rjmp int_ext0
ldi r19, 20
cpi r19, 20
breq parar
int_ext1:
sbic pind, 3
rjmp int_ext1
ldi r19, 255
cpi r19, 20
breq parar
inicio:
ldi r16, high(ramend)
out sph, r16
ldi r16, low(ramend)
out spl, r16
sbi ddrb, 0
sbi ddrb, 1
cbi ddrd, 1
cbi ddrd, 2
sei
ldi r16, 0b00001010
out mcucr, r16
ldi r16, 0b11000000
incremento:; etiqueta
rcall delay25m; delay antirrebote
rcall multiplexar; llamada a subrutina relativa "multiplexar"
sbic pind, 2; si presiono el PINB2, salto a la siguiente linea
rjmp incremento; si no presiono PINB2, salto a incremento
lds r16, unidades; cargar r16 con el contenido de la constante "unidades"
lds r17, decenas; cargar r17 con el contenido de la constante "decenas"
inc r16; incremento en una unidad el registro r16
cpi r16, 10; comparo, si r16 < 10
brmi salir; si cumple la condicion anterior, salimos, si no...
clr r16; unidades a cero
inc r17; incremento en una unidad el registro r17
cpi r17, 10; analizo si r17 < 10
brmi salir; si cumple la condicion anterior, salimos, si no...
clr r17; decenas a cero
rjmp salir; salimos
decremento:; etiqueta
rcall delay25m; delay antirrebote
rcall multiplexar; llamada a subrutina relativa "multiplexar"
sbic pind, 3; si presiono PIND3, salto a la siguiente linea
rjmp decremento; si no presiono PIND3, salto a "decremento"
lds r16, unidades; cargo en r16 los datos almacenados en la constante "unidades"
lds r17, decenas; cargo en r17 los datos almancenados en la constante "decenas"
cpi r16,0; comparo r16 con 0
breq dec_unidades; salto si las unidades llegan a ser cero; si no...
dec r16; decremento en una unidad el registro r16
rjmp salir;si es mayor que cero, salimos
dec_unidades:;cada vez que las unidades lleguen a cero
ldi r16, 9; se hace 9 las unidades
cpi r17, 0; comparo r17 con 0
breq dec_decenas; salto si las decenas llegan a ser cero, si no...
dec r17; decremento en una unidad el registro r17
rjmp salir; si es mayor que cero, salimos
dec_decenas:; cada vez que las decenas lleguen a cer
ldi r17, 9; se hace 9 las decenas
rjmp salir; salimos
salir:; cuando salimos
sts unidades, r16; almaceno en SRAM
sts decenas, r17; almanceno en SRAm
clr bandera; limpio el registro R19, para volver a analizar las interrupciones
rjmp mostrar; muestro los nuevos datos en los displays
multiplexar:;para multiplexar los displays
sbi portc, 0; deshabilito ambos
sbi portc, 1; displays
lds r16, unidades; cargo en los datos almacenados en r16
lds r15, decenas; cargo los datos almacenados en r15
mov r28, r30; copiamos la direccion donde estan los datos del display
mov r29, r31; copiamos la direccion donde estan los datos del display
add r30, r16; se suma el valor de unidades, para desplazarse en a la tabla "display"
lpm r16, z; cargo z en r16
mov r30, r28; copio r28 en r30
add r30, r15; se suma el valor de decenas, para desplazarse en la tabla "display"
lpm r15, z; cargo z en r15
mov r30, r28; copio r28 en r30
out portb, r16; se muestra en el display unidades el valor correspondiente
cbi portc, 1; prendo el display unidades
rcall delay1m; tiempo de retardo para que sea visible al ojo
sbi portc, 1; apago el display unidadess
nop nop nop nop nop nop nop nop; el display requiere de un tiempo para apagarse
out portb, r15; se muestra en el display decenas el valor correspondiente
cbi portc, 0
rcall delay
rcall analisis1
analisis:
sbic pind, 2
ret
rjmp apagar
analisis1:
sbic pind, 2
rjmp prender
rjmp apagar
apagar:
cbi portc, 1
rjmp inicio
delay:
ldi r17, 255
x2:
ldi r18, 255
x1:
dec r18
brne x1
dec r17
brne x2
ret
int_ext0:
sbic pind, 2
rjmp int_ext0
ldi r19, 255
cpi r19, 255
breq prender