List p=16F84A
#include [Link]
__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;VARIABLES
Unidad equ 0x0C ; se guarda 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 del display
MuestroU equ 2 ; control del display 1
MuestroD equ 1 ; control del display 2
MuestroC equ 0 ; control del display 3
;INICIO
org 0x00 ; inicia el microcontrolador
goto Inicio
;TABLA CONVERSION BCD A 7 SEGMENTOS
org 0x05 ; origen dell codigo de tabla
BCD7SEG
addwf PCL,1
DT 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0xFF, 0x6F
;CONFIGURACION DE PUERTO
Inicio
bsf STATUS,RP0 ; se pasa de banco 0 a banco 1
clrf TRISA ; puerto A como salida
clrf TRISB ; puerto B como salida
bcf STATUS,RP0 ; se pasa del banco 1 al banco 0
clrf PORTA ; se descativa todo los display
clrf Unidad; se comienza en 0
clrf Decena
clrf Centena
goto Actualizo_Display ; para multiplexear los display
; TESTEO DE PULSADOR
Bucle
incf Unidad,1 ; incremento de unidad
movlw d'10' ; al ser 10 se resetea e incrementa la unidad
subwf Unidad,0
btfss STATUS,Z
goto Actualizo_Display ; No es 10
clrf Unidad ; se reseta
incf Decena,1 ; incremento decena
movlw d'10' ; Si es decena reseta y incrementa centena
subwf Decena,0
btfss STATUS,Z
goto Actualizo_Display
clrf Decena
incf Centena,1
movlw d'10'
subwf Centena,0
btfss STATUS,Z
goto Actualizo_Display
clrf Centena
;MULTIPLEXEO DISPLAY
Actualizo_Display
movlw d'20'
movwf Contador
Refresco
movfw Unidad ; se obtiene codigo de 7 segmentos para unidad
call BCD7SEG
bcf PORTA,MuestroC ; Apaga display
movwf PORTB
bsf PORTA,MuestroU ; enciende display
call Demora_5ms
movfw Decena ; se obtiene codigo de 7 segmentos para decena
call BCD7SEG
bcf PORTA,MuestroU ; Apaga display
movwf PORTB
bsf PORTA,MuestroD ; enciende display
call Demora_5ms
movfw Centena ; se obtiene codigo de 7 segmentos para centena
call BCD7SEG
bcf PORTA,MuestroD ; Apaga display
movwf PORTB
bsf PORTA,MuestroC ; enciende display
call Demora_5ms
decfsz Contador,1 ; pregunta si ya realizo 10 veces el ciclo
goto Refresco ; no? se repite
goto Bucle ; si? actualiza cuanta
; DEMORA
Demora_5ms
movlw 0xFF
movwf Contador1 ; se incia contador 1
Repeticion1
movlw 0x05
movwf Contador2 ; se incia contador 2
Repeticion2
decfsz Contador2,1
goto Repeticion2
decfsz Contador1,1
goto Repeticion1
return
end ; finaliza