;	MONBRE ARCHIV0      : 40 BIN A BCD.asm
;	MODIFICADO          : 11/11/2002
;	ARCHIVO BASICO      : P16F874.inc
;	FUNCION             : CONVERSION 40 BITS A BCD

	list		p=16f874	; Definicion de Procesador
	#include <p16f874.inc>   	; Definicion de Registros del Procesador


; Definicion de Variables locales

 cblock 20
ibin
fm_outl
fm_outh
fm_outu
fm_outf
fm_outt
fm_in1l
fm_in1h
fm_in1u
fm_in1f	
fm_in1t
	
  endc

             org 00
             goto   start
bin_bcd
	movlw	.40
	movwf	ibin			      ; Inicializa contador de bits
        clrf	fm_outl     	; dato BCD = 0
        clrf 	fm_outh 
        clrf 	fm_outu
        clrf    fm_outf 
        clrf    fm_outt
        goto 	inc_bcd		; Ve a incrementar BCD
badj
        movlw 	0x33			; BCD = BCD+333333H
        addwf 	fm_outl,f
        addwf 	fm_outh,f
        addwf 	fm_outu,f
        addwf   fm_outf,f
        addwf   fm_outt,f
        movlw 	0x03
        btfss 	fm_outl,3		; BCD(0:3)>=8?
        subwf 	fm_outl,f		; else: BCD(LSB) = BCD(LSB)-3
        btfss 	fm_outh,3		; then: BCD(HSB)>=8?
        subwf 	fm_outh,f		;  else: BCD(HSB) = BCD(HSB)-3
        btfss 	fm_outu,3
	subwf 	fm_outu,f       	;  then: BCD(USB)>=8?
        btfss   fm_outf,3
        subwf   fm_outf,f      	; 	else: BCD(USB) = BCD(USB)-3
        btfss   fm_outt,3
        subwf   fm_outt,f
        movlw 	0x30			;	 then:
        btfss 	fm_outl,7		; BCD(4:7)>=8?
        subwf 	fm_outl,f		; else: BCD(LSB) = BCD(LSB)-30
        btfss 	fm_outh,7		; then:BCD(8:15)>=8?
        subwf 	fm_outh,f		;  else: BCD(HSB) = BCD(HSB)-30
        btfss 	fm_outu,7		;  then: BCD(20:23)>=8?
        subwf 	fm_outu,f
        btfss   fm_outf,7
        subwf   fm_outf,f		; 	else: BCD(USB) = BCD(USB)-30
        btfss   fm_outt,7
        subwf   fm_outt,f
inc_bcd					;	then:
        rlf 	fm_in1l,f		; ls bit de BCD = ms bit de bin
        rlf 	fm_in1h,f
	rlf	fm_in1u,f
        rlf     fm_in1f,f
        rlf 	fm_in1t,f
        rlf 	fm_outl,f
        rlf 	fm_outh,f
        rlf 	fm_outu,f
        rlf     fm_outf,f
        rlf 	fm_outt,f
        decfsz 	ibin,f		; contador = contador -1 = 0 ?
        goto 	badj			; else: repite el ciclo
	retlw	0				; then: fin

start    movlw   0
         movwf   fm_in1t
         movlw   05
         movwf   fm_in1f
         movlw   05b
         movwf   fm_in1u
         movlw   093
         movwf   fm_in1h
         movlw   0a2
         movwf   fm_in1l

;RESULTADO  89887650
         call    bin_bcd
dre       goto   dre
	END 					; Fin de Codigo

