;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; ;;;;;
;;;;; 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;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;