LIST P=16F84A ;Se especifica tipo de micro, este programa es un contador
;ascendente del cero al nueve.
#include <P16F84A.INC>
;Se definen los registros específicos SFR.
TMR0 EQU 01
OPT EQU 01
PCL EQU 02
ESTADO EQU 03
PUERTAA EQU 05
PUERTAB EQU 06
INTCON EQU 0B
;Se definen los bits de los registros específicos.
C EQU 00 ;Se define el bit 0 del registro 3 Estado.
W EQU 00 ;Se define el registro de trabajo.
F EQU 01 ;Se define F como
T0IF EQU 02 ;Se define el bit 2 del registro 2 INTCON
RP0 EQU 05 ;Se define el bit 5 del registro ESTADO.
Z EQU 02 ;Se define el bit 2 del registro ESTADO.
;Se definen los registros generales
CONTADOR EQU 0C
UNIDAD EQU 0D ;Aquí se cargará el display 1
DECENA EQU 0E ;Aquí se cargara el display 2.
W_TEMP EQU 0F
PCLATH_TEMP EQU 10
STATUS_TEMP EQU 11
ORG 0
goto CONFIGURACION
ORG 4
goto INTERRUPCION
ORG 5
;Configuramos los registros específicos.
CONFIGURACION
bsf ESTADO,RP0 ;Pasamos al banco1.
movlw b'11100'
movwf PUERTAA
movlw b'00000000'
movwf PUERTAB ;Se especifica la Puerta B como salida
movlw b'00000111' ;Se le asigna el temporizador al TMR0 con predivisor de 256.
movwf OPT
bcf ESTADO,RP0 ;Regresamos al banco 0.
movlw b'10100000' ;Activamos la interrupción por desbordamiento de TMR0.
movwf INTCON
INICIO
clrf UNIDAD ;Limpiamos el registro DIGITO, lo ponemos a cero.
clrf DECENA ;Limpiamos el registro DIGITO, también lo ponemos a cero.
COMIENZO
movf UNIDAD,W ;Pasamos el valor de registro DIGITO al registro de trabajo.
call DISPLAY ;Llamamos a la subrutina para configurar el número en el display.
bsf PUERTAA,0 ;Aquí nos aseguramos que alimentamos el display 1.
bcf PUERTAA,1 ;y nos aseguramos que el display 2 esté inactivo.
movwf PUERTAB ;Mostramos el número en dicho display.
movf DECENA,W
call DISPLAY
bcf PUERTAA,0 ;Nos aseguramos de que el display 1 esté inactivo.
bsf PUERTAA,1 ;Nos aseguramos que esté activo el display 2.
movwf PUERTAB
goto COMIENZO ;Volvemos al comienzo para seguir mostrando el display
INTERRUPCION
MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH, W
MOVWF PCLATH_TEMP
CLRF PCLATH
movlw 25
movwf CONTADOR
INTERRUPCION2
bcf INTCON,T0IF
clrf TMR0
INTERRUPCION3
btfss INTCON,T0IF
goto INTERRUPCION3
decfsz CONTADOR,F
goto INTERRUPCION2
bcf INTCON,T0IF
incf UNIDAD,F
movf UNIDAD,W
xorlw b'1010' ;Comprobamos si la unidad a pasado de 9 a 10.
btfss ESTADO,Z ;sino es así volvemos al COMIENZO.
goto volver
clrf UNIDAD
incf DECENA,F
movf DECENA,W
xorlw b'1010' ;Si la decena pasa a 10 la volvemos a cero
btfss ESTADO,Z
goto volver
clrf DECENA
volver
MOVF PCLATH_TEMP, W
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
DISPLAY
addwf PCL,F ;Se le suma los datos del registro W, proveniente de la puerta A
;y se vuelve a guardar en el mismo registro PCL.
retlw 3F ;Se define el cero para ser mostrado en el display.
retlw 06 ;Se define el uno.
retlw 5B ;Se define el dos.
retlw 4F ;Se define el tres.
retlw 66 ;Se define el cuatro.
retlw 6D ;Se define el cinco.
retlw 7D ;Se define el seis.
retlw 07 ;Se define el siete.
retlw 7F ;Se define el ocho.
retlw 6F ;Se define el nueve.
END ;Finaliza el programa.