;******************************************************************************
;                           
;               A             YYYY      YYYY           RRRRRRRRR
;              AAA             YYY      YYY            RR      RR
;             AAAAA             YYY    YYY             RR      RR
;            AAAAAAA             YYY  YYY              RR    RRR
;           AAAAAAAAA             YYYYYY               RRRRRRR
;          AAA     AAA             YYYY                RR    RRR
;         AAAAA   AAAAA            YYYY                RR     RR   
;        AAAAA     AAAAA           YYYY                RR      RR
;        ********************************************************
;
;                              DADO ELECTRONICO
;SIMULA EL EFECTO DE UN DADO DE SEIS CARAS , CON UN ZUMBADOR Y DIODO LED.
;TIENE LA POSIBILIDAD DE ANULAR EL ZUMBADOR.
;AL CONECTAR EL DADO, ESTA EN ESPERA, CON UNA PULSACION CORTA EL ZUMBADOR
;FUNCIONARA, Y EL DISPLAY INDICARA UN 1,  SE APAGARA Y EMPEZARA A RODAR.
;CON UNA PULSACION DE MAS DE 1 SEGUNDO EL ZUMBADOR DEJARA DE FUNCIONAR, 
;Y EL DISPLAY INDICARA UN 0, SE APAGARA Y EMPEZARA A RODAR.
;DESPUES DE LA PULSACION DE PARO, PARPADEARA 3 VECES Y CONTINUARA RODANDO.
;******************************************************************************


;DIRECTIVAS DEL PROGRAMA
                           
             LIST          p=16F84A
             RADIX         HEX   


;ETIQUETAS DEL PROGRAMA 
             W             EQU       0x00                        
             F             EQU       0x01
             TMRO_OPT      EQU       0x01
             PC            EQU       0x02
             Z             EQU       0X02
             ESTADO        EQU       0x03
             PUERTAA       EQU       0x05
             PUERTAB       EQU       0x06
             INTCON        EQU       0x0B 
             NUMERO        EQU       0x10  ;REGISTRO AUXILIAR 
             VER           EQU       0x11  ;REGISTRO AUXILIAR
             ACTIVAR       EQU       0x13  ;REGISTRO AUXILIAR

;PROGRAMA PRINCIPAL

                                        
             ORG           0               ;COMENZAREMOS EN LA DIRECCION 0                                   
             goto          INICIO          ;SALTAREMOS A LA DIRECCION 5 
                                           ;PARA SOBREPASAR EL VECTOR 
             ORG           5               ;DE INTERRUPCION.

INICIO       bsf           ESTADO, 5       ;NOS SITUAMOS EN EL BANCO 1.
             movlw         b'00000111'     ;CARGA EL VALOR MAXIMO EN EL
             movwf         TMRO_OPT        ;PREDIVISOR TMR0 ( 256 ).             
                       
             movlw         b'00000001'     ;CARGO RA0 COMO ENTRADA.
             movwf         PUERTAA
             clrf          PUERTAB         ;PUERTAB ACTUA COMO SALIDA.
             bcf           ESTADO, 5       ;NOS SITUAMOS EN EL BANCO 0.

             clrf          PUERTAA         ;BORRAMOS PUERTAA.
             clrf          PUERTAB         ;BORRAMOS PUERTAB.
             


;******************* RUTINA DE ACTIVACION DEL ZUMBADOR ************************

ACTIVA       btfss         PUERTAA,0       ;ESPERA A QUE EL PULSADOR 
             goto          ACTIVA          ;SEA ACTIVADO.  

             movlw         0x01            ;DETECTA LA PULSACION Y PONE UN 1
             call          DIS7SEG         ;EN EL DISPLAY Y EL ZUMBADOR 
             movwf         PUERTAB         ;FUNCIONARA.

             bsf           PUERTAA, 1      ;PONE A 1 LA SALIDA RA1, DEL ZUMBADOR 
             bsf           PUERTAA, 2      ;PONE A 1 LA SALIDA RA2, DEL LED
             call          ZUMBADOR        ;LLAMA A LA RUTINA, PIERDE 0'1 SEG.
             bcf           PUERTAA, 1      ;TERMINA DE SONAR EL ZUMBADOR.
             bcf           PUERTAA, 2      ;SE APAGA EL LED.

             call          DISPLAY         ;RUTINA QUE PIERDE 0'5 SEGUNDO
             clrf          PUERTAB         ;BORRA EL DISPLAY
             
          
;******************** RUTINA DE DESACTIVACION DEL ZUMBADOR ********************

             btfss         PUERTAA,0       ;COMPRUEBA SI EL PULSADOR SIGUE
                                           ;APRETADO.
             goto          DA_DO           ;SI NO ESTA PULSADO VA A DA_DO.
             
             movlw         0x00            ;PONE UN 0 EN W
             call          DIS7SEG         ;LLAMA A LA RUTINA QUE TRANSFORMA
                                           ;EL NUMERO PARA SER VISUALIZADO ,
             movwf         PUERTAB         ;ES VISUALIZADO EN LA PUERTAB Y POR 
                                           ;TANTO EN EL DISPLAY.
             call          DISPLAY         ;PERDIDA DE TIEMPO 0'5 SEGUNDO.
             clrf          PUERTAB         ;BORRA EL DISPLAY.
             call          DISPLAY
             bsf           ACTIVAR, 1      ;PONE UN 1 EN EL BITE DEL REGISTRO. 
             goto          DADO            ;VA A DADO.

;******************** RUTINA  PARA VISUALIZAR EL NUMERO ***********************         
                                 
