;************************************ BCD_01.asm ****************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones
; de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el
; nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al
; puerto de salida se visualizarán las decenas y las unidades.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número 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 número 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 además
; incrementa (Centenas)
; 1 1 14 NO, resta 10 NO. Incrementa (Decenas)
; 1 2 4 SÍ, se acabó.
;
; El número a convertir será 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 ; Posición 0x0D de RAM.
Unidades ; Posición 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 acabó.
BCD_Incrementa Decenas
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, restándole 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 número a convertir.
BIN_BCD_Fin
swapf Decenas,W ; En el nibble alto de W también 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. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;**************************************TABLA_BCD******************************************************
; Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones
; de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el
; nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al
; puerto de salida se visualizarán las decenas y las unidades.
;
; El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el
; número 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 número 147 a BCD:
;
; (Centenas) (Decenas) (Unidades) ¿(Unidades)<10? ¿(Decenas)=10?
; ---------- --------- ---------- ---------------- -------------------------
; 0 0 147 No, Restamos 10 NO, Incrementa (Decenas).
; 0 1 137 No, Restamos 10 No, Incrementa (Decenas).
; 0 2 127 No, Restamos 10 No, Incrementa (Decenas).
; 0 3 117 No, Restamos 10 No, Incrementa (Decenas).
; 0 4 107 No, Restamos 10 No, Incrementa (Decenas).
; 0 5 97 No, Restamos 10 No, Incrementa (Decenas).
; 0 6 87 No, Restamos 10 No, Incrementa (Decenas).
; 0 7 77 No, Restamos 10 No, Incremetna (Decenas).
; 0 8 67 No, Restamos 10 NO, Incrementa (Decenas).
; 0 9 57 No, Restamos 10 No, Incrementa (Decenas).
; 1 0 47 No, restamos 10 Si, y ademas de eso incrementa
; Centenas.
; 1 1 37 No, Restamos 10 No, Incrementa (Decenas).
; 1 2 27 No, Restamos 10 No, Incrementa (Decenas).
; 1 3 17 No, Restamos 10 No, Incrementa (Decenas).
; 1 4 7 Si, aqui Se acabó. Se Incrementa (Decenas por ultima vez).
;
;*********************************************BCD_147*************************************************
LIST P=16F84A ;Procesador a utilizar.
INCLUDE <P16F84A.INC> ;Librerias del PIC16F84A.
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC ;Grabador seleccionado.
CBLOCK 0X0C ;Inicia en la posicion de memoria OX0C(12).
CENTENAS ;Posicion 13 de memoria de los GPR.
DECENAS ;Posicion 14 de memoria de los GPR.
UNIDADES ;Posicion 15 de memoria de los GPR.
ENDC ;Finaliza la instruccion CBLOCK.
NUMERO EQU d'147'
;*****************************************INICIO_DEL_PROGRAMA*****************************************
ORG 0
INCIO bsf STATUS,RP0 ;Ingreso al BANCO,1.
clrf TRISB ;PORTB configurado como salida.
bcf STATUS,RP0 ;Ingreso al BANCO,0.
PRINCIPAL clrf CENTENAS ;Centenas inicia en valor 0.
clrf DECENAS ;Decenas inicia en valor 0.
movlw NUMERO ;Mueve la constante NUMERO al registo W.
movwf UNIDADES ;Carga W en UNIDADES. Osea UNIDADES=147.
RESTA.UNIDADES movlw d'10' ;Carga el registro W con el valor en decimal 10.
subwf UNIDADES,W ;Realiza la resta UNIDADES-W.
btfss STATUS,C ;Si el resultado de la resta es positivo salta. C=1.
goto FINAL_SALIDA ;Se acabó C=0 UNIDADES<10.
INC.DECENAS movwf UNIDADES ;Recupera el resultado d la resta y lo guarda en UNIDADES.
movlw d'10' ;Carga el litera d'10' en W.
subwf DECENAS,W ;Resta DECENAS-W.
btfss STATUS,Z ;Z=1? DECENAS=10?.
btfsc STATUS,C ;C=0? resultado negativo? Salta.
goto INC.CENTENAS ;Z=1 resultado de la resta "0" => incrementa CENTENAS.
incf DECENAS,F ;C=0 resultado resta negativo => incrementa DECENAS.
goto RESTA.UNIDADES ;UNIDADES<10 y tambien DECENAS<10 => repite la resta.
INC.CENTENAS Incf CENTENAS,F ;Incrementa CENTENAS en 1na unidad.
clrf DECENAS ;Al incrementar CENTENAS, DECENAS vuelve a "0".
incf DECENAS,F ;DECENAS toma el valor de 1.
goto RESTA.UNIDADES ;Vuelte a restar hasta obtener UNIDADES<10.
FINAL_SALIDA swapf DECENAS,W ;0100 0000 ->SWAP DECENAS.
addwf UNIDADES,W ;Suma UNIDADES + DECENAS.
movwf PORTB ;El resultado se manda a la salida "PORTB".
END ;FIN del programa.