Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
Entre para seguir isso  
Projetos_afg

Rotinas de ajuste decimal PIC

Recommended Posts

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
Editado por Projetos_afg

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • O princípio da minha rotina é dividir o número por 10000, 1000, 100 e 10 dando os correspondentes dígitos, o que sobra é unidade.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por Projetos_afg

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Projetos_afg,seu código ficou bem eficiente.

    Editado por vtrx

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×