You are on page 1of 3

list p=16F84A

#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;**** Definicion de variables ****
Unidad equ 0x0C ; Guardamos conteo unidad
Decena equ 0x0D ;
Centena equ 0x0E ;
Contador1 equ 0x0F ; Registro utilizado en demora.-
Contador2 equ 0x10 ; Registro utilizado en demora.-
Contador equ 0x11 ; Control de Refresco de Display.-

MuestroU equ 2 ; Para control del 1 Display
MuestroD equ 1 ; Para control del 2 Display
MuestroC equ 0 ; Para control del 3 Display

;**** Inicio del Micro ****
Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-


;**** Tabla de conversion BCD a 7 Segmentos ****
; Se coloca al inicio para asegurar ubicacion en Pagina.-
org 0x05 ; Origen del cdigo de tabla.-
BCD7SEG ; retlw b'gfedcba' para display catodo comun
addwf PCL,1 ; Se incrementa el contador del programa.-
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F

;**** Programa principal ****
;**** Configuracion de puertos ****
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
clrf TRISA ; PORTA como salida
clrf TRISB ; PORTB como salida.-
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
clrf PORTA ; Desactivo todos los Displays
clrf Unidad ; Comienza en cero --> 0 0 0.-
clrf Decena
clrf Centena
goto Actualizo_Display ; Esta rutina multiplexa los displays.-
;**** Testeo de Pulsador ****
Bucle
incf Unidad,1 ; Incremeto Unidad.
movlw d'10' ; Si es 10 reseteo e incremento Decena
subwf Unidad,0 ;
btfss STATUS,Z ;
goto Actualizo_Display ; no es 10
clrf Unidad ; Si, reseteo.-
incf Decena,1 ; Incremento Decena.-
movlw d'10' ; Si Decena = 10, reseteo e incremento Centena
subwf Decena,0 ;
btfss STATUS,Z ;
goto Actualizo_Display ; No es 10.-
clrf Decena ; Si, reseteo.-
incf Centena,1 ; Incremento Centena.-
movlw d'10' ; Si es 10 Reseteo.-
subwf Centena,0
btfss STATUS,Z
goto Actualizo_Display ; No es 10.-
clrf Centena ; Si, reseto
;**** Se multiplexan los Display ****
Actualizo_Display
movlw d'20' ; Cargo Contador = 20
movwf Contador ; Para repeticiones de visualizacion del mismo valor
; durante 150 ms.-
Refresco
movfw Unidad ; Obtengo codigo de 7 Segmentos para Unidad.-
call BCD7SEG ;
bcf PORTA,MuestroC ; Apago Display de Centena, Se entiende al mirar rutina.-
movwf PORTB ; Cargo unidad en PORTB.-
bsf PORTA,MuestroU ; Enciendo Display de Unidad.-
call Demora_5ms
movfw Decena ; Obtengo codigo 7 Segmentos para Decena.-
call BCD7SEG
bcf PORTA,MuestroU ; Apago Display de Unidad.-
movwf PORTB ; Cargo PORTB con Decena.-
bsf PORTA,MuestroD ; Enciendo Display de Decena.-
call Demora_5ms
movfw Centena ; Obtengo codigo de 7 Segmentos para Centena.-
call BCD7SEG
bcf PORTA,MuestroD ; Apago Display de Decena.-
movwf PORTB ; Cargo PORTB con Centena.-
bsf PORTA,MuestroC ; Enciendo Display Centena.-
call Demora_5ms
decfsz Contador,1 ; Pregunto si ya se ha repetido 10 veces el ciclo?
goto Refresco ; No, repito.-
goto Bucle ; Si, actualizo cuenta.-
;**** Demora ****
Demora_5ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x05 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-

end