Caros amigos,
Hoje venho compartilhar mais um projeto, um contador digital up/down de cinco dígitos.
Em 1998 resolvi montar uma máquina para enrrolar transformadores. Na época os contadores digitais tinham um preço
significativo se comparado aos preços da atualidade e como meus recursos financeiros eram limitados, decidi usar um
contador mecânico. Os testes começaram com odômetros de carro e logo surgiram
as dificuldades, como por exemplo, sincronizar uma volta no eixo da máquina e
uma volta registrada no odômetro. Depois de tanto quebrar a cabeça resolvi
montar um contador digital baseado nos integrados CMOS, 4510 e 4511. Durante 6 anos usei meu contador CMOS sem maiores problemas. No entanto meus conhecimentos
de programação acerca dos microcontroladores foram evoluindo e surgiu a ideia
de usar um PIC para esta aplicação. Depois de trocar ideias com amigos mais experientes em programação e microcontroladores, em 2006 montei o circuito abaixo.
Este circuito foi montado em uma caixa padrão DIN 98x48x135. O resultado ficou muito bom. Prometo postar uma foto do contador em breve.
O firmware utilizado na época foi o seguinte, compilado no CCS:
/*---------------------------------------------------------------Projeto: Contador Digital up/downAutor: Mariano André AndersonFirmware: CD001 - 17/10/2006---------------------------------------------------------------*/
#include <16F628.h>
#use delay(clock=4000000)
#fuses XT, NOWDT, PUT, NOBROWNOUT, PROTECT, NOLVP
#define en373 pin_a0
#define clock pin_a4
#define upd pin_a3
#define bt1 pin_a1
#define bt2 pin_a2
//- Variáveis Globais -------------------------------------------
int unidade, dezena, centena, milhar, umilhar, i;
//- Função para converter o valor da variável para 7 segmentos --
// 0 = ligado 1 = desligado
// BAFGPCDE A
byte const converte[]={ 0b00011000, //0 * * * * *
0b01111011, //1 * *
0b00101100, //2 F * * B
0b00101001, //3 * G *
0b01001011, //4 * * * * *
0b10001001, //5 * *
0b10001000, //6 E * * C
0b00111011, //7 * *
0b00001000, //8 * * * * *
0b00001001}; //9 D * P
//- Função para atualizar o display -----------------------------
void atualiza_display()
{
output_b (converte[unidade]);
output_high(en373);
delay_us(1);
output_low(en373);
output_b(0b11101111);
delay_ms(1);
output_b (converte[dezena]);
output_high(en373);
delay_us(1);
output_low(en373);
output_b(0b11110111);
delay_ms(1);
output_b (converte[centena]);
output_high(en373);
delay_us(1);
output_low(en373);
output_b(0b11111011);
delay_ms(1);
output_b (converte[milhar]);
output_high(en373);
delay_us(1);
output_low(en373);
output_b(0b11111101);
delay_ms(1);
output_b (converte[umilhar]);
output_high(en373);
delay_us(1);
output_low(en373);
output_b(0b11111110);
delay_ms(1);
}
//- Função para somar -------------------------------------------
void mais_um()
{
unidade++;
if (unidade > 9)
{
unidade = 0;
dezena++;
}
if (dezena > 9)
{
dezena = 0;
centena++;
}
if (centena > 9)
{
centena = 0;
milhar++;
}
if (milhar > 9)
{
milhar = 0;
umilhar++;
}
if (umilhar > 9)
{
umilhar = 0;
}
i=0;
}
//- Função para subtrair um -------------------------------------
void menos_um()
{
unidade--;
if (unidade > 9)
{
unidade = 9;
dezena--;
}
if (dezena > 9)
{
dezena = 9;
centena--;
}
if (centena > 9)
{
centena = 9;
milhar--;
}
if (milhar > 9)
{
milhar = 9;
umilhar--;
}
if (umilhar > 9)
{
umilhar = 9;
}
i=0;
}
//- Início da rotina principal ----------------------------------
void main()
{
set_tris_b (0b00000000);
set_tris_a (0b00011110);
unidade = 0;
dezena = 0;
centena = 0;
milhar = 0;
umilhar = 0;
while (true)
{
atualiza_display();
{
if (i==1)
{
if ((!input(clock)) && ( input(upd))) mais_um();
if ((!input(clock)) && (!input(upd))) menos_um();
}
if (input(clock))
{
delay_us(200);
if ( input(clock)) i=1;
}
}
}
}
//- Fim ---------------------------------------------------------
Sinta-se a vontade para montar este circuito e fazer melhorias no firmware. E se depois você quiser compartilhar os resultados (sem interesse comercial) o blog estará a disponível para divulgação. Neste caso favor enviar os arquivos por e-mail que será dado os devidos créditos.
Abraço.