// Definición de los pines
#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
#define DIGIT_1 9
#define DIGIT_2 10
#define DIGIT_3 11
#define DIGIT_4 12
#define BUTTON_HOUR 13
#define BUTTON_MINUTE A0
int hour = 0;
int minute = 0;
unsigned long previousMillis = 0;
const long interval = 60000; // 1 minuto en milisegundos
// Mapeo de los números a los segmentos
const byte digitMap[10] = {
// GFEDCBA
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
void setup() {
// Configurar los pines de los segmentos como salida
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);
// Configurar los pines de los dígitos como salida
pinMode(DIGIT_1, OUTPUT);
pinMode(DIGIT_2, OUTPUT);
pinMode(DIGIT_3, OUTPUT);
pinMode(DIGIT_4, OUTPUT);
// Configurar los pulsadores
pinMode(BUTTON_HOUR, INPUT_PULLUP);
pinMode(BUTTON_MINUTE, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = millis();
// Comprobación de los pulsadores
if (digitalRead(BUTTON_HOUR) == LOW) {
delay(50); // Antirrebote
if (digitalRead(BUTTON_HOUR) == LOW) {
hour++;
if (hour > 23) {
hour = 0;
}
while (digitalRead(BUTTON_HOUR) == LOW); // Esperar a que se suelte el pulsador
}
}
if (digitalRead(BUTTON_MINUTE) == LOW) {
delay(50); // Antirrebote
if (digitalRead(BUTTON_MINUTE) == LOW) {
minute++;
if (minute > 59) {
minute = 0;
}
while (digitalRead(BUTTON_MINUTE) == LOW); // Esperar a que se suelte el pulsador
}
}
// Incremento del tiempo cada minuto
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
minute++;
if (minute > 59) {
minute = 0;
hour++;
if (hour > 23) {
hour = 0;
}
}
}
// Mostrar la hora en el display
displayTime(hour, minute);
}
void displayTime(int hour, int minute) {
int digits[4] = { hour / 10, hour % 10, minute / 10, minute % 10 };
for (int i = 0; i < 4; i++) {
displayDigit(i, digits[i]);
delay(5); // Breve retardo para la multiplexación
}
}
void displayDigit(int digit, int number) {
// Apagar todos los dígitos
digitalWrite(DIGIT_1, LOW);
digitalWrite(DIGIT_2, LOW);
digitalWrite(DIGIT_3, LOW);
digitalWrite(DIGIT_4, LOW);
// Encender el dígito correspondiente
switch(digit) {
case 0:
digitalWrite(DIGIT_1, HIGH);
break;
case 1:
digitalWrite(DIGIT_2, HIGH);
break;
case 2:
digitalWrite(DIGIT_3, HIGH);
break;
case 3:
digitalWrite(DIGIT_4, HIGH);
break;
}
// Encender los segmentos correspondientes al número
byte segments = digitMap[number];
digitalWrite(SEG_A, segments & 0b00000001 ? HIGH : LOW);
digitalWrite(SEG_B, segments & 0b00000010 ? HIGH : LOW);
digitalWrite(SEG_C, segments & 0b00000100 ? HIGH : LOW);
digitalWrite(SEG_D, segments & 0b00001000 ? HIGH : LOW);
digitalWrite(SEG_E, segments & 0b00010000 ? HIGH : LOW);
digitalWrite(SEG_F, segments & 0b00100000 ? HIGH : LOW);
digitalWrite(SEG_G, segments & 0b01000000 ? HIGH : LOW);
}