Advertisement
chof_machine

Sesion3.Ejercicio7

Mar 22nd, 2021
2,400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *-----------------------------------------------------------
  2. * Title      : Sesión 3. LED's, pulsadores e interruptores.
  3. *           Ejercicio 7.
  4. * Written by : Sofía Andújar Muñoz
  5. * Date       : 11/03/2021
  6. * Description: Vamos a programar un reloj que cuente de segundos
  7. *       minutos y horas, vuelva a empezar y despues añadiremos un
  8. *       reset y un enable con los pulsadores.
  9. *-----------------------------------------------------------
  10.    ORG    $1000
  11.  
  12. SEG1     EQU  $E00000
  13. SEG2     EQU  $E00002
  14. SEG3     EQU  $E00004
  15. SEG4     EQU  $E00006
  16. SEG5     EQU  $E00008
  17. SEG6     EQU  $E0000A
  18. SEG7     EQU  $E0000C
  19. SEG8     EQU  $E0000E
  20. RETARDO  EQU  19   * Haremos este retardo 5 veces para cada cuenta.
  21.                   * En total es un delay de 0,95 segundos, para compensar el tiempo que tarda el programa en procesarse      
  22. PUL      EQU  $E00014    * Recordar activos a nivel bajo
  23. LEDS     EQU  $E00010
  24.    
  25. START:                  ; first instruction of program
  26.        CLR.B SEG1
  27.        CLR.B SEG2
  28.        CLR.B SEG3
  29.        CLR.B SEG4
  30.        CLR.B SEG5
  31.        CLR.B SEG6
  32.        CLR.B SEG7
  33.        CLR.B SEG8
  34.        CLR.B LEDS
  35.        
  36.        MOVE.L #TABLA,A1            * Guardamos en A1 la dirección de la tabla
  37.        MOVE.L #TABLA_CON_PUNTO, A2 * Y en A2 la tabla con punto. Aunque podríamos usar siempre la tabla normal
  38.                                    * y en caso de querer usar el punto hacer un BTST.B #8,SEG
  39.      
  40.  
  41.  
  42. INICIO  MOVE.L #$0,D1        
  43. COUNT   MOVE.L D1,-(A7)    * Hago esto fuera de las subrutinas ya que D1 es un "output" de DEC_SEX
  44.        JSR DEC_SEX        * Primero haremos una especie de conversión de nuestro número en decimal a tres números sexadecimales
  45.        JSR SHOW           * Mostramos el valor de la cuenta actual
  46.        MOVE.L (A7)+,D1
  47.        MOVE.L #0,D5
  48. BUCLE_PULSADORES        
  49.        JSR WAIT           * Hacemos el retardo
  50.        JSR PULSADORES
  51.        ADD.B #1,D5        * Comprobamos los pulsadores
  52.        CMP.B #5,D5        * Utilizamos el registro D5 para contar que hacemos el bucle 5 veces
  53.        BNE BUCLE_PULSADORES
  54.        
  55.        ADD.L #$1,D1       * Continuamos con el programa
  56.        CMP.L #$15180, D1  * Si D1 es menor que 60*60*24 -> repetimos
  57.        BCS COUNT
  58.        JMP INICIO
  59.        
  60.      
  61. DEC_SEX DIVU.W #60,D1   * En D1 se guarda resto [31-16] (segundos) y cociente [15-0] (minutos)
  62.        MOVE.W D1,D2    * Copiamos el cociente (minutos) en D2
  63.        MOVE.W #0,D1    * Borramos el cociente
  64.        SWAP.W D1       * Ponemos los segundos en los 16 bits menos significativos de D1
  65.        DIVU.W #60,D2   * En D2 se guarda resto [31-16] (minutos) y cociente [15-0] (horas)
  66.        MOVE.W D2,D3    * Copiamos el cociente en D3
  67.        MOVE.W #0,D2    * Borramos el cociente
  68.        SWAP.W D2       * Ponemos los min en los 16 bits menos significativos de D2
  69.        RTS
  70.        
  71. SHOW    MOVEM.L D1-D3,-(A7)
  72.        DIVU.W #10,D1
  73.        MOVE.B (A1,D1),SEG7
  74.        SWAP.W D1
  75.        MOVE.B (A2,D1),SEG8
  76.        DIVU.W #10,D2
  77.        MOVE.B (A1,D2),SEG5
  78.        SWAP.W D2
  79.        MOVE.B (A2,D2),SEG6
  80.        DIVU.W #10,D3
  81.        MOVE.B (A1,D3),SEG3
  82.        SWAP.W D3
  83.        MOVE.B 0(A2,D3),SEG4
  84.        MOVEM.L (A7)+,D1-D3
  85.        RTS
  86.        
  87. WAIT    MOVEM.L D0-D1,-(A7)
  88.        MOVE.L #RETARDO,D1
  89.        MOVE.L #23,D0
  90.        TRAP #15
  91.        MOVEM.L (A7)+,D0-D1
  92.        RTS        
  93.        
  94. PULSADORES
  95.        MOVE.B PUL, D4  * Cargo el estado de los pulsadores en D4
  96.        BTST.L #0,D4    * Sólo vamos a comprobar 2 pulsadores, el 0 y el 1.
  97.        BEQ PUL0        * Si el primer pulsador vale 0 hacemos un RESET
  98. SIG_PUL BTST.L #1,D4    * Compruebo el segundo Pulsador, el que hace de ENABLE
  99.        BEQ PUL1
  100. FIN_PUL RTS
  101.        
  102.        
  103. PUL0    BSET.B #0,LEDS   * Enciendo el LED correspondiente al pulsador para que se entienda mejor
  104.        JSR SOLTARPUL0   * Hasta que no suelte el pulsador, no voy a realizar la instrucción
  105.        BCLR.B #0,LEDS   * Apago el LED correspondiente, puesto que ya no estoy pulsando
  106.        JMP INICIO       * Voy directamente al incio del programa. En este paso hay que tener cuidado con el STACK          
  107.  
  108.  
  109. PUL1    BSET.B #1,LEDS   * Enciendo el LED correspondiente para que se entienda mejor
  110.        JSR SOLTARPUL1   * Hasta que no se suelte el pulsador, no ejecuto la instrucción
  111.        BCLR.B #1,LEDS
  112.        JSR PULSARPUL1   * Hasta que no se vuelva a pulsar no voy a hacer nada. Salvo comprobar si se pulsa el RST
  113.        BSET.B #1,LEDS
  114.        JSR SOLTARPUL1   * Cuando se vuelva a pulsar espero a que sea soltado para continuaR
  115.        BCLR.B #1,LEDS   * Apago el LED
  116.        JMP FIN_PUL
  117.        
  118. PULSARPUL1
  119.        MOVE.B PUL,D4
  120.        BTST.L #0,D4    * Compruebo si se pulsa el bit 0 (el reset)
  121.        BEQ PUL_ENA_RST * Si se pulsa voy a la subrutina correspondiente
  122. CONT1   BTST.L #1,D4    * Compruebo si se ha pulsado el enable de nuevo
  123.        BNE PULSARPUL1  * Si no se ha pulsado, vuelvo a comprobar todo.
  124.        RTS        
  125.  
  126. PUL_ENA_RST               * Esta subrutina cubrirá el caso de que se detenga la cuenta y se quiera poner a 0 mientras está parada.
  127.        BSET.B #0,LEDS    * Enciendo el LED correspondiente para que se entienda mejor
  128.        JSR SOLTARPUL0    * Hasta que no suelte el pulsador, no voy a realizar la instrucción
  129.        BCLR.B #0,LEDS    * Una vez soltado el pulsador, apago el LED
  130.        CLR.L D1          * Pongo la cuenta a 0
  131.        JSR DEC_SEX
  132.        JSR SHOW          * Y ejecuto un show, para actualizar los 7SEG.
  133.        JMP CONT1         * Aún debo esperar a que se pulse el PUL1 y para seguir contando
  134.        
  135. SOLTARPUL0
  136.        MOVE.B PUL,D4
  137.        BTST #0,D4
  138.        BEQ SOLTARPUL0  * Mientras sea 0 es que sigue pulsado y lo retenemos en el bucle hasta que suelte
  139.        RTS
  140. SOLTARPUL1
  141.        MOVE.B PUL,D4
  142.        BTST #1,D4
  143.        BEQ SOLTARPUL1  * Mientras sea 0 es que sigue pulsado y lo retenemos en el bucle hasta que suelte
  144.        RTS
  145.  
  146.  
  147.    SIMHALT             ; halt simulator
  148.  
  149.    ORG   $2000
  150. TABLA   DC.B $3F DIGITO 0 -> 0011_1111 Se encienden todos los segmentos menos el de en medio y el punto
  151.        DC.B $06 DIGITO 1
  152.        DC.B $5B DIGITO 2
  153.        DC.B $4F DIGITO 3
  154.        DC.B $66 DIGITO 4
  155.        DC.B $6D DIGITO 5
  156.        DC.B $7D DIGITO 6
  157.        DC.B $07 DIGITO 7
  158.        DC.B $7F DIGITO 8
  159.        DC.B $6F DIGITO 9
  160.        DC.B $00 DIGITO OFF
  161.        DC.B $80 PUNTO
  162. TABLA_CON_PUNTO
  163.            *%HGFEDCBA        puede ser util para otros programas
  164.        DC.B %10111111 DIGITO 0  
  165.        DC.B %10000110 DIGITO 1  
  166.        DC.B %11011011 DIGITO 2  
  167.        DC.B %11001111 DIGITO 3  
  168.        DC.B %11100110 DIGITO 4
  169.        DC.B %11101101 DIGITO 5
  170.        DC.B %11111101 DIGITO 6
  171.        DC.B %10000111 DIGITO 7
  172.        DC.B %11111111 DIGITO 8
  173.        DC.B %11101111 DIGITO 9  
  174.        DC.B %10000000 DIGITO OFF
  175.        DC.B %10000000 PUNTO      
  176.  
  177.    END    START        ; last line of source
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement