Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
felipeetec

Placar eletronico com lcd e pic16f877a

Recommended Posts

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);
}

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por Bcpetronzio
    Unir Post seguidos em menos de 24 horas, use a opção editar. Inserir Targs CODE

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Quando sugeri o delay logo depois do teste, você poderia usar um entre 30 e 100 ms. Esse delay serve como deboucing.... para evitar q você toque no push button e a rotina seja executada mais de uma vez.

    Mas já q funcionou.. tá otimo :D

    flws

    Compartilhar este post


    Link para o post
    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

    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






    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

    ×