segunda-feira, 25 de outubro de 2010

Placar de truco :

este exemplo de codigo é uma contribuição de Rafael Varago para mais informação sobre este projeto
veja o link no final dessa postagem.

   visualização do projeto

codigo fonte :

/**************************************************************************
*                    Placar Eletronico de Truco                           *
***************************************************************************
* Rafael Varago de Aguiar                       Varago Automatics         *
***************************************************************************
* Versão: 2.0                                                             *
* Data: 19/10/2010                                                        *
*                                                                         *
* RAM: 6%   ROM: 7%                                                       *
***************************************************************************
* Controle de 4 Displays 7 segmentos para servir de placar de truco       *
* que vai de 0 a 12, sendo 2 displays para casa equipe                    *
* os pontos são computados através de 3 botões                            *
* DOWN: decrementa 1,UP: incrementa 1, TR: soma 3; o placar               *
* e salva na EEPROM os valores dos contadores para inicia-lo com eles     *
* na proxima vez que o circuito for ligado.                               *
**************************************************************************/
#include <16f877a.h> // Informa o PIC
#device adc=10 // Configura conversor AD para 10 bits
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT // Configs internas
#use delay (clock=4000000) // Seleciona delay para 4Mhz de clock
/**************************************************************************
**************************************************************************/
// Definições de pinos
#define dw1 pin_b0 // DOWN1 (decremeta 1 para a equipe 1)
#define up1 pin_b1 // UP1 (incrementa 1 para a equipe 1)
#define tr1 pin_b2 // TR1 (soma 3 para a equipe 1)
#define dw2 pin_b3 // DOWN2 (decremeta 1 para a equipe 2)
#define up2 pin_b4 // UP2 (incrementa 1 para a equipe 2)
#define tr2 pin_b5 // TR2 (soma 3 para a equipe 2)
/**************************************************************************
**************************************************************************/
// Variaveis globais
int pl1,pl2; // Armazanam o valor da contagem do placar
/**************************************************************************
**************************************************************************/
// Tabela para converter o valor da contagem para exibir no display
byte const tabela[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};
/**************************************************************************
**************************************************************************/
main(){ // Rotina principal
   int1 max1,min1,max2,min2; // Sinalizadores para indicar contagem min e max
   port_b_pullups(true); // Ativa pull-ups do portb
   setup_adc_ports(no_analogs); // Configura todas as entradas como digitais
   pl1=0; // Garante que o contador da equipe 1 comece em 0
   pl2=0; //    "     "  o    "     da   "    2   "    em 0
   delay_ms(500); // Estabilização da EEPROM
   pl1=read_eeprom(1); // Carrega o ultimo valor da EEPROM salvo do contador 1
   pl2=read_eeprom(2); //    "    o   "      "   da   "      "   do    "     2
   while(1){ // Laço de repetição infinito
/**************************************************************************
**************************************************************************/
// Fragmento do software para a contagem da primeira equipe
      if(min1 == 0){ // Se o display não estiver em 0
         if(!input(dw1)){ // Se o botão DOWN1 for pressionado
            while(input(dw1) == 0){
            } // Laço para soltar botão
            max1=0; // Limpa o sinalizador de display igual a 12
            pl1--; // Decrementa 1 da variavel de contagem da equipe 1
            if(pl1 == 0) // Se a contagem da equipe 1 estiver em 0
               min1=1; // Joga 1 no sinalizador de display igual a 0
            write_eeprom(1,pl1); // Salva o valor do contador 1 na EEPROM
         }
      } // Fim do bloco
      if(max1 == 0){ // Se o display não estiver em 12
         if(!input(up1)){ // Se o botão UP1 for pressionado
            while(input(up1) == 0){
            } // Laço para soltar botão
            min1=0; // Limpa o sinalizador de display igual a 0
            pl1++; // Incrementa 1 da variavel de contagem da equipe 1
            if(pl1 == 12) // Se a contagem da equipe 1 estiver em 12
               max1=1; // Joga 1 no sinalizador de display igual a 12
         write_eeprom(1,pl1); // Salva o valor do contador 1 na EEPROM
         }
      } // Fim do bloco
      if(max1 == 0){ // Se o display não estiver em 12
         if(!input(tr1)){ // Se o botão TR1 for pressionado
            while(input(tr1) == 0){
            } // Laço para soltar botão
            min1=0; // Limpa o sinalizador de display igual a 0
            pl1=pl1+3; // Incrementa 3 da variavel de contagem da equipe 1
            if(pl1 > 12){ // Se a contagem da equipe 1 ultrapassar 12
               pl1=12; // Contador da equipe 1 igual a 12
               max1=1;  // Joga 1 no sinalizador de display igual a 12
            }
         write_eeprom(1,pl1); // Salva o valor do contador 1 na EEPROM
         }
      } // Fim do bloco
/**************************************************************************
**************************************************************************/
// Fragmento do software para a contagem da segunda equipe
      if(min2 == 0){ // Se o display não estiver em 0
         if(!input(dw2)){ // Se o botão DOWN2 for pressionado
            while(input(dw2) == 0){
            } // Laço para soltar botão
            max2=0; // Limpa o sinalizador de display igual a 12
            pl2--; // Decrementa 1 da variavel de contagem da equipe 2
            if(pl2 == 0) // Se a contagem da equipe 2 estiver em 0
               min2=1; // Joga 1 no sinalizador de display igual a 0
            write_eeprom(2,pl2); // Salva o valor do contador 2 na EEPROM
         }
      } // Fim do bloco
      if(max2 == 0){ // Se o display não estiver em 12
         if(!input(up2)){ // Se o botão IP2 for pressionado
            while(input(up2) == 0){
            } // Laço para soltar botão
            min2=0; // Limpa o sinalizador de display igual a 0
            pl2++; // Incrementa 1 da variavel de contagem da equipe 2
            if(pl2 == 12) // Se a contagem da equipe 2 estiver em 12
               max2=1; // Joga 1 no sinalizador de display igual a 12
            write_eeprom(2,pl2); // Salva o valor do contador 2 na EEPROM
         }
      } // Fim do bloco
      if(max2 == 0){ // Se o display não estiver em 12
         if(!input(tr2)){ // Se o botão TR2 for pressionado
            while(input(tr2) == 0){
            } // Laço para soltar botão
            min2=0; // Limpa o sinalizador de display igual a 0
            pl2=pl2+3; // Incrementa 3 da variavel de contagem da equipe 2
            if(pl2 > 12){ // Se a contagem da equipe 2 ultrapassar 12
               pl2=12; // Contador da equipe 2 igual a 12
               max2=1;  // Joga 1 no sinalizador de display igual a 12
            }
            write_eeprom(2,pl2); // Salva o valor do contador 2 na EEPROM
         }
      } // Fim do bloco
/**************************************************************************
**************************************************************************/
// Joga valores nos displays
      output_c(0xfe); // Seleciona display dezena equipe 1
      output_d(tabela[pl1/10]); // Joga o valor do contador
      delay_ms(10); // Tempo para display ligado
      output_c(0xfd); // Seleciona display unidade equipe 1
      output_d(tabela[pl1%10]); // Joga o valor do contador
      delay_ms(10); // Tempo para display ligado
      output_c(0xfb); // Seleciona display dezena equipe 2
      output_d(tabela[pl2/10]); // Joga o valor do contador
      delay_ms(10); // Tempo para display ligado
      output_c(0xf7); // Seleciona display unidade equipe 2
      output_d(tabela[pl2%10]); // Joga o valor do contador
      delay_ms(10); // Tempo para display ligado
   } // Fim do laço de repetição
} // Fim do programa

para mais informação escreva para  rafaelvarago@yahoo.com.br .