#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inicialización del teclado matricial
const byte ROWS = 4; // Definición del número de filas del teclado
const byte COLS = 4; // Definición del número de columnas del teclado
char keys[ROWS][COLS] = { // Definición de la disposición de las teclas en el teclado
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Asignación de los pines a las filas del teclado
byte colPins[COLS] = {5, 4, 3, 2}; // Asignación de los pines a las columnas del teclado
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); // Inicialización del teclado
// Inicialización del LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicialización del LCD con dirección I2C, 16 columnas y 2 filas
String binaryInput1 = ""; // Variable para almacenar la primera entrada binaria
String binaryInput2 = ""; // Variable para almacenar la segunda entrada binaria
bool input1Complete = false; // Variable para indicar si se completó la primera entrada
bool input2Complete = false; // Variable para indicar si se completó la segunda entrada
void setup() {
// Inicialización del LCD
lcd.init(); // Inicializa el LCD
lcd.backlight(); // Enciende la luz de fondo del LCD
// Mensaje inicial
lcd.setCursor(0, 0); // Establece el cursor en la primera fila y primera columna
lcd.print(" Multiplicacion"); // Imprime el mensaje "Multiplicación" en la primera fila
lcd.setCursor(0, 1); // Establece el cursor en la segunda fila y primera columna
lcd.print(" Binaria"); // Imprime el mensaje "Binaria" en la segunda fila
delay(4000); // Espera 4 segundos antes de continuar
lcd.clear(); // Borra el contenido del LCD
lcd.setCursor(0, 0); // Establece el cursor en la primera fila y primera columna
lcd.print("Ingrese no. 1:"); // Imprime el mensaje "Ingrese no. 1:" en la primera fila
}
void loop() {
char key = keypad.getKey(); // Lee la tecla presionada
if (key != NO_KEY) { // Si se ha presionado una tecla
// Si se presiona un número o #
if ((key >= '0' && key <= '1') || key == '#' || key == '9') {
// Si la tecla presionada es un número binario, # o 9 (para punto flotante)
if (key == '#') {
// Si se presiona #
if (!input1Complete) {
// Si es la primera entrada
input1Complete = true; // Marca la primera entrada como completada
lcd.clear(); // Borra el contenido del LCD
lcd.setCursor(0, 0); // Establece el cursor en la primera fila y primera columna
lcd.print("Ingrese no. 2:"); // Imprime el mensaje "Ingrese no. 2:" en la primera fila
} else if (!input2Complete) {
// Si es la segunda entrada
input2Complete = true; // Marca la segunda entrada como completada
// Convertir binario a decimal
float decimalValue1 = binToDec(binaryInput1); // Convierte la primera entrada binaria a decimal
float decimalValue2 = binToDec(binaryInput2); // Convierte la segunda entrada binaria a decimal
// Calcular el producto de los números decimales
float product = decimalValue1 * decimalValue2; // Calcula el producto de los dos números decimales
// Mostrar el producto en el LCD con tres decimales
lcd.clear(); // Borra el contenido del LCD
lcd.setCursor(0, 0); // Establece el cursor en la primera fila y primera columna
lcd.print("Dec:"); // Imprime el mensaje "Dec:" en la primera fila
lcd.setCursor(4, 0); // Establece el cursor en la primera fila y quinta columna
lcd.print(product,4); // Imprime el producto con cuatro decimales
lcd.setCursor(0, 1); // Establece el cursor en la segunda fila y primera columna
lcd.print("Bin:"); // Imprime el mensaje "Bin:" en la segunda fila
lcd.setCursor(4, 1); // Establece el cursor en la segunda fila y quinta columna
lcd.print(decToBin(product)); // Imprime el producto convertido a binario
// Esperar 15 segundos antes de reiniciar
delay(15000);
// Limpiar y reiniciar para la próxima entrada
lcd.clear(); // Borra el contenido del LCD
lcd.setCursor(0, 0); // Establece el cursor en la primera fila y primera columna
lcd.print("Ingrese no. 1:"); // Imprime el mensaje "Ingrese no. 1:" en la primera fila
binaryInput1 = ""; // Reinicia la variable de la primera entrada binaria
binaryInput2 = ""; // Reinicia la variable de la segunda entrada binaria
input1Complete = false; // Reinicia el estado de la primera entrada como no completada
input2Complete = false; // Reinicia el estado de la segunda entrada como no completada
}
} else if (key == '9') {
// Si se presiona 9 (punto flotante)
if (!input1Complete) {
// Si es la primera entrada
if (binaryInput1.indexOf('.') == -1) {
// Asegurarse de que solo se permita un punto decimal
binaryInput1 += '.'; // Agrega un punto decimal a la primera entrada binaria
lcd.setCursor(binaryInput1.length() - 1, 1); // Establece el cursor en la segunda fila y la última posición de la primera entrada binaria
lcd.print('.'); // Imprime el punto decimal en el LCD
}
} else if (!input2Complete) {
// Si es la segunda entrada
if (binaryInput2.indexOf('.') == -1) {
// Asegurarse de que solo se permita un punto decimal
binaryInput2 += '.'; // Agrega un punto decimal a la segunda entrada binaria
lcd.setCursor(binaryInput2.length() - 1, 1); // Establece el cursor en la segunda fila y la última posición de la segunda entrada binaria
lcd.print('.'); // Imprime el punto decimal en el LCD
}
}
} else {
// Si se presiona un número binario, agregarlo a la entrada correspondiente
if (!input1Complete) {
// Si es la primera entrada
if (binaryInput1.length() < 16) {
binaryInput1 += key; // Agrega el número binario a la primera entrada
lcd.setCursor(binaryInput1.length() - 1, 1); // Establece el cursor en la segunda fila y la última posición de la primera entrada binaria
lcd.print(key); // Imprime el número binario en el LCD
}
} else if (!input2Complete) {
// Si es la segunda entrada
if (binaryInput2.length() < 16) {
binaryInput2 += key; // Agrega el número binario a la segunda entrada
lcd.setCursor(binaryInput2.length() - 1, 1); // Establece el cursor en la segunda fila y la última posición de la segunda entrada binaria
lcd.print(key); // Imprime el número binario en el LCD
}
}
}
}
}
}
float binToDec(String binary) {
float decimalValue = 0.0; // Inicializa el valor decimal como 0.0
int pointIndex = binary.indexOf('.'); // Busca la posición del punto decimal en la cadena binaria
if (pointIndex == -1) {
// Sin parte decimal
for (int i = 0; i < binary.length(); i++) {
decimalValue = decimalValue * 2 + (binary[i] - '0'); // Convierte el número binario a decimal
}
} else {
// Con parte decimal
for (int i = 0; i < pointIndex; i++) {
decimalValue = decimalValue * 2 + (binary[i] - '0'); // Convierte la parte entera del número binario a decimal
}
float fraction = 0.0; // Inicializa la parte fraccionaria como 0.0
float divider = 2.0; // Inicializa el divisor como 2.0
for (int i = pointIndex + 1; i < binary.length(); i++) {
fraction += (binary[i] - '0') / divider; // Convierte la parte fraccionaria del número binario a decimal
divider *= 2.0; // Incrementa el divisor
}
decimalValue += fraction; // Suma la parte fraccionaria al valor decimal
}
return decimalValue; // Devuelve el valor decimal calculado
}
String decToBin(float decimal) {
String binary = ""; // Inicializa la cadena binaria como vacía
int intPart = int(decimal); // Obtiene la parte entera del número decimal
float fractionalPart = decimal - intPart; // Obtiene la parte fraccionaria del número decimal
// Convertir la parte entera a binario
while (intPart > 0) {
binary = String(intPart % 2) + binary; // Convierte el dígito de la parte entera a binario y lo agrega a la cadena binaria
intPart /= 2; // Divide la parte entera por 2 para continuar con el siguiente dígito
}
// Agregar el punto decimal si es necesario
if (fractionalPart > 0) {
binary += '.'; // Agrega un punto decimal a la cadena binaria
}
// Convertir la parte fraccionaria a binario
while (fractionalPart > 0) {
fractionalPart *= 2; // Multiplica la parte fraccionaria por 2 para obtener el siguiente dígito binario
int bit = int(fractionalPart); // Obtiene el dígito binario
binary += String(bit); // Agrega el dígito binario a la cadena binaria
fractionalPart -= bit; // Resta el dígito binario de la parte fraccionaria para continuar con el siguiente dígito
}
return binary; // Devuelve la cadena binaria convertida
}