#include <Keypad.h>
// Configuración del teclado
const byte ROWS = 4;
const byte COLS = 4;
char hexKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {18, 19, 21, 22};
byte colPins[COLS] = {23, 16, 17, 5};
Keypad customKeypad = Keypad(makeKeymap(hexKeys), rowPins, colPins, ROWS, COLS);
// Pines del display
int digitPins[] = {15, 2, 4, 5}; // D1, D2, D3, D4
int segmentPins[] = {13, 12, 14, 27, 26, 25, 33}; // A, B, C, D, E, F, G
// Patrones de segmentos (0-9, A-F, E, r, o)
const String digits[] = {
"1111110", "0110000", "1101101", "1111001", // 0-3
"0110011", "1011011", "1011111", "1110000", // 4-7
"1111111", "1111011", "1110111", "0011111", // 8-9, A-B
"1001110", "0111101", "1001111", "1000111", // C-E, F
"0000101", "0011101", "0000000" // r, o, espacio
};
// Variables de estado
char inputBuffer[2] = {' ', ' '};
char displayDigits[4] = {' ', ' ', ' ', ' '};
bool errorState = false;
int currentDigit = 0;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH);
}
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], LOW);
}
}
void loop() {
handleInput();
updateDisplay();
}
void handleInput() {
char key = customKeypad.getKey();
if (key) {
inputBuffer[1] = inputBuffer[0];
inputBuffer[0] = key;
if (isValidHex(inputBuffer[0]) && isValidHex(inputBuffer[1])) {
processInput();
}
}
}
bool isValidHex(char c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F');
}
int hexToDec(char c) {
if (c >= '0' && c <= '9') return c - '0';
return 10 + (c - 'A');
}
void processInput() {
int val1 = hexToDec(inputBuffer[0]);
int val2 = hexToDec(inputBuffer[1]);
if (val1 == val2) {
errorState = true;
strcpy(displayDigits, "Erro");
} else {
errorState = false;
int smaller = min(val1, val2);
int complement = 15 - smaller;
displayDigits[0] = inputBuffer[0];
displayDigits[1] = inputBuffer[1];
displayDigits[2] = (complement / 10) + '0';
displayDigits[3] = (complement % 10) + '0';
}
}
void updateDisplay() {
digitalWrite(digitPins[currentDigit], HIGH); // Apagar dígito actual
currentDigit = (currentDigit + 1) % 4;
if (errorState) {
showError();
return;
}
int charIndex = charToIndex(displayDigits[currentDigit]);
activateSegments(charIndex);
digitalWrite(digitPins[currentDigit], LOW); // Encender nuevo dígito
}
int charToIndex(char c) {
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'A' && c <= 'F') return 10 + (c - 'A');
if (c == 'E') return 14;
if (c == 'r') return 16;
if (c == 'o') return 17;
return 18; // Espacio
}
void activateSegments(int index) {
String pattern = digits[index];
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], pattern.charAt(i) == '1' ? HIGH : LOW);
}
}
void showError() {
for (int i = 0; i < 4; i++) {
digitalWrite(digitPins[i], LOW);
int index = charToIndex(displayDigits[i]);
activateSegments(index);
delay(2);
digitalWrite(digitPins[i], HIGH);
}
}