Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *-----------------------------------------------------------
- * Title : Sesión 3. LED's, pulsadores e interruptores.
- * Ejercicio 7.
- * Written by : Sofía Andújar Muñoz
- * Date : 11/03/2021
- * Description: Vamos a programar un reloj que cuente de segundos
- * minutos y horas, vuelva a empezar y despues añadiremos un
- * reset y un enable con los pulsadores.
- *-----------------------------------------------------------
- ORG $1000
- SEG1 EQU $E00000
- SEG2 EQU $E00002
- SEG3 EQU $E00004
- SEG4 EQU $E00006
- SEG5 EQU $E00008
- SEG6 EQU $E0000A
- SEG7 EQU $E0000C
- SEG8 EQU $E0000E
- RETARDO EQU 19 * Haremos este retardo 5 veces para cada cuenta.
- * En total es un delay de 0,95 segundos, para compensar el tiempo que tarda el programa en procesarse
- PUL EQU $E00014 * Recordar activos a nivel bajo
- LEDS EQU $E00010
- START: ; first instruction of program
- CLR.B SEG1
- CLR.B SEG2
- CLR.B SEG3
- CLR.B SEG4
- CLR.B SEG5
- CLR.B SEG6
- CLR.B SEG7
- CLR.B SEG8
- CLR.B LEDS
- MOVE.L #TABLA,A1 * Guardamos en A1 la dirección de la tabla
- MOVE.L #TABLA_CON_PUNTO, A2 * Y en A2 la tabla con punto. Aunque podríamos usar siempre la tabla normal
- * y en caso de querer usar el punto hacer un BTST.B #8,SEG
- INICIO MOVE.L #$0,D1
- COUNT MOVE.L D1,-(A7) * Hago esto fuera de las subrutinas ya que D1 es un "output" de DEC_SEX
- JSR DEC_SEX * Primero haremos una especie de conversión de nuestro número en decimal a tres números sexadecimales
- JSR SHOW * Mostramos el valor de la cuenta actual
- MOVE.L (A7)+,D1
- MOVE.L #0,D5
- BUCLE_PULSADORES
- JSR WAIT * Hacemos el retardo
- JSR PULSADORES
- ADD.B #1,D5 * Comprobamos los pulsadores
- CMP.B #5,D5 * Utilizamos el registro D5 para contar que hacemos el bucle 5 veces
- BNE BUCLE_PULSADORES
- ADD.L #$1,D1 * Continuamos con el programa
- CMP.L #$15180, D1 * Si D1 es menor que 60*60*24 -> repetimos
- BCS COUNT
- JMP INICIO
- DEC_SEX DIVU.W #60,D1 * En D1 se guarda resto [31-16] (segundos) y cociente [15-0] (minutos)
- MOVE.W D1,D2 * Copiamos el cociente (minutos) en D2
- MOVE.W #0,D1 * Borramos el cociente
- SWAP.W D1 * Ponemos los segundos en los 16 bits menos significativos de D1
- DIVU.W #60,D2 * En D2 se guarda resto [31-16] (minutos) y cociente [15-0] (horas)
- MOVE.W D2,D3 * Copiamos el cociente en D3
- MOVE.W #0,D2 * Borramos el cociente
- SWAP.W D2 * Ponemos los min en los 16 bits menos significativos de D2
- RTS
- SHOW MOVEM.L D1-D3,-(A7)
- DIVU.W #10,D1
- MOVE.B (A1,D1),SEG7
- SWAP.W D1
- MOVE.B (A2,D1),SEG8
- DIVU.W #10,D2
- MOVE.B (A1,D2),SEG5
- SWAP.W D2
- MOVE.B (A2,D2),SEG6
- DIVU.W #10,D3
- MOVE.B (A1,D3),SEG3
- SWAP.W D3
- MOVE.B 0(A2,D3),SEG4
- MOVEM.L (A7)+,D1-D3
- RTS
- WAIT MOVEM.L D0-D1,-(A7)
- MOVE.L #RETARDO,D1
- MOVE.L #23,D0
- TRAP #15
- MOVEM.L (A7)+,D0-D1
- RTS
- PULSADORES
- MOVE.B PUL, D4 * Cargo el estado de los pulsadores en D4
- BTST.L #0,D4 * Sólo vamos a comprobar 2 pulsadores, el 0 y el 1.
- BEQ PUL0 * Si el primer pulsador vale 0 hacemos un RESET
- SIG_PUL BTST.L #1,D4 * Compruebo el segundo Pulsador, el que hace de ENABLE
- BEQ PUL1
- FIN_PUL RTS
- PUL0 BSET.B #0,LEDS * Enciendo el LED correspondiente al pulsador para que se entienda mejor
- JSR SOLTARPUL0 * Hasta que no suelte el pulsador, no voy a realizar la instrucción
- BCLR.B #0,LEDS * Apago el LED correspondiente, puesto que ya no estoy pulsando
- JMP INICIO * Voy directamente al incio del programa. En este paso hay que tener cuidado con el STACK
- PUL1 BSET.B #1,LEDS * Enciendo el LED correspondiente para que se entienda mejor
- JSR SOLTARPUL1 * Hasta que no se suelte el pulsador, no ejecuto la instrucción
- BCLR.B #1,LEDS
- JSR PULSARPUL1 * Hasta que no se vuelva a pulsar no voy a hacer nada. Salvo comprobar si se pulsa el RST
- BSET.B #1,LEDS
- JSR SOLTARPUL1 * Cuando se vuelva a pulsar espero a que sea soltado para continuaR
- BCLR.B #1,LEDS * Apago el LED
- JMP FIN_PUL
- PULSARPUL1
- MOVE.B PUL,D4
- BTST.L #0,D4 * Compruebo si se pulsa el bit 0 (el reset)
- BEQ PUL_ENA_RST * Si se pulsa voy a la subrutina correspondiente
- CONT1 BTST.L #1,D4 * Compruebo si se ha pulsado el enable de nuevo
- BNE PULSARPUL1 * Si no se ha pulsado, vuelvo a comprobar todo.
- RTS
- PUL_ENA_RST * Esta subrutina cubrirá el caso de que se detenga la cuenta y se quiera poner a 0 mientras está parada.
- BSET.B #0,LEDS * Enciendo el LED correspondiente para que se entienda mejor
- JSR SOLTARPUL0 * Hasta que no suelte el pulsador, no voy a realizar la instrucción
- BCLR.B #0,LEDS * Una vez soltado el pulsador, apago el LED
- CLR.L D1 * Pongo la cuenta a 0
- JSR DEC_SEX
- JSR SHOW * Y ejecuto un show, para actualizar los 7SEG.
- JMP CONT1 * Aún debo esperar a que se pulse el PUL1 y para seguir contando
- SOLTARPUL0
- MOVE.B PUL,D4
- BTST #0,D4
- BEQ SOLTARPUL0 * Mientras sea 0 es que sigue pulsado y lo retenemos en el bucle hasta que suelte
- RTS
- SOLTARPUL1
- MOVE.B PUL,D4
- BTST #1,D4
- BEQ SOLTARPUL1 * Mientras sea 0 es que sigue pulsado y lo retenemos en el bucle hasta que suelte
- RTS
- SIMHALT ; halt simulator
- ORG $2000
- TABLA DC.B $3F DIGITO 0 -> 0011_1111 Se encienden todos los segmentos menos el de en medio y el punto
- DC.B $06 DIGITO 1
- DC.B $5B DIGITO 2
- DC.B $4F DIGITO 3
- DC.B $66 DIGITO 4
- DC.B $6D DIGITO 5
- DC.B $7D DIGITO 6
- DC.B $07 DIGITO 7
- DC.B $7F DIGITO 8
- DC.B $6F DIGITO 9
- DC.B $00 DIGITO OFF
- DC.B $80 PUNTO
- TABLA_CON_PUNTO
- *%HGFEDCBA puede ser util para otros programas
- DC.B %10111111 DIGITO 0
- DC.B %10000110 DIGITO 1
- DC.B %11011011 DIGITO 2
- DC.B %11001111 DIGITO 3
- DC.B %11100110 DIGITO 4
- DC.B %11101101 DIGITO 5
- DC.B %11111101 DIGITO 6
- DC.B %10000111 DIGITO 7
- DC.B %11111111 DIGITO 8
- DC.B %11101111 DIGITO 9
- DC.B %10000000 DIGITO OFF
- DC.B %10000000 PUNTO
- END START ; last line of source
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement