// Definir pines para el teclado matricial 4x4
const int filas[4] = {13, 12, 14, 27}; // Pines conectados a las filas del teclado
const int columnas[4] = {26, 25, 33, 32}; // Pines conectados a las columnas del teclado
// Mapeo del teclado 4x4
char teclas[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'F', '0', 'E', 'D'}
};
// Definir pines para el display de 7 segmentos (4 dígitos)
const int segmentos[7] = {15, 2, 4, 5, 18, 19, 23}; // Pines para los segmentos a-g
const int digitos[4] = {34, 35, 22, 21}; // Pines para activar cada uno de los 4 dígitos
// Variables para el display y contador
char display[4] = {' ', ' ', ' ', ' '};
byte segmentosCaracteres[16] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D,
0X7D, 0X07, 0X7F, 0X6F, 0X77, 0X7C, 0X58, 0X5E, 0X71, 0X79};
int contador = 11;
bool detener = false;
// Contraseña para detener el contador
String password = "123A";
String entrada = "";
// Temporización del contador
unsigned long tiempoPrevio = 0;
unsigned long periodo = 1000;
void setup() {
// Configurar pines de segmentos como salidas
for (int i = 0; i < 7; i++) {
pinMode(segmentos[i], OUTPUT);
digitalWrite(segmentos[i], LOW);
}
// Configurar pines de dígitos como salidas
for (int i = 0; i < 4; i++) {
pinMode(digitos[i], OUTPUT);
digitalWrite(digitos[i], HIGH); // Apagar dígitos
}
// Configurar pines de filas como entradas
for (int i = 0; i < 4; i++) {
pinMode(filas[i], INPUT);
}
// Configurar pines de columnas como entradas con resistencia pull-up
for (int i = 0; i < 4; i++) {
pinMode(columnas[i], INPUT_PULLUP);
}
}
void loop() {
// Leer el teclado
char tecla = leerTeclado();
// Si se ha presionado una tecla
if (tecla) {
entrada += tecla; // Concatenar la tecla presionada (sin mostrarla en el display)
// Si la entrada coincide con la contraseña, detener el contador
if (entrada.length() == 4) {
if (entrada == password) {
detener = true;
}
entrada = ""; // Reiniciar la entrada
}
}
// Actualizar el contador si no está detenido
if (!detener && millis() - tiempoPrevio >= periodo) {
tiempoPrevio = millis();
contador--;
if (contador < 0) {
contador = 11; // Reiniciar a 10 si llega a 0
}
mostrarNumero(contador);
}
// Mostrar el contenido en el display (multiplexado)
for (int i = 0; i < 4; i++) {
mostrarCaracter(i, display[i]);
}
}
// Función para leer la tecla presionada
char leerTeclado() {
for (int i = 0; i < 4; i++) {
// Configurar la fila como salida y ponerla en LOW
pinMode(filas[i], OUTPUT);
digitalWrite(filas[i], LOW);
// Leer las columnas
for (int j = 0; j < 4; j++) {
pinMode(columnas[j], INPUT_PULLUP);
if (digitalRead(columnas[j]) == LOW) {
while (digitalRead(columnas[j]) == LOW); // Esperar a que se suelte la tecla
return teclas[i][j]; // Retornar la tecla presionada
}
}
// Restablecer la fila a entrada para evitar interferencias
pinMode(filas[i], INPUT);
}
return 0; // No se ha presionado ninguna tecla
}
// Función para mostrar un número en el display
void mostrarNumero(int num) {
int unidades = num % 10;
int decenas = num / 10;
display[0] = ' ';
display[1] = ' ';
display[2] = (decenas == 0) ? ' ' : (char)(decenas + '0');
display[3] = (char)(unidades + '0');
}
// Función para encender los segmentos del display
void mostrarCaracter(int digito, char caracter) {
byte segmentosEncender = 0b00000000; // Apagar todos los segmentos por defecto
// Convertir el carácter en segmentos
if (caracter >= '0' && caracter <= '9') {
segmentosEncender = segmentosCaracteres[caracter - '0']; // Convertir el caracter en número
} else if (caracter == 'A') {
segmentosEncender = segmentosCaracteres[10]; // A
} else if (caracter == 'B') {
segmentosEncender = segmentosCaracteres[11]; // B
} else if (caracter == 'C') {
segmentosEncender = segmentosCaracteres[12]; // C
} else if (caracter == 'D') {
segmentosEncender = segmentosCaracteres[13]; // D
} else if (caracter == 'E') {
segmentosEncender = segmentosCaracteres[14]; // H
} else if (caracter == 'F') {
segmentosEncender = segmentosCaracteres[15]; // Guion "-"
}
// Encender los segmentos adecuados
for (int i = 0; i < 7; i++) {
digitalWrite(segmentos[i], bitRead(segmentosEncender, i));
}
// Encender el dígito correspondiente
digitalWrite(digitos[digito], LOW); // Activa el dígito
delay(5);
digitalWrite(digitos[digito], HIGH); // Desactiva el dígito
}