Problema con calculadora

Hola les comento, necesito hacer una calculadora con arduino que contenga un teclado matricial 4x4 y un display de 8bit el modelo es el 3641ah. Ya "hice" el programa pero obviamente contiene errores y necesito que me ayuden a resolverlo. Cuando ingreso un numero con el teclado por ejemplo 5, en el monitor serie aparece como 5 pero en el display me aparece 53 y lo que tambien sucede es que no puedo poner mas de un digito por ejemplo no puedo hacer 53+53
Por favor ayudenmen Gracias
les dejo el codigo

#include <Keypad.h>
#include <LedControl.h>

LedControl lc=LedControl(12,11,10,1);
const byte Filas = 4; //KeyPad de 4 filas
const byte Cols = 4; //y 4 columnas
byte Pins_Filas[] = {9,8,7,6}; //Pines Arduino para las filas.
byte Pins_Cols[] = {5,4,3,2}; // Pines Arduino para las columnas.

//char pulsacion;
//String PIN_Teclado = "";
long numeros ;

boolean inicio = false; 
boolean final = false; // variables de control

long num1, num2;
//long ans;
char op;


//char cadena[9];  //para poder hacer la conversion a número
 
char Teclas [Filas][Cols] = {
  {'1','2','3','+'},
  {'4','5','6','-'},
  {'7','8','9','x'},
  {'*','0','=','/'}
};
 
Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);


//CONFIGURACION PARA EL DATO SERIE//
void setup() 
  {
     // Inicializa el modulo
     lc.shutdown(0,false);
     // Ajuste del brillo del display
     lc.setIntensity(0,3);
     // Apaga el display
     lc.clearDisplay(0);
     Serial.begin(9600);
  }
void loop() 
  {
  char key = Teclado1.getKey();
    if (key != NO_KEY && (key=='1' || key=='2' || key=='3' || key=='4' || key=='5' || key=='6' || key=='7' || key=='8' || key=='9' || key=='0'))
  {
    if(inicio == true)
      {num1 = key;
      Serial.print(key);
   lc.setDigit(0,7,(byte)((num1 / 10000000) % 10),false);
   lc.setDigit(0,6,(byte)((num1 / 1000000) % 10),false);
   lc.setDigit(0,5,(byte)((num1 / 100000) % 10),false); 
   lc.setDigit(0,4,(byte)((num1 / 10000) % 10),false); 
   lc.setDigit(0,3,(byte)((num1 / 1000) % 10),false);
   lc.setDigit(0,2,(byte)((num1 / 100) % 10),false);
   lc.setDigit(0,1,(byte)((num1 / 10) % 10),false); 
   lc.setDigit(0,0,(byte)(num1 % 10),false); 
  }
     else
     {num2 =  key;
          Serial.print(num2);
   lc.setDigit(0,7,(byte)((num2 / 10000000) % 10),false);
   lc.setDigit(0,6,(byte)((num2 / 1000000) % 10),false);
   lc.setDigit(0,5,(byte)((num2 / 100000) % 10),false); 
   lc.setDigit(0,4,(byte)((num2 / 10000) % 10),false); 
   lc.setDigit(0,3,(byte)((num2 / 1000) % 10),false);
   lc.setDigit(0,2,(byte)((num2 / 100) % 10),false);
   lc.setDigit(0,1,(byte)((num2 / 10) % 10),false); 
   lc.setDigit(0,0,(byte)(num2 % 10),false); 
      final = true;
  }
}
if (inicio == false && key != NO_KEY && (key == '+' || key == '-' || key == 'x' || key == '/'))

{inicio = true;
 op = key;
 Serial.print (op); 

}
if (final == true && key !=NO_KEY && key == '=')
{
    if (op == '+')
    {numeros= num1 + num2;}
    if (op == '-')
    {numeros= num1 - num2;}
    if (op == 'x')
    {numeros= num1 * num2;}
    if (op == '/')
    {numeros= num1 / num2;}
    Serial.print("=");
    Serial.print(numeros);
   lc.setDigit(0,7,(byte)((numeros / 10000000) % 10),false);
   lc.setDigit(0,6,(byte)((numeros / 1000000) % 10),false);
   lc.setDigit(0,5,(byte)((numeros / 100000) % 10),false); 
   lc.setDigit(0,4,(byte)((numeros / 10000) % 10),false); 
   lc.setDigit(0,3,(byte)((numeros / 1000) % 10),false);
   lc.setDigit(0,2,(byte)((numeros / 100) % 10),false);
   lc.setDigit(0,1,(byte)((numeros / 10) % 10),false); 
   lc.setDigit(0,0,(byte)(numeros % 10),false); 
}
if(key !=NO_KEY && key == '*')
{
  inicio = false;
  final = false;
  num1 = "";
  num2 = "";
  numeros = 0;
  op = ' ';
}
 /*     pulsacion = Teclado1.getKey();
      switch (pulsacion) {
  case '*': // Punto decimal
    delay(30);
  case '0' ... '9': // o dígitos, 
    delay(30); 
    PIN_Teclado += pulsacion;
    break;
 case '#': // Lo tomaremos como enter para guardar el dato
   delay(30);   
   PIN_Teclado.toCharArray( cadena, 9);
   numeros = atof (cadena);
   Serial.println(numeros);
   lc.setDigit(0,7,(byte)((numeros / 10000000) % 10),false);
   lc.setDigit(0,6,(byte)((numeros / 1000000) % 10),false);
   lc.setDigit(0,5,(byte)((numeros / 100000) % 10),false); 
   lc.setDigit(0,4,(byte)((numeros / 10000) % 10),false); 
   lc.setDigit(0,3,(byte)((numeros / 1000) % 10),false);
   lc.setDigit(0,2,(byte)((numeros / 100) % 10),false);
   lc.setDigit(0,1,(byte)((numeros / 10) % 10),false); 
   lc.setDigit(0,0,(byte)(numeros % 10),false); 
   PIN_Teclado = "";  
   break;
  }*/


  }

