Codigo:
;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,
Buenas.
Se supone ue vas ha hacer un contador de objetos con barrera infraroja.
Con el pulso de entrada desbes incrementar un contador de uno en uno y, como este contador está en hexadecimal, transformar este número a dos números en BCD.
Aqui te paso una subrrutina que transforma el un código hexadecimal en otro BCD y de paso tambien te "regalo" la inversa de BCD a HEX:
Codigo:
;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,
;en dos bcd, el mas alto en los 4 MSBs y el mas bajo en los 4 LSBs del registro w
hex2bcd movwf contador1
clrf contador2
comf contador1,f
h2bcd1 movf contador1,w
addlw 0x0a
btfsc status,0
goto h2bcd2
movwf contador1
incf contador2,f
goto h2bcd1
h2bcd2 comf contador1,f
movf contador2,w ;Si contador2 no es cero
btfsc status,2
goto h2bcd4
h2bcd3 movf contador1,w
addlw 0x10 ;Se le suma a contador1 tantos 0x10 como indique
movwf contador1
decfsz contador2,f
goto h2bcd3
h2bcd4 movf contador1,w
return
;BCD2HEX: Transforma el código en BCD que viene en w a hexadecimal
;y lo devuelve en el registro w
bcd2hex movwf contador1
swapf contador1,w
andlw 0x0f
movwf contador2
btfsc status,2
goto bcd2h0
movf contador1,w
andlw 0x0f
movwf contador1
bcd2h1 movf contador1,w
addlw 0x0a
movwf contador1
decfsz contador2,f
goto bcd2h1
bcd2h0 movf contador1,w
return
Bueno como puedes comprobar, debes definir dos registros que se llamen "contador1 y contador2"
Creo que este ejemplo te puede servir:
Codigo:
; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador
; visualizado en BCD en la barra de diodos LED. Cuando llegue a 99 (b"1001 1001")
; resetea y comienza de nuevo la cuenta.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Contador ; El contador a visualizar.
ENDC
MAXIMO EQU .100 ; Máximo valor de la cuenta.
#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.
#DEFINE Display PORTB ; El display está conectado al Puerto B.
; ZONA DE CÓDIGOS *************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf Display ; Estas líneas configuradas como salidas.
bsf Pulsador ; Línea del pulsador configurada como entrada.
bcf STATUS,RP0 ; Acceso al Banco 0.
call InicializaContador ; Inicializa el Contador y lo visualiza.
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------
IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw MAXIMO ; llegado a su valor máximo mediante una
subwf Contador,W ; resta. (W)=(Contador)-MAXIMO.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<MAXIMO?
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
Visualiza
movf Contador,W
call BIN_a_BCD ; Lo pasa a BCD y
movwf Display ; visualiza.
return
INCLUDE <BIN_BCD.INC> ; Subrutina BIN_a_BCD.
INCLUDE <RETARDOS.INC> ; Subrutinas de retardo.
END ; Fin del programa.