#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Keypad.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicializa el LCD const int Up_Down_Buttons[2] = {12, 13}; int select = 0; // Definir el teclado matricial const byte Filas = 4; // cantidad de filas const byte Columnas = 4; // cantidad de columnas char Teclas_Matriz[Filas][Columnas] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte Rows_Pins[Filas] = {9, 8, 7, 6}; // Declaro un arreglo de bytes byte Columns_Pins[Columnas] = {5, 4, 3, 2}; // son los números de los pines que están conectados al teclado Keypad Matrix_Keypad = Keypad(makeKeymap(Teclas_Matriz), Rows_Pins, Columns_Pins, Filas, Columnas); // Matrices para almacenar los datos ingresados int matrizA[4][4]; int matrizB[4][4]; int matrizResultado[4][4]; // Tamaños de las matrices int filasA, columnasA, filasB, columnasB; void setup() { Serial.begin(9600); // Inicializar comunicación serial for (int i = 0; i < 2; i++) { pinMode(Up_Down_Buttons[i], INPUT); digitalWrite(Up_Down_Buttons[i], HIGH); // Configura pines de botones como entradas y activa pull-up. } lcd.init(); lcd.backlight(); // se asegura que la pantalla LCD prenda Menu(); // mostramos nuestro menú creado } void loop() { if (digitalRead(Up_Down_Buttons[0]) == LOW) { // verifica si el pulsador 1 está siendo presionado delay(50); if (digitalRead(Up_Down_Buttons[0]) == LOW) { select++; if (select >= 5) { // esto me asegura 5 opciones select = 0; // se vuelve a inicializar desde 0 para que se repitan las opciones } Menu(); // mantiene actualizado la pantalla } } if (digitalRead(Up_Down_Buttons[1]) == LOW) { // verifica si el pulsador 2 está siendo presionado switch (select) { case 0: // primera opcion (suma) realizarOperacion('+'); // usamos la funcion creada break; case 1: // segunda opcion (resta) realizarOperacion('-'); break; case 2: realizarOperacion('*'); // tercera opcion (multiplicacion) break; case 3: realizarOperacion('/'); // cuarta opcion (division) break; case 4: realizarTranspuesta(); // quinta opcion (transposicion) break; } } } void Menu() { // creando mi propio menu de 5 opciones lcd.clear(); lcd.setCursor(0, 0); lcd.print("Menu:"); switch (select) { case 0: // primera opcion (suma) lcd.setCursor(0, 1); lcd.print(" Suma"); break; case 1: // segunda opcion (resta) lcd.setCursor(0, 1); lcd.print(" Resta"); break; case 2: lcd.setCursor(0, 1); // tercera opcion (multiplicacion) lcd.print(" Multiplicación"); break; case 3: lcd.setCursor(0, 1); lcd.print(" División"); // cuarta opcion (division) break; case 4: lcd.setCursor(0, 1);// quinta opcion (transposicion) lcd.print(" Transposición"); break; } } void realizarOperacion(char operacion) { // obtener la dimensión de la matriz A lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas A:"); // le pedimos al usuario la cantidad de filas filasA = LeerNumero(); // lee el numero ingresado por el usuario y lo almacena en la variable lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas A:"); // le pedimos al usuario la cantidad de columnas columnasA = LeerNumero(); // Obtener la dimensión de la matriz B lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas B:"); filasB = LeerNumero(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas B:"); columnasB = LeerNumero(); // Verificar si las matrices son compatibles para la operación if (operacion == '+' || operacion == '-') { // esta condicion solo se aplica en la suma y resta if (filasA != filasB || columnasA != columnasB) { // la condicion se cumple si las matrices son de diferente orden lcd.setCursor(0, 0); lcd.print("incompatibles"); delay(2000); Menu(); return; } } else if (operacion == '*') { // se cumple si es multiplicacion if (columnasA != filasB) { // verifica si las matrices se pueden operar lcd.clear(); lcd.setCursor(0, 0); lcd.print("incompatibles"); delay(2000); Menu(); return; } } // Ingresar los datos de la matriz A lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz A:"); ingresarMatriz(matrizA, filasA, columnasA); // esta funcion sirve para ingresar los datos de la matriz A // Ingresar los datos de la matriz B lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz B:"); ingresarMatriz(matrizB, filasB, columnasB); // Realizar la operación seleccionada switch (operacion) { case '+': // si operacion es igual suma se ejecuta el primer caso // Sumar dos matrices y almacenar el resultado en matrizResultado for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { matrizResultado[i][j] = matrizA[i][j] + matrizB[i][j]; } } // mostrar matrix for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '-': // si operacion es igual a resta se ejecuta el segundo caso //restarMatrices(matrizA, matrizB, matrizResultado); for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { matrizResultado[i][j] = matrizA[i][j] - matrizB[i][j]; } } // mostrar matrix for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '*': // si operacion es igual a multiplicacion se ejecuta el tercer caso //multiplicarMatrices(matrizA, matrizB, matrizResultado); for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasB; j++) { for (int k = 0; k < columnasA; k++) { matrizResultado[i][j] += matrizA[i][k] * matrizB[k][j]; } } } // mostrar resultado for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasB; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '/': // si operacion es igual a division se ejecuta el cuato caso // Aquí podrías implementar la división si lo deseas break; } // Mostrar el resultado en el LCD mostrarMatriz(matrizResultado, filasA, columnasB); } void realizarTranspuesta() { // Obtener el tamaño de la matriz lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas:"); filasA = LeerNumero(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas:"); columnasA = LeerNumero(); // Ingresar los datos de la matriz lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz:"); ingresarMatriz(matrizA, filasA, columnasA); // Realizar la transposición transponerMatriz(matrizA, matrizResultado); // Mostrar el resultado en el LCD mostrarMatriz(matrizResultado, columnasA, filasA); } void ingresarMatriz(int matriz[4][4], int filas, int columnas) { // Función para ingresar los datos de la matriz for (int i = 0; i < filas; i++) { for (int j = 0; j < columnas; j++) { matriz[i][j] = LeerNumero(); // Lee un número para cada elemento de la matriz } } } void mostrarMatriz(int matriz[4][4], int filas, int columnas) { // Mostrar una matriz en el LCD lcd.clear(); for (int i = 0; i < filas; i++) { for (int j = 0; j < columnas; j++) { lcd.setCursor(j * 4, i); lcd.print(matriz[i][j]); lcd.print(" "); } } } int LeerNumero() { // que se usará para almacenar el número ingresado por el usuario. int Numero = 0; char Tecla = NO_KEY; // que se usará para almacenar el número ingresado por el usuario. while (Tecla == NO_KEY || (Tecla < '0' || Tecla > '9')) { // se ejecuta mientras no se haya presionado ninguna tecla Tecla = Matrix_Keypad.getKey(); // devuelve la tecla presionada en el teclado matricial. } while (Tecla != '#') { // se ejecuta mientras la tecla presionada no sea '#'. if (Tecla >= '0' && Tecla <= '9') { // Si es un dígito válido, se actualiza el valor de Numero multiplicándolo por 10 y sumándole el valor del dígito presionado. Numero = Numero * 10 + (Tecla - '0'); lcd.setCursor(0, 1); lcd.print(Numero); } // Se actualiza la variable Tecla con la próxima tecla presionada para continuar con el bucle. Tecla = Matrix_Keypad.getKey(); } return Numero; }
function that: add two numbers together ```python def add(a, b): return a + b add(1, 2) ``` function that: #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Keypad.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // Inicializa el LCD const int Up_Down_Buttons[2] = {12, 13}; int select = 0; // Definir el teclado matricial const byte Filas = 4; // cantidad de filas const byte Columnas = 4; // cantidad de columnas char Teclas_Matriz[Filas][Columnas] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte Rows_Pins[Filas] = {9, 8, 7, 6}; // Declaro un arreglo de bytes byte Columns_Pins[Columnas] = {5, 4, 3, 2}; // son los números de los pines que están conectados al teclado Keypad Matrix_Keypad = Keypad(makeKeymap(Teclas_Matriz), Rows_Pins, Columns_Pins, Filas, Columnas); // Matrices para almacenar los datos ingresados int matrizA[4][4]; int matrizB[4][4]; int matrizResultado[4][4]; // Tamaños de las matrices int filasA, columnasA, filasB, columnasB; void setup() { Serial.begin(9600); // Inicializar comunicación serial for (int i = 0; i < 2; i++) { pinMode(Up_Down_Buttons[i], INPUT); digitalWrite(Up_Down_Buttons[i], HIGH); // Configura pines de botones como entradas y activa pull-up. } lcd.init(); lcd.backlight(); // se asegura que la pantalla LCD prenda Menu(); // mostramos nuestro menú creado } void loop() { if (digitalRead(Up_Down_Buttons[0]) == LOW) { // verifica si el pulsador 1 está siendo presionado delay(50); if (digitalRead(Up_Down_Buttons[0]) == LOW) { select++; if (select >= 5) { // esto me asegura 5 opciones select = 0; // se vuelve a inicializar desde 0 para que se repitan las opciones } Menu(); // mantiene actualizado la pantalla } } if (digitalRead(Up_Down_Buttons[1]) == LOW) { // verifica si el pulsador 2 está siendo presionado switch (select) { case 0: // primera opcion (suma) realizarOperacion('+'); // usamos la funcion creada break; case 1: // segunda opcion (resta) realizarOperacion('-'); break; case 2: realizarOperacion('*'); // tercera opcion (multiplicacion) break; case 3: realizarOperacion('/'); // cuarta opcion (division) break; case 4: realizarTranspuesta(); // quinta opcion (transposicion) break; } } } void Menu() { // creando mi propio menu de 5 opciones lcd.clear(); lcd.setCursor(0, 0); lcd.print("Menu:"); switch (select) { case 0: // primera opcion (suma) lcd.setCursor(0, 1); lcd.print(" Suma"); break; case 1: // segunda opcion (resta) lcd.setCursor(0, 1); lcd.print(" Resta"); break; case 2: lcd.setCursor(0, 1); // tercera opcion (multiplicacion) lcd.print(" Multiplicación"); break; case 3: lcd.setCursor(0, 1); lcd.print(" División"); // cuarta opcion (division) break; case 4: lcd.setCursor(0, 1);// quinta opcion (transposicion) lcd.print(" Transposición"); break; } } void realizarOperacion(char operacion) { // obtener la dimensión de la matriz A lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas A:"); // le pedimos al usuario la cantidad de filas filasA = LeerNumero(); // lee el numero ingresado por el usuario y lo almacena en la variable lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas A:"); // le pedimos al usuario la cantidad de columnas columnasA = LeerNumero(); // Obtener la dimensión de la matriz B lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas B:"); filasB = LeerNumero(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas B:"); columnasB = LeerNumero(); // Verificar si las matrices son compatibles para la operación if (operacion == '+' || operacion == '-') { // esta condicion solo se aplica en la suma y resta if (filasA != filasB || columnasA != columnasB) { // la condicion se cumple si las matrices son de diferente orden lcd.setCursor(0, 0); lcd.print("incompatibles"); delay(2000); Menu(); return; } } else if (operacion == '*') { // se cumple si es multiplicacion if (columnasA != filasB) { // verifica si las matrices se pueden operar lcd.clear(); lcd.setCursor(0, 0); lcd.print("incompatibles"); delay(2000); Menu(); return; } } // Ingresar los datos de la matriz A lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz A:"); ingresarMatriz(matrizA, filasA, columnasA); // esta funcion sirve para ingresar los datos de la matriz A // Ingresar los datos de la matriz B lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz B:"); ingresarMatriz(matrizB, filasB, columnasB); // Realizar la operación seleccionada switch (operacion) { case '+': // si operacion es igual suma se ejecuta el primer caso // Sumar dos matrices y almacenar el resultado en matrizResultado for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { matrizResultado[i][j] = matrizA[i][j] + matrizB[i][j]; } } // mostrar matrix for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '-': // si operacion es igual a resta se ejecuta el segundo caso //restarMatrices(matrizA, matrizB, matrizResultado); for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { matrizResultado[i][j] = matrizA[i][j] - matrizB[i][j]; } } // mostrar matrix for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasA; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '*': // si operacion es igual a multiplicacion se ejecuta el tercer caso //multiplicarMatrices(matrizA, matrizB, matrizResultado); for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasB; j++) { for (int k = 0; k < columnasA; k++) { matrizResultado[i][j] += matrizA[i][k] * matrizB[k][j]; } } } // mostrar resultado for (int i = 0; i < filasA; i++) { for (int j = 0; j < columnasB; j++) { lcd.print(matrizResultado[i][j]); lcd.print("\t"); } delay(2000); lcd.clear(); } break; case '/': // si operacion es igual a division se ejecuta el cuato caso // Aquí podrías implementar la división si lo deseas break; } // Mostrar el resultado en el LCD mostrarMatriz(matrizResultado, filasA, columnasB); } void realizarTranspuesta() { // Obtener el tamaño de la matriz lcd.clear(); lcd.setCursor(0, 0); lcd.print("Filas:"); filasA = LeerNumero(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Columnas:"); columnasA = LeerNumero(); // Ingresar los datos de la matriz lcd.clear(); lcd.setCursor(0, 0); lcd.print("Matriz:"); ingresarMatriz(matrizA, filasA, columnasA); // Realizar la transposición transponerMatriz(matrizA, matrizResultado); // Mostrar el resultado en el LCD mostrarMatriz(matrizResultado, columnasA, filasA); } void ingresarMatriz(int matriz[4][4], int filas, int columnas) { // Función para ingresar los datos de la matriz for (int i = 0; i < filas; i++) { for (int j = 0; j < columnas; j++) { matriz[i][j] = LeerNumero(); // Lee un número para cada elemento de la matriz } } } void mostrarMatriz(int matriz[4][4], int filas, int columnas) { // Mostrar una matriz en el LCD lcd.clear(); for (int i = 0; i < filas; i++) { for (int j = 0; j < columnas; j++) { lcd.setCursor(j * 4, i); lcd.print(matriz[i][j]); lcd.print(" "); } } } int LeerNumero() { // que se usará para almacenar el número ingresado por el usuario. int Numero = 0; char Tecla = NO_KEY; // que se usará para almacenar el número ingresado por el usuario. while (Tecla == NO_KEY || (Tecla < '0' || Tecla > '9')) { // se ejecuta mientras no se haya presionado ninguna tecla Tecla = Matrix_Keypad.getKey(); // devuelve la tecla presionada en el teclado matricial. } while (Tecla != '#') { // se ejecuta mientras la tecla presionada no sea '#'. if (Tecla >= '0' && Tecla <= '9') { // Si es un dígito válido, se actualiza el valor de Numero multiplicándolo por 10 y sumándole el valor del dígito presionado. Numero = Numero * 10 + (Tecla - '0'); lcd.setCursor(0, 1); lcd.print(Numero); } // Se actualiza la variable Tecla con la próxima tecla presionada para continuar con el bucle. Tecla = Matrix_Keypad.getKey(); } return Numero; } ```C++