Ir ao conteúdo

[Resolvido]Contador de 0 a 9 com PIC16F877A


Gabriel-Kun

Posts recomendados

Postado

Para verificar se o valor do contador é igual a 9, você pode usar, por exemplo, a instrução XORWF:

MOVLW .9 ;W RECEBE 9

XORWF CONTADOR,W ;W = W xor CONTADOR

BTFSC STATUS,Z ;CONTADOR = 9?

GOTO... ;SIM

GOTO... ;NÃO

Para verificar se o valor do contador é igual a 0, pode fazer desta forma:

MOVF CONTADOR,W ;W = CONTADOR

BTFSC STATUS,Z ;CONTADOR = 0?

GOTO... ;SIM

GOTO... ;NÃO

Postado

Valeu Mulder_Fox, funcionou beleza, agora eu posso contar e "descontar" quantas vezes quiser que a contagem não zera, só quando chega em 9 ou em 1.

Agora outro problema...o display inicia no zero, mas quando eu faço a contagem ele não passa mais pelo zero, ele conta assim: 0-1-2-3-4-5-6-7-8-9-1-2-3-4-5-6-7-8-9-1-2..., só aparece o zero uma vez, no inicio, engraçado que eu mando ele ir para a Rotina Principal, que é onde ele limpa o contador e Zera o display.

Postado

Tem um erro:

Quando o contador está com o valor 0 e o botão de decrementar é pressionado, ele vai para a rotina principal e continua com o valor 0.

Para resolver isto, e tornar as coisas mais simples, aproveitando que você definiu valores de máximo e mínimo, sugiro que você escreva o valor mínimo e máximo dentro das próprias rotinas de incrementar e decrementar.

A rotina de incrementar poderia ficar assim:

Incrementar ; Rotina de Incrementar

movlw Maximo ; W = maximo

xorwf Contador,W ; W = W xor Contador

btfsc STATUS,Z ;Contador = maximo?

goto $+2 ;Sim, salta para 2 linhas abaixo

goto $+4 ;Não, salta para 4 linhas abaixo

movlw Minimo ;W = minimo

movwf Contador ;Contador = mínimo

goto $+2 ;Salta para 2 linhas abaixo

incf Contador,f ;Soma um do valor de Contador

call Conversor_Display ; Converter para Jogar nos Display

movwf PORTD ; Escreve o valor Convertido no Display

call Espera ; Chama a Rotina de Espera

return

A rotina de decrementar ficaria assim:

Decrementar ; Rotina de Decrementar

movlw Minimo ; W = minimo

xorwf Contador,W ; W = W xor Contador

btfsc STATUS,Z ;Contador = minimo?

goto $+2 ;Sim, salta para 2 linhas abaixo

goto $+4 ;Não, salta para 4 linhas abaixo

movlw Maximo ;W = maximo

movwf Contador ;Contador = maximo

goto $+2 ;Salta para 2 linhas abaixo

decf Contador,f ;Decrementa uma unidade do Contador

call Conversor_Display ; Converter para Jogar nos Display

movwf PORTD ; Escreve o valor Convertido no Display

call Espera ; Chama a Rotina de Espera

return

Repare que para as instruções infc e decf, depois do nome do registrador, segue ,f

Postado

Valeu Mulder_Fox, funcionou do jeito que eu queria!!!

Agora é só estudar o programa com estas novas instruções que você me passou, para que eu possa entender tudo, o que ele esta fazendo, mas pelo que li até agora já deu para entender!

Valeu Mesmo!!! Depois eu posto o Programa Completo.

Só uma última pergunta, se eu quisesse fazer ele contar até 9999, é muito complicado?

Postado

Não é complicado não.

Você teria quatro contadores de 0 a 9 (unidade, dezena, centena e milhar).

Quando a unidade chegar a nove ela é zerada e incrementa a dezena e assim por diante.

Quanto à exibição nos displays, cada um ficaria ativo por vez. Neste momento, os dados relativos a este display seriam copiados para o PORTD.

Poderia deixar cada display ativo por cerca de 3,3ms, o que daria uma frequência de "varredura" de cerca de 75Hz nos quatro displays.

Para obter este tempo, o melhor seria usar algum dos TIMERS do PIC e rotina de interrupção.

Postado

Valeu, mas isso não é para agora não, é só para ter uma ideia mesmo!

Talvez depois eu tento fazer algo parecido.

E mais uma vez gostaria de agradecer a todos que me ajudaram a resolver o Problema, Obrigado!!!

  • 2 semanas depois...
Postado

Como Prometido programa completo do Contador com PIC16F877A

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

;

;Eletrotécnica 4º Ano - EMI

;Gabriel Cintra - 05112212

;

;Programa 10:

;Iniciar o display da esquerda mostrando o número 0, a cada vez que a

;chave S4 for pressionada, incrementar o valor mostrado no display

;zerando novamente após o número 9.

