#include <Keypad.h>
// Pines para los segmentos del display de 4 segmentos
byte pinesSS[7] = {15, 2, 4, 5, 18, 19, 21}; // A, B, C, D, E, F, G
// Pines para el control de los dígitos del display
byte pinControl[] = {13, 12, 14, 27}; // Dígitos 1, 2, 3, 4
// Configuración del teclado 4x4
const byte ROWS = 4; // 4 filas
const byte COLS = 4; // 4 columnas
// Definir las teclas del teclado matricial
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Pines conectados a las filas y columnas del teclado
byte rowPins[ROWS] = {33, 25, 26, 32}; // Pines para las filas
byte colPins[COLS] = {22, 23, 16, 17}; // Pines para las columnas
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Mapeo de los números a los segmentos del display
const byte numToSegment[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
int currentNumber[4] = {0, 0, 0, 0}; // Números actuales a mostrar
void setup() {
Serial.begin(115200);
// Configurar pines de segmentos como salida
for (int i = 0; i < 7; i++) {
pinMode(pinesSS[i], OUTPUT);
}
// Configurar pines de control de dígitos como salida
for (int i = 0; i < 4; i++) {
pinMode(pinControl[i], OUTPUT);
digitalWrite(pinControl[i], HIGH); // Apagar todos los dígitos inicialmente
}
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.print("Tecla presionada: ");
Serial.println(key);
// Si la tecla presionada es un número, convertir el carácter a número
if (key >= '0' && key <= '9') {
// Desplazar los números en el array
for (int i = 3; i > 0; i--) {
currentNumber[i] = currentNumber[i - 1]; // Desplazar a la derecha
}
currentNumber[0] = key - '0'; // Guardar el número presionado en la primera posición
}
}
// Mostrar el número actual en el display (multiplexado)
multiplexDisplay();
}
// Función para mostrar los números en el display de 4 segmentos (multiplexado)
void multiplexDisplay() {
for (int digit = 0; digit < 4; digit++) {
digitalWrite(pinControl[digit], LOW); // Encender el dígito actual
displayNumber(currentNumber[digit]); // Mostrar el número correspondiente en el display
delay(2); // Pequeño retraso para el multiplexado
digitalWrite(pinControl[digit], HIGH); // Apagar el dígito actual
}
}
// Función para mostrar el número en los segmentos
void displayNumber(int num) {
for (int i = 0; i < 7; i++) {
digitalWrite(pinesSS[i], numToSegment[num][i]);
}
}