// Pines para los segmentos del display de ánodo común
int segA = 16, segB = 17, segC = 4, segD = 2, segE = 0, segF = 19, segG = 15;
// Pines para los dígitos del display
int dig1 = 5, dig2 = 18, dig3 = 21, dig4 = 27;
// Pines para los botones
int btnFormato = 13, btnSegundos = 12;
// Variables de tiempo
int horas = 0, minutos = 0, segundos = 0;
bool formato24H = false; // Variable para alternar entre 12H y 24H
unsigned long previousMillis = 0;
const long interval = 1000; // Intervalo de 1 segundo
// Representación de los números en 7 segmentos
const byte numeros[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// Configuración inicial
void setup() {
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT);
pinMode(dig1, OUTPUT); pinMode(dig2, OUTPUT); pinMode(dig3, OUTPUT); pinMode(dig4, OUTPUT);
pinMode(btnFormato, INPUT_PULLUP);
pinMode(btnSegundos, INPUT_PULLUP);
apagarSegmentosYDígitos(); // Apagar todos los segmentos al inicio
}
// Función para apagar todos los segmentos y dígitos
void apagarSegmentosYDígitos() {
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
digitalWrite(dig1, LOW);
digitalWrite(dig2, LOW);
digitalWrite(dig3, LOW);
digitalWrite(dig4, LOW);
}
// Función para mostrar un número en 7 segmentos
void mostrarNumero(int numero) {
byte segmentos = numeros[numero];
digitalWrite(segA, segmentos & 0b00000001);
digitalWrite(segB, segmentos & 0b00000010);
digitalWrite(segC, segmentos & 0b00000100);
digitalWrite(segD, segmentos & 0b00001000);
digitalWrite(segE, segmentos & 0b00010000);
digitalWrite(segF, segmentos & 0b00100000);
digitalWrite(segG, segmentos & 0b01000000);
}
// Función para actualizar el tiempo cada segundo
void actualizarTiempo() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
segundos++;
if (segundos == 60) {
segundos = 0;
minutos++;
if (minutos == 60) {
minutos = 0;
horas++;
if ((formato24H && horas == 24) || (!formato24H && horas == 13)) {
horas = 0;
}
}
}
}
}
// Función para manejar botones
void manejarBotones() {
if (digitalRead(btnFormato) == LOW) {
delay(200);
formato24H = !formato24H; // Alterna entre 12H y 24H
}
}
// Función para mostrar la hora en el display
void mostrarHora() {
int h = horas;
if (!formato24H && h == 0) h = 12; // Ajuste para 12H
int min_dec = minutos / 10;
int min_uni = minutos % 10;
// Mostrar cada dígito individualmente y apagar al terminar
digitalWrite(dig1, HIGH);
mostrarNumero(h / 10); // Decenas de horas
delay(5);
apagarSegmentosYDígitos();
digitalWrite(dig2, HIGH);
mostrarNumero(h % 10); // Unidades de horas
delay(5);
apagarSegmentosYDígitos();
digitalWrite(dig3, HIGH);
mostrarNumero(min_dec); // Decenas de minutos
delay(5);
apagarSegmentosYDígitos();
digitalWrite(dig4, HIGH);
mostrarNumero(min_uni); // Unidades de minutos
delay(5);
apagarSegmentosYDígitos();
}
// Función para mostrar los segundos en el display
void mostrarSegundos() {
int sec_dec = segundos / 10;
int sec_uni = segundos % 10;
digitalWrite(dig3, HIGH);
mostrarNumero(sec_dec); // Decenas de segundos
delay(5);
apagarSegmentosYDígitos();
digitalWrite(dig4, HIGH);
mostrarNumero(sec_uni); // Unidades de segundos
delay(5);
apagarSegmentosYDígitos();
}
void loop() {
actualizarTiempo();
manejarBotones();
if (digitalRead(btnSegundos) == LOW) {
mostrarSegundos(); // Mostrar segundos si se mantiene el botón pulsado
} else {
mostrarHora(); // Mostrar hora por defecto
}
}