Ir ao conteúdo
  • Cadastre-se

Placar eletronico com lcd e pic16f877a


felipeetec

Posts recomendados

Eae galera, preciso de um help de vocês mais uma vez.

É o seguinte estou montando um pequeno placar eletrônico automatico, com sensores, mas estou com dificuldades na programação, quero que cada vez que esse sensor for ativado mostre no display o placar da partida, a ideia principal é fazer um contador com dois botões de incremento e dois de decrementos, estou fazendo a programação bloco a bloco por enquanto estou tentando fazer com qe um unico botao incremente un dos valores do placar, mas quando simulo no proteus e tento incrementar ele vai de zero pra seis e depois n incrementa mais.

alguem pode me ajudar???

obs: Estou utilizando o mikroc e o pic é o 16f877a

// Direção dos pinos do PIC para o LCD
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;



void main(){
int i;
i=0;
TRISC=1;
TRISB=0;
portb=0;
TRISD=1; //Configura PORTD como saída
portd=0; //Inicializa PORTD com 0 em todas as linhas
Lcd_Init(); // Inicializa LCD
Lcd_Cmd(_LCD_CLEAR); // Limpa display
Lcd_Cmd(_LCD_CURSOR_OFF); //Desliga o cursor do LCD
Lcd_Out(1,1, " Bom Jogo");
delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1, "Casa |Visitante");
Lcd_Out(2,1, " 0 | 0 ");
delay_ms(10);

do {

if (portc.f0==1) {
i ++;
switch (i) {
case 1 : Lcd_Out(2,1, " 1 | 0 ");
break;
case 2 : Lcd_Out(2,1, " 2 | 0 ");
break;
case 3 : Lcd_Out(2,1, " 3 | 0 ");
break;
case 4 : Lcd_Out(2,1, " 4 | 0 ");
break;
case 5 : Lcd_Out(2,1, " 5 | 0 ");
break;
case 6 : Lcd_Out(2,1, " 6 | 0 ");
break;
}
}
}while(1);
}

Link para o comentário
Compartilhar em outros sites

Não programo no MicroC mas deu pra entedner seu código.

Tem 1 falha e 1 ponto q precisa melhorar.

Veja q o seu while está em 1, ou seja, infinito. No entanto, sua rotina de incremento do valor da variável i está fora do while.

O pic vai passar pelo teste da portaC0 uma única vez. você deve deixar mais ou menos assim (lembre-se que programo no CCS, talvez a sintaxe do MicroC seja diferente):

Poe a sua rotina de teste da porta C0 dentro do while(1) e tira o while do final e tira o DO claro. E poe um delay logo depois do teste da porta.

Falou

Link para o comentário
Compartilhar em outros sites

até ai tudo bem , mas o problema agora, é que caso o portc.f0==1 seja pressionado por um tempo maior que o meu delay ele ira contar mais de uma vez, e caso ele seja pressionado mais doqe uma vez durante um periodo menor que meu delay ele ira contar apenas uma vez.

consegui resolver e incrementei mais algumas coisas, obrigado pela ajuda o codigo segue abaixo:

// Direção dos pinos do PIC para o LCD
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

void Tone1() {
Sound_Play(659, 50); // Frequency = 659Hz, duration = 250ms
}

void Tone2() {
Sound_Play(698, 50); // Frequency = 698Hz, duration = 250ms
}

void Tone3() {
Sound_Play(784, 50); // Frequency = 784Hz, duration = 250ms
}
void ToneA() {
Sound_Play( 880, 50);
}
void ToneC() {
Sound_Play(1046, 50);
}
void ToneE() {
Sound_Play(1318, 50);
}
void Melody2() { // Plays Melody2
unsigned short i;
for (i = 9; i > 0; i--) {
ToneA();
ToneC();
ToneE();
}
}

void Melody() { // Plays the melody "Yellow house"
Tone3(); Tone1(); Tone2(); Tone3();
Tone1(); Tone2(); Tone1(); Tone2();
}



void main(){
int oldstate;
char trava;
int i;
char gol;
i=0;
gol=0;
TRISC=1;
TRISB=0;
portb=0;
TRISD=0; //Configura PORTD como saída
portd=0; //Inicializa PORTD com 0 em todas as linhas
Lcd_Init(); // Inicializa LCD
Lcd_Cmd(_LCD_CLEAR); // Limpa display
Lcd_Cmd(_LCD_CURSOR_OFF); //Desliga o cursor do LCD
Lcd_Out(1,1, " Bom Jogo");
delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1, "Casa |Visitante");
Lcd_Out(2,1, " 0 | 0 ");
delay_ms(10);
Sound_Init(&PORTD, 3);
Sound_Play(1000, 1000);

for(;{
if (portc.f0==1) oldstate = 1;
if (oldstate && portc.f0==0) {
oldstate = 0;
i ++;
Melody2();
delay_ms(400);

switch (i) {
case 1 : Lcd_Out(2,3, "1");
break;
case 2 : Lcd_Out(2,3, "2");
break;
case 3 : Lcd_Out(2,3, "3");
break;
case 4 : Lcd_Out(2,3, "4");
break;
case 5 : Lcd_Out(2,3, "5");
break;
case 6 : Lcd_Out(2,3, "6");
break;
case 7 : Lcd_Out(2,3, "7");
break;
case 8 : Lcd_Out(2,3, "8");
break;
case 9 : Lcd_Out(2,3, "9");
break;
case 10 : Lcd_Out(2,3, "10");
delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1, "Casa win");
Lcd_Out(2,1, "Visitante lose");
}
}
if (portc.f1==1) trava = 1;
if (trava && portc.f1==0) {
trava = 0;
gol ++;
Melody();
switch (gol) {

case 1 : Lcd_Out(2,11, "1");
break;
case 2 : Lcd_Out(2,11, "2");
break;
case 3 : Lcd_Out(2,11, "3");
break;
case 4 : Lcd_Out(2,11, "4");
break;
case 5 : Lcd_Out(2,11, "5");
break;
case 6 : Lcd_Out(2,11, "6");
break;
case 7 : Lcd_Out(2,11, "7");
break;
case 8 : Lcd_Out(2,11, "8");
break;
case 9 : Lcd_Out(2,11, "9");
break;
case 10 : Lcd_Out(2,11, "10");
delay_ms(500);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1, "Visitante Win");
Lcd_Out(2,1, "Casa Lose");
break;
}
}
}
}

precisei fazer uma especie de intertravamento, para isso encrementei mais umas variaveis.

Link para o comentário
Compartilhar em outros sites

primeiramente, baixe o MPlab e use o PIC16F728A, é mais fácil de programar, e muito bom. Eu acho que você deveria primeiro montar um fluxograma, porque dai fica muito fácil, é só revisar os códigos e já era. Tipo, você precisa definir entradas e saídas, dar valores aos registradores, após isso, é só decrementar e incrementar, e mandar para as saídas, simples.:D

Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!