#include "LedControl.h" 		// incluye libreria LedControl

LedControl lc = LedControl(11, 13, 10, 2);	// crea objeto

const byte MENOS[8] = {				// array que contiene toDOS los elementos de las
  0b00000000,				// filas necesarias por mostrar el digito UNO
  0b00000000,
  0b00000000,
  0b00011111,
  0b00000000,
  0b00000000,
  0b00000000,
  0b00000000
};

const byte CERO[8] = {				// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito CERO
  0b01000010,
  0b01000010,
  0b01000010,
  0b01000010,
  0b01000010,
  0b01000010,
  0b00111100
};

const byte UNO[8] = {				// array que contiene toDOS los elementos de las
  0b00001000,				// filas necesarias por mostrar el digito UNO
  0b00011000,
  0b00001000,
  0b00001000,
  0b00001000,
  0b00001000,
  0b00001000,
  0b00011100
};

const byte DOS[8] = {				// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito DOS
  0b01000010,
  0b00000010,
  0b00000010,
  0b00111100,
  0b01000000,
  0b01000000,
  0b01111110
};

const byte TRES[8] = {				// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito TRES
  0b01000010,
  0b00000010,
  0b00011100,
  0b00000010,
  0b00000010,
  0b01000010,
  0b00111100
};

const byte CUATRO[8] = {			// array que contiene toDOS los elementos de las
  0b00000100,				// filas necesarias por mostrar el digito CUATRO
  0b00001100,
  0b00010100,
  0b00100100,
  0b01000100,
  0b01111110,
  0b00000100,
  0b00000100
};

const byte CINCO[8] = {			// array que contiene toDOS los elementos de las
  0b01111110,				// filas necesarias por mostrar el digito CINCO
  0b01000000,
  0b01000000,
  0b01111100,
  0b00000010,
  0b00000010,
  0b01000010,
  0b00111100
};

const byte SEIS[8] = {				// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito SEIS
  0b01000000,
  0b01000000,
  0b01111100,
  0b01000010,
  0b01000010,
  0b01000010,
  0b00111100
};

const byte SIETE[8] = {			// array que contiene toDOS los elementos de las
  0b01111110,				// filas necesarias por mostrar el digito SIETE
  0b00000010,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00010000,
  0b00010000
};

const byte OCHO[8] = {				// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito OCHO
  0b01000010,
  0b01000010,
  0b00111100,
  0b01000010,
  0b01000010,
  0b01000010,
  0b00111100
};

const byte NUEVE[8] = {			// array que contiene toDOS los elementos de las
  0b00111100,				// filas necesarias por mostrar el digito NUEVE
  0b01000010,
  0b01000010,
  0b01000010,
  0b00111110,
  0b00000010,
  0b00000010,
  0b00111100
};

const byte VACIO[8] = { // array que contiene toDOS los elementos de las
  0, 0, 0, 0, 0, 0, 0, 0
};

const byte LETRAP[8] = { // array que contiene toDOS los elementos de las
  0b01111100,
  0b01000010,
  0b01000010,
  0b01000010,
  0b01111100,
  0b01000000,
  0b01000000,
  0b01000000
};

const byte LETRAB[8] = { // array que contiene toDOS los elementos de las
  0b01111100,
  0b01000010,
  0b01000010,
  0b01111100,
  0b01000010,
  0b01000010,
  0b01000010,
  0b01111100
};

/*struct pp_t {
  byte *ptr1[2];
  //  byte *ptr2;
  };
  pp_t digits[16][2] = {{LETRAP, LETRAB}, {VACIO, UNO}, {VACIO, DOS}, {VACIO, TRES}, {VACIO, CUATRO}, {VACIO, CINCO}, {VACIO, SEIS}, {VACIO, SIETE},
  {VACIO, OCHO}, {VACIO, NUEVE}, {UNO, CERO}, {UNO, UNO}, {UNO, DOS}, {UNO, TRES}, {UNO, CUATRO}, {MENOS, UNO}
  };*/

byte *digits[16][2] = {{LETRAP, LETRAB}, {VACIO, UNO}, {VACIO, DOS}, {VACIO, TRES}, {VACIO, CUATRO}, {VACIO, CINCO}, {VACIO, SEIS}, {VACIO, SIETE},
  {VACIO, OCHO}, {VACIO, NUEVE}, {UNO, CERO}, {UNO, UNO}, {UNO, DOS}, {UNO, TRES}, {UNO, CUATRO}, {MENOS, UNO}
};

const byte A651 = 2;
const byte B652 = 3;
const byte C653 = 4;
const byte D654 = 5;
const byte MASCARA = 0b00111100;
byte anterior = 255;

void setup() {
  //Matriz 1
  lc.shutdown(0, false);	// enciende la matriz
  lc.setIntensity(0, 4);	// establece brillo
  lc.clearDisplay(0);
  //Matriz 2
  lc.shutdown(1, false);
  lc.setIntensity(1, 4);
  lc.clearDisplay(1);
  //Estos pines es de las 4 entradas binarias
  pinMode (A651, INPUT_PULLUP);
  pinMode (B652, INPUT_PULLUP);
  pinMode (C653, INPUT_PULLUP);
  pinMode (D654, INPUT_PULLUP);
}

void loop() {
  byte entradas = (PIND & MASCARA) >> 2;
  if (entradas != anterior) {
    delay(50);
    anterior = entradas;
    for (byte i = 0; i < 8; i++) {
      for (byte j = 0; j < 2; j++) {
        //lc.setRow(1 - j, i, *(*(*(digits + entradas) + j) + i));
        lc.setRow(1 - j, i, digits[entradas][j][i]);
      }
    }
  }
  delay(50);
}