Calculadora.ino (4.02 KB)

Te doy una pequeña ayuda.

53 es el numero que le corresponde al caracter 5 en codigo ASCII. Estas viendo lo mismo, solo que en formatos diferentes.

Hola, TheRealMatus bienvenido al foro Arduino.
Te he enviado un Privado con correcciones que espero hagas a tu posteo inicial.
Cambia el título y edita tmb ese código para que sea visible ya que tiene un tamaño que permite visualizarlo directamente.

Sin ver el código tu problema es que lees los caracteres del teclado matricial como ASCII como bien dice CAS6678.la
Se usa un truco simple que es quitarle '0' a lo que se lee de modo que si leyeras
'0' - '0' = 0 entero
'1' - '0' = 1 entero
'4' - '0' = 4 entero
'9' - '0' = 9 entero

en donde leas los datos del teclado restale '0' y tendras tu valor pero tambien asegúrate que la variable resultante sea del tipo esperable, o sea byte, int.

cas6678:
Te doy una pequeña ayuda.

53 es el numero que le corresponde al caracter 5 en codigo ASCII. Estas viendo lo mismo, solo que en formatos diferentes.

y como soluciono eso?

Prueba esto

#include <Keypad.h>
#include <LedControl.h>
 
LedControl lc = LedControl(12,11,10,1);
const byte Filas  = 4; //KeyPad de 4 filas
const byte Cols   = 4; //y 4 columnas
byte Pins_Filas[] = {9,8,7,6}; //Pines Arduino para las filas.
byte Pins_Cols[]  = {5,4,3,2}; // Pines Arduino para las columnas.

//char pulsacion;
//String PIN_Teclado = "";
long numeros ;

boolean inicio  = false; 
boolean final   = false; // variables de control

long num1, num2;
//long ans;
char op;


//char cadena[9];  //para poder hacer la conversion a número
 
char Teclas [Filas][Cols] = {
  {'1','2','3','+'},
  {'4','5','6','-'},
  {'7','8','9','x'},
  {'*','0','=','/'}
};
 
Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);


//CONFIGURACION PARA EL DATO SERIE//
void setup()   {
     // Inicializa el modulo
     lc.shutdown(0,false);
     // Ajuste del brillo del display
     lc.setIntensity(0,3);
     // Apaga el display
     lc.clearDisplay(0);
     Serial.begin(9600);
}

void loop()   {
  char key = Teclado1.getKey();
  if (key != NO_KEY && isDigit(key)) {
      if (inicio == true) {
          num1 = key - '0';
          Serial.print(key);
          muestroDigito(num1);
      }
      else {
          num2 =  key - '0';
          Serial.print(num2);
          muestroDigito(num2);
          final = true;
      }
  }
  if (inicio == false && key != NO_KEY && (key == '+' || key == '-' || key == 'x' || key == '/')) {
      inicio = true;
      op = key;
      Serial.print (op); 
  }
  if (final == true && key !=NO_KEY && key == '=') {
      if (op == '+') {
          numeros= num1 + num2;}
      if (op == '-')  {
          numeros= num1 - num2;}
      if (op == 'x') {
          numeros= num1 * num2;}
      if (op == '/') {
          numeros= num1 / num2;}
          Serial.print("=");
          Serial.print(numeros);
          muestroDigito(numeros);
      }
      if (key !=NO_KEY && key == '*') {
          inicio = false;
          final = false;
          num1 = "";
          num2 = "";
          numeros = 0;
          op = ' ';
      }
}

void muestroDigito(long num) {
    lc.setDigit(0,7,(byte)((num / 10000000) % 10),false);
    lc.setDigit(0,6,(byte)((num / 1000000) % 10),false);
    lc.setDigit(0,5,(byte)((num / 100000) % 10),false); 
    lc.setDigit(0,4,(byte)((num / 10000) % 10),false); 
    lc.setDigit(0,3,(byte)((num / 1000) % 10),false);
    lc.setDigit(0,2,(byte)((num / 100) % 10),false);
    lc.setDigit(0,1,(byte)((num / 10) % 10),false); 
    lc.setDigit(0,0,(byte)( num % 10),false);
}

Me sirvio pero tengo hecho asi tengo un problema que son dos

  1. no puedo poner mas de un digito por ejemplo si quiero hacer 11 + 11 no lo hace
  2. no puedo hacer mas de una operacion. Solo puedo hacer una

Yo no modifiqué nada de tu código, solo simplifiqué cosas y lo hice mas corto al quitar repeticiones.
Para digitar 2 o mas cifras debes tener una tecla que finalice el ingreso del número.
Supongamos que fuera '#' entonces presionas números supongamos 1234.
Pero tu ingresarás solo esos números 1 2 3 4 asi que ALGO debe ir dandole el peso decimal que corresponde.
La forma de hacerlo es simple

Te dejo un link con un ejemplo resuelto Calculator