A função 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 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 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:
- BCD_low
- BCD_unidades
- BCD_dezenas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
;********************************************************* ;<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 ;} ;*********************************************************
|