#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]);
  }
}