Ir ao conteúdo
  • Cadastre-se

Rotinas de ajuste decimal PIC


Projetos_afg

Posts recomendados

Boa tarde para o pessoal aqui do fórum.

Recentemente fiz algumas rotinas em assembly para a conversão de números de 8 a 16 bits para decimal, e resolvi compartilhar com vocês. Essas rotinas são de alta eficiência, por não usarem o método de incremento ( que para números grandes gasta um tempão ).

;Autor: Augusto Fraga Giachero
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rotina para a conversão de um número de 8 bits para BCD ou ASCIIcblock 0x20
VAR	;Byte do número a ser convertidoDSP1	;Dígito unidadeDSP2	;Dígito dezenaDSP3	;Dígito centena
endc
Converter_Bin_Dec_8bit
	clrf	DSP1	clrf	DSP2	clrf	DSP3	movlw	.100	subwf	VAR, 1	btfss	STATUS , 0	goto	$+3		incf	DSP3 , 1	goto	$-4	movlw	.100	addwf	VAR, 1	movlw	.10	subwf	VAR, 1	btfss	STATUS , 0	goto	$+3		incf	DSP2 , 1	goto	$-4	movlw	.10	addwf	VAR, 0	movwf	DSP1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Parte opcional do programa para a conversão de BCD para ASCII	movlw	0x30	addwf	DSP1, F	addwf	DSP2, F	addwf	DSP3, F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Rotina para a conversão de um número de 16 bits para BCD ou ASCII
cblock 0x20
VAR_L	;Byte menos significativo do número a ser convertidoVAR_H	;Byte mais significativo do número a ser convertidoDSP1	;Dígito unidadeDSP2	;Dígito dezenaDSP3	;Dígito centenaDSP4	;Dígito unidade de milharDSP5	;Dígito dezena de milhar
endc
Converter_Bin_Dec_16bit
	clrf	DSP1	clrf	DSP2	clrf	DSP3	clrf	DSP4	clrf	DSP5
	Ajuste_DSP5
	movlw	0x10	subwf	VAR_L, F	btfsc	STATUS, C	goto	$+9	movlw	.1	subwf	VAR_H, F	btfsc	STATUS, C	goto	$+5	incf	VAR_H, F	movlw	0x10	addwf	VAR_L, F	goto	FIM_DSP5
	movlw	0x27	subwf	VAR_H, F	btfss	STATUS, C	goto	$+3	incf	DSP5	goto	Ajuste_DSP5
	movlw	0x10	addwf	VAR_L, F	btfsc	STATUS, C	incf	VAR_H, F
	movlw	0x27	addwf	VAR_H, F
	FIM_DSP5

	Ajuste_DSP4
	movlw	0xE8	subwf	VAR_L, F	btfsc	STATUS, C	goto	$+9	movlw	.1	subwf	VAR_H, F	btfsc	STATUS, C	goto	$+5	incf	VAR_H, F	movlw	0xE8	addwf	VAR_L, F	goto	FIM_DSP4
	movlw	0x03	subwf	VAR_H, F	btfss	STATUS, C	goto	$+3	incf	DSP4	goto	Ajuste_DSP4
	movlw	0xE8	addwf	VAR_L, F	btfsc	STATUS, C	incf	VAR_H, F
	movlw	0x03	addwf	VAR_H, F
	FIM_DSP4
	Ajuste_DSP3
	movlw	.100	subwf	VAR_L, F	btfsc	STATUS, C	goto	$+9	movlw	.1	subwf	VAR_H, F	btfsc	STATUS, C	goto	$+5	incf	VAR_H, F	movlw	.100	addwf	VAR_L, F	goto	FIM_DSP3
	incf	DSP3, F	goto	Ajuste_DSP3
	FIM_DSP3
	Ajuste_DSP2
	movlw	.10	subwf	VAR_L, F	btfsc	STATUS, C	goto	$+9	movlw	.1	subwf	VAR_H, F	btfsc	STATUS, C	goto	$+5	incf	VAR_H, F	movlw	.10	addwf	VAR_L, F	goto	FIM_DSP2
	incf	DSP2, F	goto	Ajuste_DSP2
	FIM_DSP2
	Ajuste_DSP1
	movf	VAR_L, W	movwf	DSP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Parte opcional do programa para a conversão de BCD para ASCII	movlw	0x30	addwf	DSP1, F	addwf	DSP2, F	addwf	DSP3, F	addwf	DSP4, F	addwf	DSP5, F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	return
Link para o comentário
Compartilhar em outros sites

Boa tarde,

Legal compartilhar...

Desenvolvi também há um tempo atrás uma rotina de conversão e ficou bem parecida com a sua, só que a minha decrementa o MSB primeiro e depois o LSB de um número de 16 bits, usei ela em um conta-giros com 4 displays de 7 segmentos.

Abraço

Fernando Voltani

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

legal compartilhar. que tal assim:

#define DSP1 s[0] 
#define DSP2 s[1]
#define DSP3 s[2]
#define DSP4 s[3]
#define DSP5 s[4]
unsigned char s[5]; //global
void Converter_Bin_Dec_16bit(unsigned int dado)
{
unsigned char i=0;
DSP1=DSP2=DSP3=DSP4=DSP5=0;
while(dado)
{
s[i]=dado%10;
dado/=10;
i++;
}
}

informo-lhe que o cod gerado tende a ficar do mesmo tamanho ou... menor! Nada pessoal hein! só questão de ... fé.

abç & sucessos!

Link para o comentário
Compartilhar em outros sites

josedasilva0,

Analisei esse método, o código gerado fica menor, porém ele demora muito mais tempo para processar o número.

s=dado%10; --> Para encontrar o resto da divisão do número por 10 tem que realizar a divisão. O único método para fazer divisão no PIC é realizando várias subtrações, assim o número 65535 precisaria de 6553 subtrações, o que leva muito tempo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

bem pensado amigo! velocidade & tamanho têm seu lugar. mas creio que a velocidade de visualização num display (o que aparenta ser a proposta) é muito inferior a da matemática da coisa. No entanto a qualquer momento por curiosidade vou analisar no mplab quantos ciclos a função de resto ocupa nos compiladores que possuo. de resto... tá tudo certo! rs

abç&sucessos de novo!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...