#include <LedControl.h>
#include <SoftwareSerial.h>

#define F_CPU 16500000L



byte Font5x5[] = {
	0x04, 0x2E, 0x55, 0x64, 0x84,  // 0x00 arrow up
	0x04, 0x24, 0x55, 0x6E, 0x84,  // 0x01 arrow down
	0x04, 0x22, 0x5F, 0x62, 0x84,  // 0x02 arrow right
	0x04, 0x28, 0x5F, 0x68, 0x84,  // 0x03 arrow left
	0x04, 0x2E, 0x5F, 0x6E, 0x8E,  // 0x04 fat arrow up
	0x0E, 0x2E, 0x5F, 0x6E, 0x84,  // 0x05 fat arrow down
	0x04, 0x3E, 0x5F, 0x7E, 0x84,  // 0x06 fat arrow right
	0x04, 0x2F, 0x5F, 0x6F, 0x84,  // 0x07 fat arrow left
	0x00, 0x24, 0x4E, 0x7F, 0x8E,  // 0x08 pointer up
	0x04, 0x2E, 0x5F, 0x6E, 0x80,  // 0x09 pointer up-up
	0x0E, 0x3F, 0x4E, 0x64, 0x80,  // 0x0A pointer down
	0x00, 0x2E, 0x5F, 0x6E, 0x84,  // 0x0B pointer down-down
	0x00, 0x20, 0x40, 0x60, 0x9F,  // 0x0C row1
	0x00, 0x20, 0x40, 0x7F, 0x9F,  // 0x0D row2
	0x00, 0x20, 0x5F, 0x7F, 0x9F,  // 0x0E row3
	0x00, 0x3F, 0x5F, 0x7F, 0x9F,  // 0x0F row4
	0x1F, 0x3F, 0x5F, 0x7F, 0x9F,  // 0x10 full 5x5
  0x1E, 0x3E, 0x5E, 0x7E, 0x9E,  // 0x11 col4
  0x1C, 0x3C, 0x5C, 0x7C, 0x9C,  // 0x12 col3
  0x18, 0x38, 0x58, 0x78, 0x98,  // 0x13 col2
	0x10, 0x30, 0x50, 0x70, 0x90,  // 0x14 col1
  0x1C, 0x34, 0x5C, 0x60, 0x80,  // 0x15 degree sign
	0x1F, 0x31, 0x51, 0x71, 0x9F,  // 0x16 square
	0x1F, 0x35, 0x5F, 0x75, 0x9F,  // 0x17 square+
	0x15, 0x2A, 0x55, 0x6A, 0x95,  // 0x18 diagonal
	0x0A, 0x35, 0x4A, 0x75, 0x8A,  // 0x19 antidiagonal
	0x07, 0x28, 0x5E, 0x68, 0x87,  // 0x1A euro sign
	0x15, 0x2E, 0x44, 0x64, 0x84,  // 0x1B antenna sign
	0x16, 0x2D, 0x46, 0x6D, 0x96,  // 0x1C BT sign
	0x0E, 0x31, 0x51, 0x6A, 0x9B,  // 0x1D omega
	0x10, 0x28, 0x44, 0x6A, 0x91,  // 0x1E lambda
	0x01, 0x2E, 0x5A, 0x6A, 0x8A,  // 0x1F pi
  0x00, 0x20, 0x40, 0x60, 0x80,  // 0x20 (space) empty
  0x04, 0x24, 0x44, 0x60, 0x84,  // 0x21 !
  0x0A, 0x2A, 0x40, 0x60, 0x80,  // 0x22 "
  0x0A, 0x3F, 0x4A, 0x7F, 0x8A,  // 0x23 #
  0x0F, 0x34, 0x4E, 0x65, 0x9E,  // 0x24 $
  0x19, 0x3A, 0x44, 0x6B, 0x93,  // 0x25 %
  0x08, 0x34, 0x4D, 0x72, 0x8D,  // 0x26 &
  0x04, 0x24, 0x40, 0x60, 0x80,  // 0x27 '
  0x02, 0x24, 0x44, 0x64, 0x82,  // 0x28 (
  0x08, 0x24, 0x44, 0x64, 0x88,  // 0x29 )
  0x15, 0x2E, 0x5F, 0x6E, 0x95,  // 0x2A *
  0x04, 0x24, 0x5F, 0x64, 0x84,  // 0x2B +
  0x00, 0x20, 0x40, 0x64, 0x84,  // 0x2C ,
  0x00, 0x20, 0x4E, 0x60, 0x80,  // 0x2D -
  0x00, 0x20, 0x40, 0x60, 0x84,  // 0x2E .
  0x01, 0x22, 0x44, 0x68, 0x90,  // 0x2F /
  0x0E, 0x33, 0x55, 0x79, 0x8E,  // 0x30 0
  0x04, 0x2C, 0x44, 0x64, 0x8E,  // 0x31 1
  0x1E, 0x21, 0x46, 0x68, 0x9F,  // 0x32 2
  0x1E, 0x21, 0x4E, 0x61, 0x9E,  // 0x33 3
  0x06, 0x2A, 0x5F, 0x62, 0x82,  // 0x34 4
  0x1F, 0x30, 0x5E, 0x61, 0x9E,  // 0x35 5
  0x06, 0x28, 0x5E, 0x71, 0x8E,  // 0x36 6
  0x1F, 0x22, 0x44, 0x68, 0x88,  // 0x37 7
  0x0E, 0x31, 0x4E, 0x71, 0x8E,  // 0x38 8
  0x0E, 0x31, 0x4F, 0x62, 0x8C,  // 0x39 9
  0x00, 0x24, 0x40, 0x64, 0x80,  // 0x3A :
  0x00, 0x24, 0x40, 0x6C, 0x80,  // 0x3B ;
  0x02, 0x24, 0x48, 0x64, 0x82,  // 0x3C <
  0x00, 0x3F, 0x40, 0x7F, 0x80,  // 0x3D =
  0x08, 0x24, 0x42, 0x64, 0x88,  // 0x3E >
  0x0E, 0x31, 0x42, 0x64, 0x84,  // 0x3F ?
  0x0E, 0x35, 0x57, 0x70, 0x8E,  // 0x40 @
  0x04, 0x2A, 0x5F, 0x71, 0x91,  // 0x41 A
  0x1E, 0x29, 0x4E, 0x69, 0x9E,  // 0x42 B
  0x0F, 0x30, 0x50, 0x70, 0x8F,  // 0x43 C   
  0x1E, 0x29, 0x49, 0x69, 0x9E,  // 0x44 D 
  0x1F, 0x30, 0x5E, 0x70, 0x9F,  // 0x45 E
  0x1F, 0x30, 0x5E, 0x70, 0x90,  // 0x46 F
  0x0F, 0x30, 0x53, 0x71, 0x8F,  // 0x47 G
  0x11, 0x31, 0x5F, 0x71, 0x91,  // 0x48 H
  0x0E, 0x24, 0x44, 0x64, 0x8E,  // 0x49 I
  0x01, 0x21, 0x41, 0x71, 0x8E,  // 0x4A J
  0x13, 0x34, 0x58, 0x74, 0x93,  // 0x4B K
  0x10, 0x30, 0x50, 0x70, 0x9F,  // 0x4C L
  0x11, 0x3B, 0x55, 0x71, 0x91,  // 0x4D M
  0x11, 0x39, 0x55, 0x73, 0x91,  // 0x4E N
  0x0E, 0x31, 0x51, 0x71, 0x8E,  // 0x4F O
  0x1E, 0x31, 0x5E, 0x70, 0x90,  // 0x50 P
  0x0C, 0x32, 0x56, 0x72, 0x8D,  // 0x51 Q
  0x1E, 0x31, 0x5E, 0x74, 0x92,  // 0x52 R
  0x0F, 0x30, 0x4E, 0x61, 0x9E,  // 0x53 S
  0x1F, 0x24, 0x44, 0x64, 0x84,  // 0x54 T
  0x11, 0x31, 0x51, 0x71, 0x8E,  // 0x55 U
  0x11, 0x31, 0x51, 0x6A, 0x84,  // 0x56 V
  0x11, 0x31, 0x55, 0x7B, 0x91,  // 0x57 W
  0x11, 0x2A, 0x44, 0x6A, 0x91,  // 0x58 X
  0x11, 0x2A, 0x44, 0x64, 0x84,  // 0x59 Y
  0x1F, 0x22, 0x44, 0x68, 0x9F,  // 0x5A Z
  0x07, 0x24, 0x44, 0x64, 0x87,  // 0x5B [
  0x10, 0x28, 0x44, 0x62, 0x81,  // 0x5C \
  0x1C, 0x24, 0x44, 0x64, 0x9C,  // 0x5D ]
  0x04, 0x2A, 0x51, 0x60, 0x80,  // 0x5E ^
  0x00, 0x20, 0x40, 0x60, 0x9F,  // 0x5F _
  0x0A, 0x2A, 0x40, 0x60, 0x80,  // 0x60 `
  0x00, 0x2E, 0x52, 0x72, 0x8D,  // 0x61 a
  0x10, 0x30, 0x5E, 0x71, 0x9E,  // 0x62 b 
  0x00, 0x2F, 0x50, 0x70, 0x8F,  // 0x63 c
  0x01, 0x21, 0x4F, 0x71, 0x8F,  // 0x64 d
  0x00, 0x2E, 0x5F, 0x70, 0x8E,  // 0x65 e
  0x04, 0x2A, 0x48, 0x7C, 0x88,  // 0x66 f
  0x00, 0x2F, 0x50, 0x73, 0x8F,  // 0x67 g
  0x10, 0x30, 0x56, 0x79, 0x91,  // 0x68 h
  0x04, 0x20, 0x4C, 0x64, 0x8E,  // 0x69 i
  0x00, 0x26, 0x42, 0x72, 0x8C,  // 0x6A j
  0x10, 0x30, 0x56, 0x78, 0x96,  // 0x6B k
  0x0C, 0x24, 0x44, 0x64, 0x8E,  // 0x6C l
  0x00, 0x2A, 0x55, 0x71, 0x91,  // 0x6D m
  0x00, 0x36, 0x59, 0x71, 0x91,  // 0x6E n
  0x00, 0x2E, 0x51, 0x71, 0x8E,  // 0x6F o
  0x00, 0x3E, 0x51, 0x7E, 0x90,  // 0x70 p
  0x00, 0x2F, 0x51, 0x6F, 0x81,  // 0x71 q
  0x00, 0x33, 0x54, 0x78, 0x90,  // 0x72 r
  0x00, 0x23, 0x44, 0x62, 0x8C,  // 0x73 s
  0x08, 0x3C, 0x48, 0x6A, 0x84,  // 0x74 t
  0x00, 0x32, 0x52, 0x72, 0x8D,  // 0x75 u
  0x00, 0x31, 0x51, 0x6A, 0x84,  // 0x76 v
  0x00, 0x31, 0x55, 0x7B, 0x91,  // 0x77 w
  0x00, 0x32, 0x4C, 0x6C, 0x92,  // 0x78 x
  0x00, 0x31, 0x4A, 0x64, 0x98,  // 0x79 y
  0x00, 0x3E, 0x44, 0x68, 0x9E,  // 0x7A z
  0x06, 0x24, 0x48, 0x64, 0x86,  // 0x7B {
  0x04, 0x24, 0x44, 0x64, 0x84,  // 0x7C |
  0x0C, 0x24, 0x42, 0x64, 0x8C,  // 0x7D }
  0x00, 0x27, 0x5C, 0x60, 0x80,  // 0x7E ~
};

