A rotina de conversão de números hexadecimais para BCD de 8 bits em assembly é uma rotina simples que consiste em sucessivas subtrações por .10 (0xA) para contagem das dezenas. Após a obtenção do dígito das dezenas, tem-se o dígito das unidades (o número restante das subtrações). Essa rotina pode ser utilizada para a exibição de 2 números em displays de 7 segmentos.
A função abaixo utiliza o recurso de coding folding do MPLAB. Esse recurso é utilizado através das linhas ;{ e ;}. O código abaixo é compatível com as famílias PIC16 e PIC18.
Variáveis utilizadas:
;********************************************************* ;<FUNÇÃO> ; toBCD8 ;{ ; Converte um número de 8 bits em decimal para BCD ; <ARGUMENTOS> ; BCD_low = número de 8 bits a ser convertido em BCD ; <RETORNO> ; BCD_unidades = dígito menos significativo ; BCD_dezenas = dígito mais significativo ; BCD_low = ambos os dígitos ;********************************************************* #ifdef toBCD toBCD8: banksel BCD_low ; .100 invés de 99 para evitar o teste de igualdade movlw .100 ; verifica se o número é maior que .99 subwf BCD_low,w btfsc STATUS, C clrf BCD_low; apaga o número caso for maior que .99 clrf BCD_unidades ; apaga cálculos anteriores clrf BCD_dezenas dezenas_toBCD8: ; dígito mais significativo movlw .10 subwf BCD_low, f btfss STATUS, C goto unidades_toBCD8 incf BCD_dezenas,f goto dezenas_toBCD8 unidades_toBCD8: ; dígito menos significativo movlw .10 addwf BCD_low, f movf BCD_low, w movwf BCD_unidades swapf BCD_dezenas,w iorwf BCD_unidades,w movwf BCD_low ; retorna o resultado também em BCD_low return ; toBCD8 #endif ;} ;*********************************************************