#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte filas[4] = {5, 4, 3, 2};
byte columnas[4] = {9, 8, 7, 6};
char teclas[4][4] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '*'},
{'7', '8', '9', 'C'},
{'0', '=', 'X', ' '}
};
Keypad keypad = Keypad(makeKeymap(teclas), columnas, filas, 4, 4);
long int num1 = 0;
long int num2 = 0;
char operacion = ' ';
bool operacionListo = false;
void updateCursor() {
if (millis() / 250 % 2 == 0 ) {
lcd.cursor();
} else {
lcd.noCursor();
}
}
void setup() {
lcd.init();
lcd.backlight();
}
void mostrarOperacion() {
lcd.clear();
lcd.print(num1);
lcd.print(operacion);
if(operacionListo && num2 > 0){
lcd.print(num2);
}
}
void mostrarResultado(long int resultado) {
if(resultado >= 0 && resultado <=9){
lcd.setCursor (15,1);
}
if(resultado >= 10 && resultado <=99){
lcd.setCursor (14,1);
}
if(resultado >= 100 && resultado <=999){
lcd.setCursor (13,1);
}
if(resultado >= 1000 && resultado <=9999){
lcd.setCursor (12,1);
}
if(resultado >= 10000 && resultado <=99999){
lcd.setCursor (11,1);
}
if(resultado >= 100000 && resultado <=999999){
lcd.setCursor (10,1);
}
if(resultado >= 1000000 && resultado <=9999999){
lcd.setCursor (9,1);
}
if(resultado >= 10000000 && resultado <=99999999){
lcd.setCursor (8,1);
}
if(resultado >= 100000000 && resultado <=999999999){
lcd.setCursor (7,1);
}
lcd.print(resultado);
}
void loop() {
updateCursor();
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
if (!operacionListo) {
num1 = num1 * 10 + (key - '0');
} else {
num2 = num2 * 10 + (key - '0');
}
mostrarOperacion();
} else if (key == 'C') {
num1 = num2 = 0;
operacion = ' ';
operacionListo = false;
lcd.clear();
lcd.print("Borrado");
delay(1000);
lcd.clear();
} else if (key == '+' || key == '*') {
operacion = key;
operacionListo = true;
mostrarOperacion();
} else if (key == '=') {
float resultado = 0;
if (operacion == '+') {
resultado = num1 + num2;
} else if (operacion == '*') {
resultado = num1 * num2;
}
mostrarResultado(resultado);
delay(2500);
num1 = resultado;
num2 = 0;
operacionListo = false;
operacion = ' ';
mostrarOperacion();
}
}
}