Está en la página 1de 2

; Cabecera

list p=16f84a
include <p16f84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
errorlevel -302
;**** Definici�n de variables ****
Unidad equ 0x0C ; Guardamos conteo de 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 1er Display
MuestroD equ 1 ; Para control del 2� Display
MuestroC equ 0 ; Para control del 3er Display

;**** Inicio del Micro ****


Reset
org 0x00 ; Aqu� comienza el micro
goto Inicio ; Salto al inicio de mi programa

;**** Tabla de conversi�n BCD a 7 segmentos ****


; Se coloca al inicio para asegurar ubicaci�n en pagina
org 0x05 ; Origen del c�digo de tabla
BCD7SEG ; retlw b'gfedcba' para displays de
c�todo com�n
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
movlw 0xF8
movwf TRISA ; PORTA,2,1,0 como salidas
movlw 0x80
movwf TRISB ; PORTB,6,5,4,3,2,1,0 como salidas
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
;**** Aqu� se multiplexan los displays ****
Actualizo_Display
movlw d'20' ; Cargo Contador = 20
movwf Contador ; Para repeticiones de visualizacion del mismo valor
durante 150 ms.
Refresco
movfw Unidad ; Obtengo el c�digo de 7 segmentos para Unidad
call BCD7SEG
bcf PORTA,MuestroC ; Apago el 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 el c�digo de 7 segmentos para Decena
call BCD7SEG
bcf PORTA,MuestroU ; Apago el display de Unidad
movwf PORTB ; Cargo PORTB con Decena
bsf PORTA,MuestroD ; Enciendo el display de Decena
call Demora_5ms
movfw Centena ; Obtengo el c�digo de 7 segmentos para Centena

call BCD7SEG
bcf PORTA,MuestroD ; Apago el display de Decena
movwf PORTB ; Cargo PORTB con Centena
bsf PORTA,MuestroC ; Enciendo el display de 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

También podría gustarte