DA_DO        call           DISPLAY        ;RUTINA QUE PIERDE 0'5 SEGUNDO.
DADO         movlw          0x01           ;EMPEZAMOS CON EL NUMERO 1.
             movwf          NUMERO         ;DEPOSITA EL 1 EN EL REGISTRO NUMERO.
OTRA_VEZ     call           ESCOGE         ;LLAMA A LA RUTINA QUE ESCOGE NUMERO.
             call           DIS7SEG        ;LLAMA A LA RUTINA QUE TRANSFORMA
             movwf          PUERTAB        ;Y VISUALIZA EL NUMERO EN EL DISPLAY.
             goto           OTRA_VEZ       ;VA A,  OTRA VEZ.

;******************* RUTINA PARA ESCOGER UN NUMERO ****************************

ESCOGE       btfsc          PUERTAA, 0     ;ESPERA A QUE SEA ACTIVADO EL 
             goto           VOLVER         ;PULSADOR.
SEGUIR       movlw          b'00000110'    ;AQUI COMPARA EL NUMERO , CON EL 6
             subwf          NUMERO, W      ;SI ES UN 6 EMPEZARA A CONTAR DE
             btfsc          ESTADO, Z      ;NUEVO.

             clrf           NUMERO         ;BORRA EL REGISTRO NUMERO.
             incf           NUMERO, F      ;INCREMENTA EL REGISTRO NUMERO Y LO
             movfw          NUMERO         ;DEPOSITA EN EL PROPIO REGISTRO.
             call           DIS7SEG        ;LLAMADA PARA QUE EL NUMERO SE
             movwf          PUERTAB        ;VEA EN EL DISPLAY.
             call           TIEMPO         ;PIERDE 0'05 SEGUNDO.
             goto           ESCOGE         ;VA A ESCOGE.

;******************* RUTINA DE PARPADEO DEL DISPLAY ***************************

VOLVER       btfss          ACTIVAR, 1     ;TESTEA EL REGISTRO Y SI VALE 1
             bsf            PUERTAA, 1     ;SALTARA Y EL ZUMBADOR NO SUENA. 
             bsf            PUERTAA, 2     ;ENCIENDE EL LED AL PRESIONAR.
                                           
             call           ZUMBADOR       ;PERDIDA DE TIEMPO DE 0'1 SEG.
             btfss          ACTIVAR, 1     ;SALTA SI EL BITE VALE 1.
             bcf            PUERTAA, 1     ;APAGA EL ZUMBADOR.
             bcf            PUERTAA, 2     ;APAGA EL LED.

             movfw          NUMERO         ;W SE CARGA CON EL ULTIMO NUMERO.
             call           DIS7SEG        ;RUTINA PARA VISUALIZAR EL NUNERO
             movwf          PUERTAB        ;EN EL DISPLAY.
             call           DISPLAY        ;PERDIDA DE TIEMPO DE 0'5 SEGUNDO.
             clrf           PUERTAB        ;BORRA EL DISPLAY.
             call           DISPLAY        ;PERDIDA DE TIEMPO DE 0'5 SEGUNDO.

             movfw          NUMERO         ;SE REPITE OTRA VEZ LO MISMO.
             call           DIS7SEG
             movwf          PUERTAB 
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY

             movfw          NUMERO
             call           DIS7SEG
             movwf          PUERTAB
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY

             movfw          NUMERO
             call           DIS7SEG
             movwf          PUERTAB
             call           DISPLAY
             clrf           PUERTAB
             call           DISPLAY
             
             goto           SEGUIR         ;VA A SEGUIR
    
;******************** RUTINA PARA PERDER TIEMPO ********************************

TIEMPO1      bcf            INTCON,2       ;BORRA EL TESTIGO DE DESBORDAMIENTO
             movlw          0xD9           ;CARGO EL NUMERO 217 EN TMRO, CON LO 
                                           ;CUAL CONTARA 39 VECES, (256-217=39).

             movwf          TMRO_OPT       
TIEMPO2      btfss          INTCON, 2      ;MIRA EL TESTIGO DE DESBORDAMIENTO
             goto           TIEMPO2        ;Y SALTARA CUANDO TERMINE DE CONTAR.
            
             decfsz         VER,F          ;RESTA EL REGISTRO VER Y LO DEPOSITA
             goto           TIEMPO1        ;EN EL MISMO, HASTA VALER 0.
         
             return

;******************* RUTINA DE 0'1 SEGUNDO *************************************

ZUMBADOR     movlw          0x0A           ;CARGO EL NUMERO 10 EN W.
             goto           MAS            ;VA A MAS.

;******************* RUTINA DE 0'5 SEGUNDO *************************************
DISPLAY      movlw          032            ;CARGO EL NUMERO 50 EN W.
             goto           MAS            ;VA A MAS.

;******************* RUTINA DE 0'05 SEGUNDO ************************************

TIEMPO       movlw          0x05           ;CARGO EL NUMERO 5 EN W.
MAS          movwf          VER            ;SE DEPOSITA EN EL REGISTRO VER.
             call           TIEMPO1        ;VA A TIEMPO1.

             return
;****************** RUTINA DE VISUALIZACION ************************************

DIS7SEG     addwf           PC,F           ;COGE EL VALOR HEX Y LO CONVIERTE.
                                           ;EN EL NUMERO PARA QUE SE VEA EN
            retlw           3F             ;DISPLAY.
            retlw           06
            retlw           5B
            retlw           4F
            retlw           66
            retlw           6D
            retlw           7D



            END           


                                          

