;************************************ BCD_01.asm ****************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. Lopez. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Un numero binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones
; de memorias llamadas Centenas, Decenas y Unidades. Ademas al final las unidades estaran en el
; nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al
; puerto de salida se visualizaran las decenas y las unidades.
;
; El maximo numero a convertir sera el 255 que es el maximo valor que puede adquirir el
; numero binario de entrada de 8 bits.
;
; El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente
; ejemplo que trata de la conversión del numero 124 a BCD:
;
; (Centenas) (Decenas) (Unidades) (Unidades)<10? (Decenas)=10?
; ---------- --------- ---------- -------------- -------------------------
;
; 0 0 124 NO, resta 10 Incrementa (Decenas).
; 0 1 114 NO, resta 10 NO. Incrementa (Decenas).
; 0 2 104 NO, resta 10 NO. Incrementa (Decenas).
; 0 3 94 NO, resta 10 NO. Incrementa (Decenas).
; 0 4 84 NO, resta 10 NO. Incrementa (Decenas).
; 0 5 74 NO, resta 10 NO. Incrementa (Decenas).
; 0 6 64 NO, resta 10 NO. Incrementa (Decenas).
; 0 7 54 NO, resta 10 NO. Incrementa (Decenas).
; 0 8 44 NO, resta 10 NO. Incrementa (Decenas).
; 0 9 34 NO, resta 10 NO. Incrementa (Decenas).
; 1 0 24 NO, resta 10 Sí. (Decenas)=0, y ademas
; incrementa (Centenas)
; 1 1 14 NO, resta 10 NO. Incrementa (Decenas)
; 1 2 4 Si, se acabo.
;
; El numero a convertir sera la constante NUMERO.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C ; La zona de memoria de usuario comienza en esta
Centenas ; dirección de memoria RAM de datos.
Decenas ; Posicion 0x0D de RAM.
Unidades ; Posicion 0x0E de RAM.
ENDC
NUMERO EQU .124 ; Por ejemplo.
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
clrf Centenas ; Carga los registros con el resultado inicial.
clrf Decenas ; En principio (Centenas)=0 y (Decenas)=0.
movlw NUMERO
movwf Unidades ; Se carga el número binario a convertir.
BCD_Resta10
movlw .10 ; A las unidades se les va restando 10 en cada
subwf Unidades,W ; pasada. (W)=(Unidades)-10.
btfss STATUS,C ; (C)=1?, (W) positivo?, (Unidades)>=10?.
goto BIN_BCD_Fin ; No, es menor de 10. Se acabo.
BCD_IncrementaDecenas
movwf Unidades ; Recupera lo que queda por restar.
incf Decenas,F ; Incrementa las decenas y comprueba si llega a
movlw .10 ; 10. Lo hace mediante una resta.
subwf Decenas,W ; (W)= (Decenas)-10.
btfss STATUS,C ; (C)=1?, (W) positivo?, (Decenas)>=10?.
goto BCD_Resta10 ; No. Vuelve a dar otra pasada, restandole 10.
BCD_IncrementaCentenas
clrf Decenas ; Pone a cero las decenas
incf Centenas,F ; e incrementa las centenas.
goto BCD_Resta10 ; Otra pasada, resta 10 al numero a convertir.
BIN_BCD_Fin
swapf Decenas,W ; En el nibble alto de W tambien las decenas.
addwf Unidades,W ; Las unidades están en el nibble bajo de W.
movwf PORTB ; Se visualiza por el puerto de salida.
sleep ; Queda permanentemente en reposo.
END ; Fin del programa.
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. Lopez. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================