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 portbsetup_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 .
Obrigado, muito legal o projeto
ResponderExcluir