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?
Tags:
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por