Ejercicio 1:
.include "m32def.inc"
rjmp Start
Start:
declapuertos:
ldi r17,0xff; cargar el valor 0xff al registro r17
out ddrd, r17; configurar como salida el puerto d
ldi r17,0x00; cargar el valor 0x00 al registro r17
bucle:
sbis pinb,0; saltar si el bit 0 está recibiendo 1 logico
rjmp asc1; saltar asc1
rjmp des1; saltar des1
asc1:
ldi zh,high(display7seg1<<1) ;señalar el estado alto de nuestra tabla y guardarla en zh
ldi zl,low(display7seg1<<1) ;señalar el estado bajo de nuestra tabla y guardarla en zl
mov r19, r17; hacemos una copia del nuestro dato para que no sea afectado
andi r19,0x0f; el dato lo ponemos en el nible inferior
add zl, r19; sumamos el zl con el registro 19
clr r19; limpiamos el registro 19
adc zh, r19; sumamos el zh con el acarreo y el registro 19
lpm r19, z; recuperamos los dos registros de z y guardamos en r19
out portd, r19; exportamos el registro r19 en el puerto D
inc r17; incrementamos el registro 17
delay:
ldi r21, 11; cargamos el valor 11 al r21
ldi r22, 38; cargamos el valor 38 al r22
ldi r23, 94; cargamos el valor 94 al r23
L1: dec r23 ;decrementamos el r23
brne L1; preguntamos si la bandera de cero se activo
dec r22; decrementamos el r22
brne L1; preguntamos si la bandera de cero se activo
dec r21 ;decrementamos el r21
brne L1; preguntamos si la bandera de cero se activo
rjmp PC+1; saltamos al contador de programa +1
rjmp bucle; saltamos a bucle
des1:
ldi zh,high(display7seg1<<1) ;señalar el estado alto de nuestra tabla y guardala en zh
ldi zl,low(display7seg1<<1) ;señalar el estado bajo de nuestra tabla y guardala en zl
dec r17; decrementamos el registro r17
mov r19, r17; acemos una copia del nuestro dato para que no sea afectado
andi r19,0x0f; el dato lo ponemos en el nible inferior
add zl, r19; sumamos el zl con el registro 19
clr r19; limpiamos el registro 19
adc zh, r19; sumamos el zh con el acarreo y el registro 19
lpm r19, z; recuperamos los dos registros de z y guardamos en r19
out portd, r19; exportamos el registro r19 en el puerto D
delay2:
ldi r24, 11; cargamos el valor 11 al r24
ldi r25, 38; cargamos el valor 38 al r25
ldi r26, 94; cargamos el valor 94 al r26
L2: dec r26; decrementamos el r23
brne L2; preguntamos si la bandera de cero se activo
dec r25; decrementamos el r23
brne L2; preguntamos si la bandera de cero se activo
dec r24; decrementamos el r23
brne L2; preguntamos si la bandera de cero se activo
rjmp PC+1; saltamos al contador de programa +1
rjmp bucle; saltamos a bucle
display7seg1:
.db 0b00111111, 0b00000110
.db 0b01011011, 0b01001111
.db 0b01100110, 0b01101101
.db 0b01111101, 0b00000111
.db 0b01111111, 0b01101111
.db 0b01110111, 0b01111100
.db 0b00111001, 0b01011110
.db 0b01111001, 0b01110001
Esquemático:
Ejercicio 2:
.include "m32def.inc" ; incluimos la librería para utilizar nombres ya no direcciones
Declarar puertos:
ldi r17,0x00; cargamos al registro 17 con el valor de cero
out ddra,r17; configuramos el puerto a como entrada
ldi r17,0xff; cargamos al registro 17 con ek valor de 255
out ddrd,r17; configuramos el puerto d como salida
out ddrb,r17; configuramos el puerto b como salida
ldi r17,0x00; cargamos al registro 17 con el valor de cero
ldi r18,0x00; cargamos al registro 18 con el valor de cero
bucle:
sbis pinb,0; saltamos si existe uno lógico en el pin 1 del portb
sbis pinb,1; saltamos si existe uno lógico en el pin 2 del portb
rjmp asc1; saltamos a la etiqueta asc1
rjmp des1; saltamos a la etiqueta des1
asc1:
ldi zh,high(display7seg1<<1) ;apuntamos con la pila en la dirección baja de nuestra tabla display
ldi zl,low(display7seg1<<1) ;apuntamos con la pila en la dirección alta de nuestra tabla display
mov r19,r17; guardamos el r17 en r19 para que el r17 no sea afectado por el proceso
andi r19,0b000011111; nos aseguramos que los caracteres aparezcan con un rango mas
add zl,r19;sumo al puntero Z para que apunte al dato requerido
clr r19; limpiamos el r19
adc zh,r19;sumamos con acarreo para el desplazamiento de la tabla
lpm r19,z ; recuperamos el dato obtenido de Z en r19
des1:
ldi zh,high(display7seg1<<1);apuntamos con la pila en la dirección baja de nuestra tabla display
ldi zl,low(display7seg1<<1);apuntamos con la pila en la dirección alta de nuestra tabla display
dec r17; decrementamos el r17
dec r18; decrementamos el r18
mov r19,r17; guardamos el r17 en r19 para que el r17 no sea afectado por el proceso
andi r19,0b000011111; nos aseguramos que los caracteres aparezcan con un rango mas
add zl,r19;sumo al puntero Z para que apunte al dato requerido
clr r19 ; limpiamos el r19
adc zh,r19;sumamos con acarreo para el desplazamiento de la tabla
lpm r19,z;recuperamos el dato obtenido de Z en r20
display7seg1:
.db 0b11111100, 0b11001100
.db 0b11001111, 0b11011111
.db 0b11111111, 0b11011111
.db 0b00111111, 0b11000000
.db 0b11001100, 0b11001111
.db 0b11100011, 0b11100011
.db 0b11001111, 0b11001100
.db 0b00001111, 0b11001100
.db 0b11100011, 0b11110011
display7seg2:
.db 0b01000100, 0b01000100
.db 0b00010001, 0b00010000
.db 0b00000000, 0b00010000
.db 0b00000000, 0b01000100
.db 0b01000100, 0b00010001
.db 0b00011001, 0b00011001
.db 0b00010001, 0b00100010
.db 0b00000000, 0b01000100
.db 0b00010001, 0b00010001
Esquemático: