• Início
  • Fórum
  • Informática
    • WEB
    • JAVA
    • Linux
    • Blender
    • BrOffice/OpenOffice
    • Livros
  • Física
    • Mecânica
    • Termodinâmica
    • Eletromagnetismo
    • Física Moderna
  • Sistemas Elétricos
    • ASP/LT
    • Instalações Elétricas
    • Máquinas Elétricas
    • Livros
  • Eletrônica
    • Analógica
    • Digital
    • VHDL
    • Microcontroladores
  • Telecom
    • Comunicações
    • DSP
  • IA
    • Algoritmos Genéticos
    • Redes Neurais
  • Contato
Eletrônica Microcontroladores

PIC16: toBCD8 - Hexadecimal para BCD 8 bits

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
;}

;*********************************************************


Traduções

  • English (United States)

Menu

  • Início
  • Fórum
  • Informática
  • Física
  • Sistemas Elétricos
  • Eletrônica
    • Analógica
    • Digital
    • VHDL
    • Microcontroladores
  • Telecom
  • IA
  • Contato

Outros artigos

  • PIC16: Relógio e contagem até 9999d
  • MPLAB: Code folding para Assembly
  • PIC16: mostra1digito - exibe um dígito em displays multiplexados
  • PIC Power-Up Timer
  • PIC Watchdog Timer
  • PIC16: Instruções de movimentação de dados
  • PIC16: delay_us
  • MPASM: cblock...endc

Últimos artigos

  • Amazon Kindle DX
  • Dispositivo Diferencial Residual (DR)
  • AJAX Chat - Open Source Web Chat
  • Controle escalar do motor de indução trifásico

Comunidade Livre

Conheça nosso fórum, livre e de qualidade, clicando aqui.
Para o topo
Todos os códigos-fonte estão licenciados pela LGPL e todo o conteúdo pela Creative Commons License.
Copyleft©2010. Nenhum direito reservado.