Ir ao conteúdo
  • Cadastre-se
Junior Obreli

[Ajuda] Contador 0 a 9 Display 7 Segs com 1 botao em c

Recommended Posts

Boa Noite, Estou montando um projetinho para a facul com o pic 16f628a onde tenho que criar um contador de pulsos, com 1 display de 7 segs, onde cada vez que pressione o botao apareça no display o numero 0 e quando pressionar novamente apareça 1 e assim por diante ate o 9, quando chegar no nove retorne ao 0 e comece tudo de novo, mas nao estou conseguindo rodar no proteus pois quando coloco em execuçao o programa o display fica loco e fica piscando porém acho que posso ter feito o programa errado e queria uma opiniao de você segue abaixo o programa 

 

#include <16F628a.h>#use delay (clock=4000000)  //Entrada#define BOTAO1 (PIN_B1) //Saida#define LED1 (PIN_A0)#define LED2 (PIN_A1)#define LED3 (PIN_A2)#define LED4 (PIN_A3)#define LED5 (PIN_B4)#define LED6 (PIN_B5)#define LED7 (PIN_B6)  main(){      while (true){            if(input(BOTAO1));            //numero 0         output_low(LED1);         output_low(LED2);         output_low(LED3);         output_low(LED4);         output_low(LED5);         output_low(LED6);         output_low(LED7);         output_high(LED1);         output_high(LED2);         output_high(LED3);         output_high(LED4);         output_high(LED5);         output_high(LED6);             }                  {                    if(input(BOTAO1));         //numero 1         output_low(LED1);         output_low(LED2);         output_low(LED3);         output_low(LED4);         output_low(LED5);         output_low(LED6);         output_high(LED2);         output_high(LED3);}               {            if(input(BOTAO1));        //numero 2         output_low(LED2);         output_low(LED3);         output_high(LED1);         output_high(LED2);                  output_high(LED4);         output_high(LED5);         output_high(LED7);}                  {            if(input(BOTAO1));          //numero 3         output_low(LED1);         output_low(LED2);         output_low(LED4);         output_low(LED5);         output_low(LED7);         output_high(LED1);         output_high(LED2);         output_high(LED3);         output_high(LED4);         output_high(LED7);}                           {            if(input(BOTAO1));            //numero 4         output_low(LED1);         output_low(LED2);         output_low(LED3);         output_low(LED4);         output_low(LED7);         output_high(LED2);         output_high(LED3);         output_high(LED6);         output_high(LED7);}                   {            if(input(BOTAO1));            //numero 5         output_low(LED2);         output_low(LED3);         output_low(LED6);         output_low(LED7);         output_high(LED1);         output_high(LED3);         output_high(LED4);         output_high(LED6);         output_high(LED7);}                  {            if(input(BOTAO1));            //numero 6         output_low(LED1);         output_low(LED3);         output_low(LED6);         output_low(LED7);         output_high(LED1);         output_high(LED3);         output_high(LED4);         output_high(LED5);         output_high(LED6);         output_high(LED7);}                           {           if(input(BOTAO1));            //numero 7         output_low(LED1);         output_low(LED3);         output_low(LED4);         output_low(LED5);         output_low(LED6);         output_low(LED7);         output_high(LED1);         output_high(LED2);         output_high(LED3);}                                    {           if(input(BOTAO1));            //numero 8         output_low(LED1);         output_low(LED2);         output_low(LED3);         output_high(LED1);         output_high(LED2);         output_high(LED3);         output_high(LED4);         output_high(LED5);         output_high(LED6);         output_high(LED7);}                                                      {           if(input(BOTAO1));            //numero 9         output_low(LED1);         output_low(LED2);         output_low(LED3);         output_low(LED4);         output_low(LED5);         output_low(LED6);         output_low(LED7);         output_high(LED1);         output_high(LED2);         output_high(LED3);         output_high(LED4);         output_high(LED6);         output_high(LED7);}                          }
 
 
 
 
 
 
 
Obrigado pela atençao :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Junior Obreli

 

 Seu display ficou louco porque a leitura do botão que você esta fazendo esta sendo aleatória, e para um contador ela deve ser sequencial. Tipo assim: Seu programa lé o port 9 vezes  e aleatoriamente quando você pressiona o botão ele pode estar analisando qualquer uma das 9 posições, por isso ele não segue a ordem de contagem, ou fica preso em algum laço.

  Você poderia tentar fazer mais ou menos assim:

#include <16F628a.h>#use delay (clock=4000000)  //Entrada#define BOTAO1 (PIN_B1) //Saida#define LED1 (PIN_A0)#define LED2 (PIN_A1)#define LED3 (PIN_A2)#define LED4 (PIN_A3)#define LED5 (PIN_B4)#define LED6 (PIN_B5)#define LED7 (PIN_B6)  main(){  char conta=0;      while (true)           {            if(input(BOTAO1))conta++;  //soma a variável            if(conta==0) {...}  // analisa o valor e escreve no port            if(conta==1) {...}  // analisa o valor e escreve no port            if(conta==2) {...}  // analisa o valor e escreve no port            if(conta==3) {...}  // analisa o valor e escreve no port            if(conta==4) {...}  // analisa o valor e escreve no port            if(conta==5) {...}  // analisa o valor e escreve no port            if(conta==6) {...}  // analisa o valor e escreve no port            if(conta==7) {...}  // analisa o valor e escreve no port            if(conta==8) {...}  // analisa o valor e escreve no port            if(conta==9) {...}  // analisa o valor e escreve no port            if(conta==10) conta==0;  // Zera o contador           }}

 Onde esta os três pontinho ("...") você pode colocar a saída dos ports para os respectivos números.

Muita atenção com o "abrir" e "fechar" de chaves no programa, basta colocar uma no lugar errado para todo seu programa ir por água a baixo e nunca em hipótese alguma coloque ponto e virgula (" ; ") no "if", eu explico o porque:

 

 O que acontece é que o if executa uma instrução que esta depois dele, por exemplo, na linha:

if(conta==10)conta=0;

Se a condição é verdadeira ele executa o comando conta=0; se não ele passa reto, se você coloca um ponto e virgula depois do "if" o compilador vai deduzir que seu comando esta entre o if e o ponto e virgula.

Exemplo... Na linha:

if(conta==10); conta=0;

  Toda vez que o programa passar por aqui a variável conta sera igual a zero, pois o comando conta=0; esta fora do "if" e quando conta for igual a dez o programa não faz nada, pois o espaço entre o "if" e o ponto e virgula esta vazio (onde deveria estar sua instrução). Caso precise usar mais de uma instrução, você usa as chaves assim " if(conta==10)  { instruções aqui... } "

 

  Espero que alguma dessas dicas tenha lhe sido útil, e se tiver alguma duvida é só perguntar.

Grato Luiz Gustavo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aproveitando,toda vez que fizer muitas comparações onde só se tem uma resposta,utilize else,assim logo que a comparação da lista for verdadeira o programa não perde tempo executando as outras comparações:

main(){  char conta=0;      while (true)           {            if(input(BOTAO1))conta++;  //soma a variável            if(conta==0) {...}  // se for zero ja termina aqui		else            if(conta==1) {...}  // analisa o valor e escreve no port		else            if(conta==2) {...}  // analisa o valor e escreve no port,		else            if(conta==3) {...}  // analisa o valor e escreve no port		else            if(conta==4) {...}  // analisa o valor e escreve no port		else            if(conta==5) {...}  // analisa o valor e escreve no port		else            if(conta==6) {...}  // analisa o valor e escreve no port		else            if(conta==7) {...}  // analisa o valor e escreve no port		else            if(conta==8) {...}  // analisa o valor e escreve no port		else            if(conta==9) {...}  // analisa o valor e escreve no port		else            if(conta==10) conta==0;  // Zera o contador           }}

Melhor ainda para a geração de código mais rápido usando muitas comparações é usar o Case/Switch

main(){  char conta=0;    while (true)      {            if(input(BOTAO1))conta++;  //soma a variável	switch (conta)        {        	case 0:                	{...}  // analisa o valor e escreve no port        	break;        	case 1:                	{...}  // analisa o valor e escreve no port        	break;        	case 2:                	{...}  // analisa o valor e escreve no port        	break;        	case 3:                	{...}  // analisa o valor e escreve no port        	break;        	case 4:                	{...}  // analisa o valor e escreve no port        	break;        	case 5:                	{...}  // analisa o valor e escreve no port        	case 6:                	{...}  // analisa o valor e escreve no port        	break;        	case 7:                	{...}  // analisa o valor e escreve no port        	break;        	case 8:                	{...}  // analisa o valor e escreve no port        	break;        	case 9:                	{...}  // analisa o valor e escreve no port        	break;        	case 10:                	{...}  // analisa o valor e escreve no port        }    }}

Usando Case/Switch,o compilador vai utilizar Tabelas nas comparações e isso agiliza muito.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode também melhorar essa questão de quais pinos do port deverão estar em nível lógico alto ou baixo.

 

 

Por exemplo: 

 

int x=0;

char valor [10] = 
      {
      0x3f,  //  0x3F = 0b00111111  (seria = 0, ou a,b,c,d,e e f acessos[depende do seu hardware é claro])
      0x06,
      0x5b,
      0x4f,   
      0x66,
      0x6d,
      0x7d,
      0x07,
      0x7f,
      0x6f
      };  

 

void main()

    while(1)

   {

       if(input(BOTAO1)==1)

       {

            x++;

           output_d(valor[x]);

       }

    }

}

  • Curtir 1

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

×