#define CS_PIN  10
#define CLK_PIN 13
#define DIN_PIN 11

#define SERIAL_TX 1
#define SERIAL_RX 0

#define MAX_SEG 1
#define MATRIX_ADDRESS 0

SoftwareSerial mySerial(SERIAL_RX, SERIAL_TX);                  //Serial
LedControl mat = LedControl(DIN_PIN, CLK_PIN, CS_PIN, MAX_SEG); // MAX7219


void setup() {
  mySerial.begin(9600);
  mySerial.println("Start thingy");

  mat.shutdown(0, false);
  mat.setIntensity(0, 7);
  mat.clearDisplay(0);

}


void loop() {

  for (int i = 0; i <= 127; i++) {
    mySerial.print("ascii: 0x");
    mySerial.print(i, HEX);
    mySerial.print(", row: ");
    for (int row = 0; row < 5; row++) {
    mat.setRow(MATRIX_ADDRESS, row, flipByte(Font5x5[i*5+row]));
    mySerial.print("0x");
    mySerial.print(Font5x5[i*5+row], HEX);
    mySerial.print(", ");
    }
    mat.setLed(0,1,5,false);
    mat.setLed(0,2,6,false);
    mat.setLed(0,3,5,false);
    mat.setLed(0,3,6,false);
    mat.setLed(0,4,7,false);
    mySerial.println(" ");
    delay(300);
  }

    


}

byte flipByte(byte c)
     {
       c = ((c>>1)&0x55)|((c<<1)&0xAA);
       c = ((c>>2)&0x33)|((c<<2)&0xCC);
       c = (c>>4) | (c<<4) ;

       return c;
     }