Autor Tema: conversion de bcd a binario  (Leído 3279 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alexanmar

  • PIC10
  • *
  • Mensajes: 3
conversion de bcd a binario
« en: 29 de Julio de 2005, 14:15:00 »
necesito hacer un programa en mplab que me convierta cinco digitos decimales representados en bcd a binario

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: conversion de bcd a binario
« Respuesta #1 en: 09 de Agosto de 2005, 03:54:00 »
Aqui tienes una rutina que transforma 8 dígitos en BCD a un binario de 32 bits. Se puede modificar fácilmente para tu caso:

Codigo:
;*********************************************************************
;DEC2BIN:    Tranforma el código bcd de 8 digitos en uno binario
;      de 32 bits y lo guarda en los registros dividendox
;USO DE MEMORIA:   temp0 --> contador de bits
;         temp1 --> contador de dígitos
;         disp0 --> Dígito LSB en BCD
;         -----
;
;         disp7 --> Dígito MSB en BCD
;         dividenco6 --> Byte LSB en Binario
;         -----
;
;         dividenco3 --> Byte MSB en Binario (32 bits)
;*********************************************************************

dec2bin   movlw   d"32"
   movwf   temp0      ;Contador de bits
d2bbck1   movlw   disp0-1      ;Puntero al digito msb
   movwf   fsr
   movlw   0x08
   movwf   temp1      ;Contador de dígitos
   movlw   d"10"
   bcf   status,c   ;Borra el carry
d2bbck2   incf   fsr,f
   btfsc   status,0
   addwf   indf,f      ;Add 10 if "1" bit from prev digit
   rrf   indf,f      ;Shift out LSB of digit
   decfsz   temp1,f      ;Siguiente dígito
   goto   d2bbck2
   rrf   dividendo3,f   ;Shift in carry from digits
   rrf   dividendo4,f
   rrf   dividendo5,f
   rrf   dividendo6,f
   decfsz   temp0,f      ;Siguiente bit
   goto   d2bbck1
   return

Desconectado alexanmar

  • PIC10
  • *
  • Mensajes: 3
RE: conversion de bcd a binario
« Respuesta #2 en: 10 de Agosto de 2005, 14:00:00 »
muchisimas gracias Antonio por el programa, lov voy a correr en cuanto pueda, espero poder hacerle las correciones para que haga lo que me pidieron.

me ayudaste mucho

gracias

      gracias  Flash

Desconectado alexanmar

  • PIC10
  • *
  • Mensajes: 3
RE: conversion de bcd a binario
« Respuesta #3 en: 30 de Agosto de 2005, 12:50:00 »
por fin logre realizar el programa que convierte un numero de 5 digitos bcd en binario natural, tiene los comentarios, el resultado se expresa en el registro bitmayor, msb y lsb en ese mismo orden, esta desarrollado para pic 16f84, cualquier duda pueden preguntar

Es un poquito largo, pero solo un poco, existe una forma mas reducida de hacerlo pero todavia no he hecho el programa.

Basicamente lo que se hace es multiplicar el numero BCD por su valor posicional para luego sumar todos los resultados.


---------------------------------------------------------------------------------------------------------
estado      equ   0x03
decenamil                   equ   0x0c
milcentena   equ   0x0d
decunidad   equ   0x0e
h      equ   0x0f
m      equ   0x10
contador                   equ   0x11
conta      equ   0x12
bcd      equ   0x13
constantea   equ   0x14
constanteb   equ   0x15
numero      equ   0x16
lsba      equ   0x17
msba      equ   0x18
num      equ   0x19
bitmayor                   equ   0x1a
msb      equ   0x1b
lsb      equ   0x1c

;--------------------------------------------------------------------------------------------------------

;Este programa realiza la conversion de un numero BCD hasta de
;cinco digitos y saca su equivalente en binario natural.

;--------------------------------------------------------------------------------------------------------

;aqui se cargan los numeros en bcd
      movlw   b"xxxx"
      movwf   decenamil
      movlw   b"xxxxyyyy"
      movwf   milcentena
      movlw   b"xxxxyyyy"
      movwf   decunidad

;se coloca el contador para saber que numero se esta tratando
      movlw   .5
      movwf   contador

;se comienza a trabajar con las unidades
unidad      movf   decunidad,0
      movwf   m
      movwf   h

;se va a detectar el numero BCD a convertir en la posicion de las unidades
      call   numerob

;se verifica que el valor no sea cero para continuar,
;si es cero se pasa a determinar las decenas
      btfss   num,0
      goto   decrementa
      movf   bcd,0
      movwf   lsb
      goto   decrementa

;se va a trabajar con las decenas y primero se determina el numero BCD asociado
;a esta posicion
decena      call   numerob

;se verifica que el numero no sea cero, en caso de ser asi se
;pasa a calcular las centenas
      btfss   num,0
      goto   decrementa

;se carga el 10, numero a multilplicar por las decenas
      movlw   .10
      movwf   constantea
      clrf   constanteb
      goto   multiplica

;se trabaja con las centenas, primero se guarda el
;registro que contiene las centenas y las unidades
;de mil, para luego separalas  examinar cada BCD
centena      movf   milcentena,0
      movwf   m
      movwf   h

;se determina el valor BCD a multiplicar por 100
      call   numerob

;se verifica si es cero el numero BCD
      btfss   num,0
      goto   decrementa

;se carga la constantea con el valor 100, que luego
;se multiplica con el numero en BCD
      movlw   .100
      movwf   constantea
      clrf   constanteb
      goto   multiplica   

;se detecta las unidades de mil, que quedaron del registro
;que las contenia
unimil      call   numerob

;se verifica que el numero no sea cero
      btfss   num,0
      goto   decrementa

;en este caso mil ocupa 10 bits, se guarda el LSB en
;constantea y los otros 2 en constanteb para luego
;multiplicar por separado
      movlw   b"11101000"
      movwf   constantea
      movlw   b"11"
      movwf   constanteb
      goto   multiplica

;aqui como las decenas de mil utilizan solo un registro
;se guarda en el BCD y se verifica si el valor es cero
decmil      bcf   estado,2
      movf   decenamil,0

;se prueba si es cero   
      btfsc   estado,2
      goto   final
      movwf   bcd
      movwf   m
      movwf   h

;aqui pasa igual, diez mil ocupa 14 bits, se guarda el LSB
;en constantea y MSB en constanteb para multiplicalos por
;separado
      movlw   b"10000"
      movwf   constantea
      movlw   b"100111"
      movwf   constanteb
      goto   multiplica

;como su nombre lo indica, aqui se determina con que
;valor posicional se esta trabajando, se comienza por
;las unidades y se va aumentando de valor posicional
;a medida que el contador vaya decrementando, cuando el
;contador llegue a cero, se termino el proceso
determina   movf   contador,0
      sublw   4
      btfsc   estado,2
      goto   decena
      movf   contador,0
      sublw   3
      btfsc   estado,2
      goto   centena
      movf   contador,0
      sublw   2
      btfsc   estado,2
      goto   unimil
      movf   contador,0
      btfss   estado,2
      goto   decmil
      goto   final

;aqui se separan los numeros guardados en los registros
;para decifrar el BCD, mientras el siguiente numero BCD
;guardado en el registro m
numerob      movlw   .4
      movwf   conta
rota      rrf   m,1
      rrf   bcd,1
      decfsz   conta,1
      goto   rota

;se crea una condicion, si el BCD es cero, el registro
;num se resetea, si es mayor que cero el BCD el num se
;setea para su posterior prueba en los respectivos valores
;posicionales
revision   bcf   estado,2
      clrf   num      
      movf   bcd,0
      btfsc   estado,2
      return
      swapf   bcd,0
      movwf   h
      movwf   bcd
      movlw   .1
      movwf   num   
      return

;se decrementa el contador de las posciones
decrementa   decf   contador,1
      goto   determina

;se multiplica la constantea por el valor BCD con el metodo
;de desplazamiento de registros
multiplica   movlw   .8
      movwf   conta
      bcf   estado,0
      movf   constantea,0
      clrf   lsba
      clrf   numero
rotaa      rrf   bcd,1
      btfsc   estado,0
      addwf   numero,1
      rrf   numero,1
      rrf   lsba,1
      decfsz   conta,1
      goto   rotaa

;una vez culminada la multiplicacion se suma el resultado
;con el lsb (donde se guarda el resultado final), se va
;realizando sumas parciales a medida que se va multiplicando
sumaa      movf   lsb,0
      addwf   lsba,0
      movwf   lsb
      btfsc   estado,0
      call   ajustarl
      movf   numero,0
      btfss   estado,2
      goto   lsbc;acarreo del lsb

;se verifica si el valor de la constanteb es cero para
;ver si se realiza o no la multiplicacion de la constanteb
numerb      movf   constanteb,0
      btfss   estado,2
      goto   multiplicab
      goto   decrementa

;si existe un acarreo en el lsb, se suma al msb, y se
;guarda en dicho registro
lsbc      addwf   msb,1
      goto   numerb

;en caso que la constanteb sea un numero valido se multiplica
;con el BCD
multiplicab   clrf   numero
      movlw   .8
      movwf   conta
      bcf   estado,0
      movf   h,0
      movwf   bcd
      movf   constanteb,0
rotab      rrf   bcd,1
      btfsc   estado,0
      addwf   numero,1
      rrf   numero,1
      rrf   msba,1
      decfsz   conta,1
      goto   rotab

;se suma el msb con el resultado de la mutiplicacion de
;la constanteb
sumab      movf   msb,0
      addwf   msba,0
      movwf   msb
      btfsc   estado,0
      call   ajustarm
      movf   numero,0
      addwf   bitmayor,1
      goto   decrementa

;se acomoda el desborde de 256 en el lsb
ajustarl   movf   msb,0
      addlw   1
      movwf   msb
      return

;se ajusta el desborde de 256 en el msb
ajustarm   movf   bitmayor,0
      addlw   1
      movwf   bitmayor
      return
final      
      end