Hola Brunof, te comento que ya todo va perfecto
, de verdad que tu ayuda ha sido extremadamente útil, y que gracias a tus aportaciones y tu aclaraciones ya lo he podido terminar, además de aclararme las precauciones a tomar en cuenta al uso de los displays y el pic. Ahora paso a aclararte el tema de las declaraciones de los registros. Yo sé que existe esa directiva en la cual viene declarado todo y evito tener que hacerlo, lo que pasa que como estoy comenzando, y para evitar que no se me olvide que es cada cosa y dónde está situada procuro siempre declararlos. En cuanto a declarla de otra forma, de como esta declarada en ese archivo, como por ejemplo, PUERTAA en vez de PORTA, es porque procuro darle una traducción al español, ya que soy un acérrimo defensor del idioma que compartimos en este foro, como es el español, ya que es un idioma mucho más rico que el inglés, y sobre todo porque hablo español y no soy inglés. Ahora comprendo, que debemos usar unos términos que use todo el mundo y lo pueda comprender tanto un persona que hable español, ingles, ruso o alemán, así que tal vez empiece a utilizarlo como dices para cuando tenga dudas y pida información a algún compañero del foro. En cuanto al retraso que debía poner para evitar imágenes extrañas, lo he hecho, y todo va perfecto, pero he tenido que variar como me comentaste, ya que si lo ponía como decías, no me acuerdo ahora, la UNIDAD o DECENA, se encendía pero la otra no se veía. Entonces he tenido que poner dos retrasos, pero de tan sólo de 250 microsegundos, ya que sino cuando mostraba el número correcto, pero se encendía y apagaba intermitente el display.
COMIENZO
movf UNIDAD,W ;Pasamos el valor de registro UNIDAD al registro de trabajo.
call DISPLAY ;Llamamos a la subrutina para configurar el número en el display.
bcf PUERTAA,1 ;Nos aseguramos que el display 2 esté inactivo.
bsf PUERTAA,0 ;Y aquí nos aseguramos que alimentamos el display 1.
movwf PUERTAB ;Mostramos la UNIDAD en dicho display.
call RETRASO ;Se produce un retraso para evitar imágenes fantasmas.
movf DECENA,W ;Pasamos el valor de registro CENTENA al registro de trabajo.
call DISPLAY ;Llamamos a la subrutina para configurar el número en el 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 ;Mostramos la DECENA en dicho display.
call RETRASO ;Se produce un retraso para evitar imágenes fantasmas.
goto COMIENZO ;Volvemos al comienzo para seguir mostrando el display
Y ahora paso a mostrar el código de como queda definitivo, gracias a la yuda inestimable de
BrunoF del cual me ha ayudado muchisimo.
;Se especifica tipo de micro, este programa es un contador
;ascendente del cero al noventa y nueve, se podruce cada
;medio segundo aproximadamente.
LIST P=16F84A
;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
CONTADOR20 EQU 10
CONTADOR21 EQU 11
CONTADOR EQU 0D
UNIDAD EQU 0E ;Aquí se cargará el display 1
DECENA EQU 0F ;Aquí se cargara el display 2.
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' ;Habilitamos la interrupción por desbordamiento de TMR0.
movwf INTCON
INICIO movlw b'111' ;Cargamos la variable CONTADOR con el valor 7 para que se
movwf CONTADOR ;los incrementos cada medio segundo aproximadamente.
clrf UNIDAD ;Limpiamos el registro UNIDAD, lo ponemos a cero.
clrf DECENA ;Limpiamos el registro CENTENA, también lo ponemos a cero.
COMIENZO
movf UNIDAD,W ;Pasamos el valor de registro UNIDAD al registro de trabajo.
call DISPLAY ;Llamamos a la subrutina para configurar el número en el display.
bcf PUERTAA,1 ;Nos aseguramos que el display 2 esté inactivo.
bsf PUERTAA,0 ;Y aquí nos aseguramos que alimentamos el display 1.
movwf PUERTAB ;Mostramos la UNIDAD en dicho display.
call RETRASO ;Se produce un retraso para evitar imágenes fantasmas.
movf DECENA,W ;Pasamos el valor de registro CENTENA al registro de trabajo.
call DISPLAY ;Llamamos a la subrutina para configurar el número en el 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 ;Mostramos la DECENA en dicho display.
call RETRASO ;Se produce un retraso para evitar imágenes fantasmas.
goto COMIENZO ;Volvemos al comienzo para seguir mostrando el display
INTERRUPCION
decfsz CONTADOR ;Utilizando la variable CONTADOR se producirán incrementos
goto INTERRUPCION1 ;cada 7 veces de desbormdamiento del TMR0.
movlw b'111'
movwf CONTADOR
incf UNIDAD,F ;Incrementamos la variable UNIDAD.
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 INTERRUPCION1
bcf ESTADO,Z
clrf UNIDAD
incf DECENA ;Incrementamos la variable DECENA.
movf DECENA,W
xorlw b'1010' ;Si la decena pasa a 10 la volvemos a cero
btfss ESTADO,Z
goto INTERRUPCION1
bcf ESTADO,Z
clrf DECENA
INTERRUPCION1
bcf INTCON,T0IF
retfie ;Retornamos de la interrupción.
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.
RETRASO movlw b'11111111' ;Rutina de retraso de unos 250 microsegundos.
movwf CONTADOR20
RETRASO1
decfsz CONTADOR20
goto RETRASO1
return
END ;Finaliza el programa.
Gracias y saludos