Ir ao conteúdo
  • Cadastre-se
Philippe Henrique

Assembly, display 7 segmentos

Recommended Posts

Bom, estou com dúvida de um código que achei na internet.

	MOVF	DEZENA,W
	CALL	TABELA
	MOVWF	PORTB
TABELA	ADDWF   PCL, F		
	RETLW	B'11000000'		;ZERO
        RETLW   B'11111001'		;UM
        RETLW   B'00100100'		;DOIS
        RETLW   B'00110000'		;TRES
        RETLW   B'00011001'		;QUATRO
        RETLW   B'00010010'		;CINCO
        RETLW   B'00000010'		;SEIS
        RETLW   B'01111000'		;SETE
        RETLW   B'10000000'		;OITO
        RETLW   B'00010000'		;NOVE

Certo, entendi que ele moveu o valor que estava na variável DEZENA para W, e chamou a CALL TABELA pra retornar com algum valor para W.

sendo eles valores de zero a nove.

 

Porém minha dúvida é: Como acontece esse retorno? E porque ocorre uma soma com o valor de W e PCL ? Como uma soma pode fazer com que algum desses valores retornem em W dessa subrotina?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Philippe Henrique,

 

Não conheço nada desse microcontrolador, então pode ser que eu esteja errado :

 

É somado o valor de DEZENA ao Program Counter, e assim ele vai executar a próxima instrução deslocando para o local apropriado que já vai retornar o valor convertido.

 

É uma maneira bem elegante e muito rápida de se fazer isso.

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@aphawk Não tinha pensado nisso. Parece que é exatamente isso você disse paulo.

Então o PCL indicará a próxima instrução a ser executada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Philippe Henrique ,

 

Sim, na verdade isso é uma tabela cujo ponteiro é o próprio Program Counter.

 

Não me lembro de ter visto esse tipo de instrução que utiliza diretamente o PCL como objeto de alguma operação matemática, e nem mesmo instruções de retorno de chamada de subrotina que permitem retornar valores diferentes em algum registrador em outros tipos de Assembly, achei muito interessante !

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, realmente; o PCL é o contador de programa, ele aponta para o endereço de memória que será executado em seguida.

 

O que acontece é o seguinte:

 

A - O valor da variável dezena é colocada em W, então é chamada uma sub-rotina, ao retorno da mesma o valor é passado para o PORTB, ou seja, os pinos físicos do micro-controlador.

 

B - Na sub-rotina, o valor passado em W que deve estar entre 0~9 é somado ao PCL, sendo assim de acordo o valor somado à ele, será (próxima linha = próxima linha + x). X é o valor da variável dezena, unidade, etc. RETLW retorna da sub-rotina com a Literal em W, os valores em binário representam os pinos do PORTB (bit b0, b1, b2 ... b7) que devem ligar os respectivos segmentos dos display. Por isso W é movido mais uma vez para o registrador de porta I/O.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@[Daniel]  Obrigado pela resposta.

Muito boa explicação entendi direitinho, vai ajudar bastante em meus estudos. Valeu !

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×