//En caso de no funcinar correctamente, sugiero cambiar los pines 
//de la LDC, pines de filas, columnas y el Keypad 4x4 a otros
//Ejemplo(para reemplazar)
//LiquidCrystal lcd (13,12,14,27,26,25);

#include <LiquidCrystal.h>
#include <Keypad.h>
////////////////////////
LiquidCrystal lcd(22,23,5,18,19,21);
const byte COLUMNAS = 4;
const byte FILAS = 4;
char teclas [FILAS] [COLUMNAS] = {
  {'1','4','7','X'},
  {'2','5','8','0'},
  {'3','6','9','='},
  {'+','-','*','/'}
  };
byte filasPines[FILAS] = {2,15,13,12}; //Definicion de lineas
byte columnasPines[COLUMNAS] = {17,16,4,0}; //Definicion de lineas
Keypad miTeclado = Keypad( makeKeymap(teclas), filasPines, columnasPines, FILAS, COLUMNAS);
boolean valorActual = false;
boolean siguiente = false;
boolean final = false;
String numero1, numero2, numero3;
int calculoTotal;
int movimiento;
char operacion;
float r1, r2, r3, r4;
float decimal;
int contador = 0;
//Cada que se inicie el Arduino se volvera a ejecutar la funcion setup

void setup(){
  lcd.begin(16,2);
  lcd.setCursor(3,0);
  lcd.print("CALCULADORA");
  lcd.setCursor(1,1);
  lcd.print("OP. BASICAS JC");
  delay(2500);

  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("SUMA, RESTA");
  lcd.setCursor(1,1);
  lcd.print("MULTI Y DIV"); 
  delay(2500);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(">");
}

//bucle
void loop()
{
char tecla = miTeclado.getKey();
int longitudDelNumero;

//Verificacion de una tecla presionada
if(tecla != NO_KEY && (tecla=='1'|| tecla=='2'|| 
tecla=='3'|| tecla=='4'|| tecla=='5'|| tecla=='6'|| 
tecla=='7' || tecla=='8'|| tecla=='9'|| tecla=='0'))
{
  //Variables
  if(contador == 1){
    lcd.clear();
    valorActual = false;
    final = false;
    numero1 ="";
    numero2 ="";
    calculoTotal = 0;
    operacion = ' ';
    lcd.setCursor(0,0);
    lcd.print(">");
    contador=0;
  }
if(valorActual != true){
        numero1 = numero1 + tecla;
        longitudDelNumero = numero1.length();
        movimiento = longitudDelNumero;
        lcd.setCursor(1,0);
        lcd.print(numero1);
        }else{
          numero2 = numero2 + tecla;
          longitudDelNumero = numero2.length();
          lcd.setCursor(movimiento+2, 0);
          lcd.print(numero2);
          final = true;
        }
}else if((tecla == '+' || tecla == '-' || tecla=='*' 
|| tecla=='/') && valorActual == false && tecla != NO_KEY)
  {
    if(valorActual == false){
      valorActual = true;
      operacion = tecla;
      lcd.setCursor(movimiento+1,0);
      lcd.print(operacion);
    } 
  } else if (final == true && tecla != NO_KEY && tecla == '=')
  {
    //Seleccion de operaciones
    switch(operacion){
      case '+':
      //SUMA
      calculoTotal = numero1.toInt() + numero2.toInt();
      break;

      case '-':
      //RESTA
      calculoTotal = numero1.toInt() - numero2.toInt();
      break;

      case '*':
      //MULTIPLICACION
      calculoTotal = numero1.toInt() * numero2.toInt();
      break;

      case '/':
      //DIVISION
      if(numero2.toInt()==0){
      calculoTotal = 'E';
      }else
           {
            calculoTotal = (numero1.toInt())/ (numero2.toInt());
            r1=numero1.toInt();
            r2=numero2.toInt();
            decimal= r1/r2;
           }
    break;
    default:
    //si nada coincide se elige esta opcion
    break;
  }
  numero3=String(calculoTotal);
  lcd.clear();
  lcd.setCursor(15,0);
  //lcd.autoscroll();
  if(calculoTotal=='E'){
    lcd.print("Err. de Sintaxis");
  }else if(numero3.length()>5){
          lcd.print("*Sin Memoria");
          }else{
            if(operacion == '/') {lcd.print(decimal,2);}
            else{
              lcd.setCursor(0,0);
              lcd.print(numero1);
              lcd.setCursor(movimiento,0);
              lcd.print(operacion);
              lcd.setCursor(movimiento+1,0);
              lcd.print(numero2);
              lcd.setCursor(0,1);
              lcd.print("=");
              lcd.setCursor(1,1);
              lcd.print(calculoTotal);};
      contador=1;
          }
lcd.noAutoscroll();
}else if(tecla== 'X' && tecla != NO_KEY){

  lcd.clear();
  valorActual = false;
  final = false;
  numero1 = "";
  numero2 = "";
  calculoTotal = 0;
  operacion = ' ';
  lcd.setCursor(0,0);
  lcd.print(">");
  }
}