;Quando pressionar a chave S3, decrementar o valor no display.

;

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

INCLUDE <P16F877A.INC>

LIST P=16F877A.INC

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _LVP_OFF

TEMP1 equ h'20'

TEMP2 equ h'21'

TEMP3 equ h'22'

Minimo equ h'00' ; Valor Minimo da Contagem

Maximo equ h'09' ; Valor Máximo da Contagem

Contador equ h'23' ; Local onde vai ser armazenado a contagem

bsf STATUS,5 ; Seleciona Banco 01

movlw b'00001111' ; Configura RB0:RB3 PORTB como Entrada

movwf TRISB ; Envia Configuração para TRISB

movlw b'00000000' ; Configura PORTD como Saída

movwf TRISD ; Envia Configuração para TRISD

bcf STATUS,5 ; Seleciona Banco 00

Principal ; Rotina para escrever Zero o Display

movlw b'00111111' ; Código para Escrever Zero no Display

movwf PORTD ; Escreve Zero no Display

clrf Contador ; Limpa Contador para Iniciar do Zero

movlw b'10000000' ; Seleciona Display a ser Escrito

movwf PORTB ; Envia seleção para PORTD

Checar ; Rotina para Verificar o Botão S4 e S3

btfss PORTB,3 ; Verifica S4.

call Incrementar ; Fechado vai para Incrementar.

btfss PORTB,2 ; Aberto, Verificar S3

call Decrementar ; Fechado, Vai para Decrementar.

goto Checar ; Aberto, Faz nova Verificação dos Botões

Incrementar ; Rotina de Incrementar

movlw Maximo ; W = maximo

xorwf Contador,W ; W = W xor Contador

btfsc STATUS,Z ; Contador = maximo?

goto $+2 ; Sim, salta para 2 linhas abaixo

goto $+4 ; Não, salta para 4 linhas abaixo

movlw Minimo ; W = minimo

movwf Contador ; Contador = mínimo

goto $+2 ; Salta para 2 linhas abaixo

incf Contador,f ; Soma um do valor de Contador

call Conversor_Display ; Converter para Jogar nos Display

movwf PORTD ; Escreve o valor Convertido no Display

call Espera ; Chama a Rotina de Espera

return

Decrementar ; Rotina de Decrementar

movlw Minimo ; W = minimo

xorwf Contador,W ; W = W xor Contador

btfsc STATUS,Z ; Contador = minimo?

goto $+2 ; Sim, salta para 2 linhas abaixo

goto $+4 ; Não, salta para 4 linhas abaixo

movlw Maximo ; W = maximo

movwf Contador ; Contador = maximo

goto $+2 ; Salta para 2 linhas abaixo

decf Contador,f ; Decrementa uma unidade do Contador

call Conversor_Display ; Converter para Jogar nos Display

movwf PORTD ; Escreve o valor Convertido no Display

call Espera ; Chama a Rotina de Espera

return

Conversor_Display

Movf Contador,W ; W Recebe Conteudo de Contador

Addwf PCL,F ; PCL Recebe (W + PCL)

Retlw b'00111111' ; Acende Zero (0) no Display

Retlw b'00000110' ; Acende Um (1) no Display

Retlw b'01011011' ; Acende Dois (2) no Display

Retlw b'01001111' ; Acende Três (3) no Display

Retlw b'01100110' ; Acende Quatro (4) no Display

Retlw b'01101101' ; Acende Cinco (5) no Display

Retlw b'01111101' ; Acende Seis (6) no Display

Retlw b'00100111' ; Acende Sete (7) no Display

Retlw b'01111111' ; Acende Oito (8) no Display

Retlw b'01101111' ; Acende Nove (9) no Display

Espera ; Rotina de Espera, para intervalo do Botão

movlw h'26' ; Valor a ser Decrementado

movwf TEMP1 ; Envia Valor para TEMP1

Volta1

movlw h'26' ; Valor a ser Decrementado

movwf TEMP2 ; Envia Valor para TEMP2

Volta2

movlw h'26' ; Valor a ser Decrementado

movwf TEMP3 ; Envia Valor para TEMP3

Volta3

decfsz TEMP3,F ; Decrementa Valor de TEMP3 e salta se for 0

goto Volta3 ; Vai para Volta3

decfsz TEMP2,F ; Decrementa Valor de TEMP2 e salta se for 0

goto Volta2 ; Vai para Volta2

decfsz TEMP1,F ; Decrementa Valor de TEMP1 e salta se for 0

goto Volta1 ; Vai para Volta1

return ; Volta para proxima instrução de onde foi chamada

END ; Fim do Programa

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

Agradeço a todos que me ajudaram...Obrigado!!!

  • Membro VIP
Postado

Resolvido!

Caso o autor tenha ainda algum interesse, dúvida ou questão, poderá entrar em contato com a Moderação e solicitar o desbloqueio.

Obrigado por avisar sobre a solução.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!