Boa tarde garageiros.

Estou mexendo no pic e estou tentando fazer um placar eletrônico com 4 display de 7 segmentos, mas estou com problemas no botão do placar.

Para evitar o debounce, eu queria usar a função button(), mas com o PIC 16F628A não funciona (pelo menos o meu não funcionou nunca).

Estou usando o MikroC Pro para programar.

Configurei o PIC para usar o oscilador interno, deixando as portas RA6 e RA7 como I/O.

Vejam o meu código:

#define disp1 RA0_bit          //define o label disp1 para o pino RA0
#define disp2 RA1_bit          //define o label disp2 para o pino RA1
#define disp3 RA2_bit          //define o label disp3 para o pino RA2
#define disp4 RA7_bit          //define o label disp4 para o pino RA7

int display[10]=                            //matriz com 10 elementos
        {
          0b01110111,        //digito 0           //Elemento [0] da matriz
          0b00100010,        //digito 1          //Elemento [1] da matriz
          0b01101101,        //digito 2
          0b01101011,        //digito 3
          0b00111010,        //digito 4
          0b01011011,        //digito 5
          0b01011111,        //digito 6
          0b01100010,        //digito 7
          0b01111111,        //digito 8
          0b01111011,        //digito 9           //Elemento [9] da matriz
        };


short ponto_1 = 0;
short ponto_2 = 0;
short dezena_1 = 0;
short unidade_1 = 0;
short dezena_2 = 0;
short unidade_2 = 0;
short numero = 0;

void tempo( )
{
  delay_ms(3);                                //delay em que o display permanece aceso
}

void tempo1( )
{
  delay_us(40);                                //intervalo entre acionamento do display seguinte
}

void mostra( )
{     numero = dezena_1;  //Mostra Dezena 1
      portb= display[numero];
      disp1=1;
      tempo( );
      disp1=0;
      tempo1( );

      numero = unidade_1;   //Mostra Unidade 1
      portb= display[numero];
      disp2=1;
      tempo( );
      disp2=0;
      tempo1( );

      /*numero = dezena_2;   //Mostra Dezena 2
      portb= display[numero];
      disp3=1;
      tempo( );
      disp3=0;
      tempo1( );

      numero = unidade_2;   //Mostra Unidade 2
      portb= display[numero];
      disp4=1;
      tempo( );
      disp4=0;
      tempo1( );*/
}

void main()
{
  CMCON |= 0x07;  //DESATIVAR COMPARADORES DA PORT A
  trisa = 0b00101000;
  porta = 0;
  trisb = 0b00000000;
  portb = 0;

  delay_ms(500);
  while(1)
  {
     if(Button(&PORTA,5,20,1))
     {
        ponto_1 = ponto_1++;
        if(ponto_1 > 99)
        {
           ponto_1 = 0;
        }
        delay_ms(150);
        dezena_1 = ponto_1 / 10;
        unidade_1 = ponto_2 %10;
     }
     mostra();
   }


}

Se eu altero a linha if(Button(&PORTA,5,20,1)) para if(porta.ra5==1), o sistema funciona, mas as vezes quando eu aperto o botão o contador pula vários números (debounce).

Se eu volto if(Button(&PORTA,5,20,1)), o sistema nem mostra o primeiro número. Fica muito louco e e trava. Geralmente não aparece nada no display e as vezes ele fica piscando.

Minha dúvida: O comando button não funciona no PIC 16F628A? O que fazer para resolver isso?

Exibições: 2508

Responder esta

Respostas a este tópico

Olá Marcelo,

Eu uso da forma abaixo, e funciona bem pra mim.

if (Button(&PORTA, 2, 1, 0))oldstate = 1;
if (oldstate && Button(&PORTA, 2, 1, 1)) {


//ROTINA

oldstate = 0;
}

Lembre-se de declarar uma variável char oldstate, e colocar um resistor de pullup na porta que estiver usando.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço