Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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 :)
Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
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 1
Link para o comentário
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]);

       }

    }

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...