-   
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;;;;                                            ;;;;; 
- ;;;;;                    FRECUENCÍMETRO                  ;;;;; 
- ;;;;;                       POR                    ;;;;; 
- ;;;;;                JAIME FERNÁNDEZ-CARO BELMONTE              ;;;;; 
- ;;;;;                                            ;;;;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;;;;;;;;                                        ;;;;;;;;; 
- ;;;;;;;;;  Realizado con MPLAB IDE 6.32                        ;;;;;;;;; 
- ;;;;;;;;;  Simulado con Proteus Pro 6.2 SP5                      ;;;;;;;;; 
- ;;;;;;;;;  Montaje en MicroPicTrainer 1.1                        ;;;;;;;;; 
- ;;;;;;;;;                                        ;;;;;;;;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
-   
-         LIST P=16F84    ;Tipo de PIC usado 
-   
-     ORG    00      ;Directiva inicio de programa en la posición 00 
-   
- INICIO  BSF     0x03,5    ;Ponemos a '1' el bit 5(6ª posición) del registro de Estado 
-         CLRF    0x06    ;Ahora estamos en el banco 1, ponemos a '0'(Salida) TrisB 
-         MOVLW   0xFF    ;Copiamos el literal 'FF'H a W, todo 1 (Entrada) 
-         MOVWF   0x05    ;Copiamos de W al registro TrisA, quedando como entrada 
-     MOVLW   B'11101000'  ;Copiamos el literal de configuración del registro Option a W 
-     MOVWF   0x01    ;Copiamos el contenido de W a Option 
-         BCF     0x03,5    ;Ponemos a '0' el bit 5 del registro de Estado,estamos en el Banco 0 
-     CLRF  0x06    ;Borramos el contenido del registro PortB 
-     CLRF  0x01    ;Borramos el contenido del registro TMR0 
-   
- ;Retrasamos acontinuación la ejecución 
- ;del programa durante 1 segundo 
-   
-     MOVLW  D'40'    ;Copiamos el literal (decimal) a W 
-         MOVWF   0x0C    ;Copiamos el contenido de W a la 1ª posición de memoria libre 
- LOOP1  MOVLW  D'80'    ;Copiamos el literal (decimal) a W 
-         MOVWF   0x0D    ;Copiamos el contenido de W a la 2ª posición de memoria libre 
- LOOP2  MOVLW  D'103'    ;Copiamos el literal (decimal) a W 
-         MOVWF   0x0E    ;Copiamos el contenido de W a la 3ª posición de memoria libre 
- LOOP3  DECFSZ  0x0E,1    ;Decrementamos 0x0E,y se almacena en 0x0E,si es 0 brincamos 
-         GOTO    LOOP3    ;Como no es 0,hacemos un salto incondicional a LOOP3 
-         DECFSZ  0x0D,1    ;Decrementamos 0x0D,y se almacena en 0x0D,si es 0 brincamos 
-         GOTO    LOOP2    ;Como no es 0,hacemos un salto incondicional a LOOP2 
-         DECFSZ  0x0C,1    ;Decrementamos 0x0C,y se almacena en 0x0C,si es 0 brincamos 
-         GOTO    LOOP1    ;Como no es 0,hacemos un salto incondicional a LOOP1 
-   
- ;Movemos el valor del registro TMR0 a una variable 
- ;para poder operar con él 
-   
-     MOVF    0x01,0    ;Copiamos el contenido del registro TMR0 en W 
-         MOVWF   0x0C    ;Movemos el valor de W a la posicion 0x0C 
-   
- ;Descomposición de un número en centenas,decenas y unidades 
- ;Explicación del algoritmo en la memoria de la practica 
-   
- CENTEN  MOVLW  D'100'    ;Movemos el literal (decimal) a W 
-     SUBWF  0x0C,0    ;Restamos W a 0x0C y guardamos el resultado en W 
-     BTFSS  0x03,0    ;Miramos el bit 0 del registro de Estado, si es 1 brincamos 
-     GOTO  DECEN    ;Salto incondicional a DECEN, ya que hay acarreo  
-     MOVWF  0x0C    ;Guardamos el resto para seguir restando 
-     INCF  0x0E,1    ;Incrementamos la variable 0x0E,y guardamos el resultado en ella 
-     GOTO  CENTEN    ;Salto incondicional a CENTEN 
-   
- DECEN  MOVLW  D'10'    ;Movemos el literal (decimal) a W 
-     SUBWF  0x0C,0    ;Restamos W a 0x0C y guardamos el resultado en W 
-     BTFSS  0x03,0    ;Miramos el bit 0 del registro de Estado, si es 1 brincamos 
-     GOTO  WAIT    ;Salto incondicional a WAIT, ya que hay acarreo 
-     MOVWF  0x0C    ;Guardamos el resto para seguir restando 
-     INCF  0x0D,1    ;Incrementamos la variable 0x0D,y guardamos el resultado en ella 
-     GOTO  DECEN    ;Salto incondicional a DECEN 
-   
- ;Esperamos a que se active cualquiera 
- ;de los pulsadores 
-   
- WAIT  BTFSC  0x05,0    ;Miramos el bit 0 del registro PortA, y si (RA0) es 0 brinca 
-     CALL  MUE_CEN    ;Llamada a Subrutina MUE_CEN ya que RA0 es 1 
-     BTFSC  0x05,1    ;Miramos el bit 1 del registro PortA, y si (RA1) es 0 brinca 
-     CALL  MUE_DEC    ;Llamada a Subrutina MUE_DEC ya que RA1 es 1 
-     BTFSC  0x05,2    ;Miramos el bit 2 del registro PortA, y si (RA2) es 0 brinca 
-     CALL  MUE_UNI    ;Llamada a Subrutina MUE_UNI ya que RA2 es 1 
-     BTFSC  0x05,3    ;Miramos el bit 3 del registro PortA, y si (RA3) es 0 brinca 
-     GOTO  INICIO    ;Salto incondicional a INICIO ya que RA3 es 1 
-     GOTO  WAIT    ;Salto incondicional a WAIT ya que RA3 es 0 
-      
- ;Rutina encargada de mostrar en el display 
- ;centenas,decenas ó unidades 
-   
- MUE_CEN  MOVF  0x0E,0    ;Copio el valor de la posicion de memoria 0x0E en W 
-     CALL  MUESTRA    ;Llamo a la subrutina MUESTRA 
-     RETURN        ;Retorno a WAIT desde esta subrutina 
-   
- MUE_DEC  MOVF  0x0D,0    ;Copio el valor de la posicion de memoria 0x0D en W 
-     CALL  MUESTRA    ;Llamo a la subrutina MUESTRA 
-     RETURN        ;Retorno a WAIT desde esta subrutina 
-   
- MUE_UNI  MOVF  0x0C,0    ;Copio el valor de la posicion de memoria 0x0C en W 
-     CALL  MUESTRA    ;Llamo a la subrutina MUESTRA 
-     RETURN        ;Retorno a WAIT desde esta subrutina 
-   
- MUESTRA CALL  N_7SEG    ;Llamo a la subrutina N_7SEG 
-     MOVWF  0x06    ;Copio el contenido de W en PortB 
-     RETURN        ;Retorno desde subrutina 
-   
- ;Rutina encargada de dar 
- ;el equivalente en 7 segmentos de un numero 
-   
- N_7SEG  ADDWF  0x02,1    ;Sumo el valor de W con el del PCL,y lo almaceno en PCL 
-     RETLW  B'00111111'  ;Retorno desde subrutina y W=Valor del 0 en 7 segmentos 
-     RETLW  B'00000110'  ;Retorno desde subrutina y W=Valor del 1 en 7 segmentos 
-     RETLW  B'01011011'  ;Retorno desde subrutina y W=Valor del 2 en 7 segmentos 
-     RETLW  B'01001111'  ;Retorno desde subrutina y W=Valor del 3 en 7 segmentos 
-     RETLW  B'01100110'  ;Retorno desde subrutina y W=Valor del 4 en 7 segmentos 
-     RETLW  B'01101101'  ;Retorno desde subrutina y W=Valor del 5 en 7 segmentos 
-     RETLW  B'01111101'  ;Retorno desde subrutina y W=Valor del 6 en 7 segmentos 
-     RETLW  B'00000111'  ;Retorno desde subrutina y W=Valor del 7 en 7 segmentos 
-     RETLW  B'01111111'  ;Retorno desde subrutina y W=Valor del 8 en 7 segmentos 
-     RETLW  B'01100111'  ;Retorno desde subrutina y W=Valor del 9 en 7 segmentos 
-   
-         END          ;Directiva fin de programa 
-   
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
- ;;            ;; 
- ;;  Total: 68 Instrucciones;; 
- ;;            ;; 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
-   
-