// Variables globales para el conteo del reloj
byte segundos;
byte segundos_unidades;
byte segundos_decenas;
byte minutos;
byte minutos_unidades;
byte minutos_decenas;
byte horas;
byte horas_unidades;
byte horas_decenas;
// Arreglos de la entrada a los 7 segmentos
byte numeros[] = {
0b11111100, //0
0b01100000, //1
0b11011010, //2
0b11110010, //3
0b01100110, //4
0b10110110, //5
0b10111110, //6
0b11100000, //7
0b11111110, //8
0b11100110, //9
};
// Alias para imprimir la combinacion necesaria para representar
// cada numero
#define cero numeros[0]
#define uno numeros[1]
#define dos numeros[2]
#define tres numeros[3]
#define cuatro numeros[4]
#define cinco numeros[5]
#define seis numeros[6]
#define siete numeros[7]
#define ocho numeros[8]
#define nueve numeros[9]
// Pines de los displays de 7 segmentos
#define DS 4 // Entrada serial
#define STCP 3 // Latch clock
#define SHCP 2 // Shift clock
void setup(){
// Configurar pines de salida
pinMode(DS, OUTPUT);
pinMode(STCP, OUTPUT);
pinMode(SHCP, OUTPUT);
// Inicializar el reloj a cero
segundos = 0;
minutos = 0;
horas = 0;
// Iniciar comunicación serial
Serial.begin(115200);
}
void loop(){
// Actualizar el reloj automáticamente
delay(1000); // Esperar un segundo
actualizarReloj();
// Imprimir los segundos, minutos y horas en el monitor serial
Serial.print("Horas: ");
Serial.print(horas_decenas);
Serial.print(horas_unidades);
Serial.print(":");
Serial.print(minutos_decenas);
Serial.print(minutos_unidades);
Serial.print(":");
Serial.print(segundos_decenas);
Serial.println(segundos_unidades);
// Mostrar los valores en los displays
mostrar();
}
// Función para cargar un valor de 8 bits al registro serial
void cargar(byte valor){
digitalWrite(STCP, LOW);
shiftOut(DS, SHCP, MSBFIRST, valor);
digitalWrite(STCP, HIGH);
}
// Función para mostrar los valores de hora, minutos y segundos en los displays
void mostrar(){
cargar(numeros[segundos_unidades]);
cargar(numeros[segundos_decenas]);
cargar(numeros[minutos_unidades]);
cargar(numeros[minutos_decenas]);
cargar(numeros[horas_unidades]);
cargar(numeros[horas_decenas]);
}
// Función para actualizar el reloj
void actualizarReloj(){
segundos = (segundos + 1) % 60;
minutos = (minutos + (segundos == 0)) % 60;
horas = (horas + (minutos == 0 && segundos == 0)) % 24;
// Separar los valores de hora, minutos y segundos en unidades y decenas
segundos_unidades = segundos % 10;
segundos_decenas = segundos / 10;
minutos_unidades = minutos % 10;
minutos_decenas = minutos / 10;
horas_unidades = horas % 10;
horas_decenas = horas / 10;
}