// Definição dos pinos dos segmentos
#define SEG_A 2
#define SEG_B 3
#define SEG_C 4
#define SEG_D 5
#define SEG_E 6
#define SEG_F 7
#define SEG_G 8
// Pinos de controle dos 4 dígitos
#define DIGITO_1 9
#define DIGITO_2 10
#define DIGITO_3 11 // Será a nossa Dezena
#define DIGITO_4 12 // Será a nossa Unidade
// Mapeamento de 0 a 9 (Configurado para CATODO COMUM)
const bool numeros[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
int contador = 0;
unsigned long tempoAnterior = 0;
const long intervalo = 500;
void setup() {
// Configura todos os pinos como saída
pinMode(SEG_A, OUTPUT); pinMode(SEG_B, OUTPUT); pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT); pinMode(SEG_E, OUTPUT); pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(DIGITO_1, OUTPUT);
pinMode(DIGITO_2, OUTPUT);
pinMode(DIGITO_3, OUTPUT);
pinMode(DIGITO_4, OUTPUT);
// Garante que os dígitos 1 e 2 fiquem sempre desligados
// (Para Catodo Comum, HIGH desliga. Para Anodo, mude para LOW)
digitalWrite(DIGITO_1, HIGH);
digitalWrite(DIGITO_2, HIGH);
}
void loop() {
// Incrementa o contador a cada 1 segundo sem travar o display
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= intervalo) {
tempoAnterior = tempoAtual;
contador++;
if (contador > 99) {
contador = 0;
}
}
// Separa o número (Ex: 25 -> dezena = 2, unidade = 5)
int dezena = contador / 10;
int unidade = contador % 10;
// MULTIPLEXAÇÃO: Liga um de cada vez por 5 milissegundos
// Mostra a Dezena no Dígito 3
ligarDigito(DIGITO_3, dezena);
delay(5);
desligarDigitos();
// Mostra a Unidade no Dígito 4
ligarDigito(DIGITO_4, unidade);
delay(5);
desligarDigitos();
}
// Envia os estados dos pinos para os segmentos
void setSegmentos(int numero) {
digitalWrite(SEG_A, numeros[numero][0]);
digitalWrite(SEG_B, numeros[numero][1]);
digitalWrite(SEG_C, numeros[numero][2]);
digitalWrite(SEG_D, numeros[numero][3]);
digitalWrite(SEG_E, numeros[numero][4]);
digitalWrite(SEG_F, numeros[numero][5]);
digitalWrite(SEG_G, numeros[numero][6]);
}
// Liga o dígito específico (LOW ativa o dígito se for Catodo Comum)
void ligarDigito(int pinoDigito, int numero) {
setSegmentos(numero);
digitalWrite(pinoDigito, LOW);
}
// Desliga os dígitos ativos para evitar o efeito "fantasma" (shadowing)
void desligarDigitos() {
digitalWrite(DIGITO_3, HIGH);
digitalWrite(DIGITO_4, HIGH);
}