// Definición de los pines para el display de 4 dígitos y 7 segmentos
const int digitPins[] = {1,3,21,19}; // Pines de los dígitos (de izquierda a derecha)
const int segmentPins[] = {15,2,4,16,17,5,18}; // Pines de los segmentos
// Definición de los pines para el teclado multiplexado
const int rowPins[] = {13,12,14,27}; // Pines de las filas
const int colPins[] = {26,25,33,32}; // Pines de las columnas
char keypadMap[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Variables globales
char displayBuffer[5] = " "; // Buffer para almacenar los números
int currentDigit = 0; // Dígito actual en el display
void setup() {
// Inicializa los pines del display como salidas
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
}
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
// Inicializa los pines del teclado como entradas
for (int i = 0; i < 4; i++) {
pinMode(rowPins[i], OUTPUT);
digitalWrite(rowPins[i], HIGH); // Desactiva las filas iniciales
}
for (int i = 0; i < 4; i++) {
pinMode(colPins[i], INPUT_PULLUP);
}
// Inicia el puerto serie para la depuración
Serial.begin(9600);
}
void loop() {
// Escanea el teclado multiplexado
char key = readKeypad();
// Si se presionó una tecla válida, actualiza el display
if (key != '\0') {
updateDisplay(key);
}
}
char readKeypad() {
for (int row = 0; row < 4; row++) {
digitalWrite(rowPins[row], LOW); // Activa la fila actual
for (int col = 0; col < 4; col++) {
if (digitalRead(colPins[col]) == LOW) {
delay(50); // Espera para evitar rebotes
while (digitalRead(colPins[col]) == LOW) {} // Espera hasta que se suelte la tecla
digitalWrite(rowPins[row], HIGH); // Desactiva la fila
return keypadMap[row][col];
}
}
digitalWrite(rowPins[row], HIGH); // Desactiva la fila
}
return '\0'; // No se presionó ninguna tecla
}
void updateDisplay(char key) {
// Mueve los dígitos hacia la izquierda
for (int i = 0; i < 3; i++) {
displayBuffer[i] = displayBuffer[i + 1];
}
// Coloca el nuevo número en el dígito más a la derecha
displayBuffer[3] = key;
// Actualiza el display
for (int digit = 0; digit < 4; digit++) {
digitalWrite(digitPins[digit], LOW); // Activa el dígito actual
// Mostrar el segmento correspondiente
for (int segment = 0; segment < 8; segment++) {
digitalWrite(segmentPins[segment], displayBuffer[digit] & (1 << segment));
}
delay(1); // Breve retardo para multiplexación
// Desactiva el dígito actual
digitalWrite(digitPins[digit], HIGH);
}
}
// Definición de los segmentos para mostrar números del 0 al 9
const byte displaySegments[][8] = {
{1, 1, 1, 1, 1, 1, 0, 0}, // 0
{0, 1, 1, 0, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1, 0}, // 2
{1, 1, 1, 1, 0, 0, 1, 0}, // 3
{0, 1, 1, 0, 0, 1, 1, 0}, // 4
{1, 0, 1, 1, 0, 1, 1, 0}, // 5
{1, 0, 1, 1, 1, 1, 1, 0}, // 6
{1, 1, 1, 0, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1, 0}, // 8
{1, 1, 1, 1, 0, 1, 1, 0} // 9
};