cheap 32x32 RGB panel with 24bit color and 30fps live streaming

Status
Not open for further replies.

MarkusL

Member
Teensy is just so awesome!
teensy.jpg

In contrast to the intelligent LED-strips, the cheap 32x32 RGB panels natively only support 1bit per color. If you want more, you have to switch the LEDs rapidly. The Adafruit Matrix library for Arduino only supported this for up to 4bits per color, in total 4096 colors.

Using the incredibly powerfull Teensy I was able to increase this to 8bit per color, 24bit in total, thats 16.7 million colors, with 30fps! I believe this is a first. To achieve this, I prepare the interleaved, gamma-corrected buffer on the PC in a Java app and stream it live. This is possible due to the fast USB of the Teensy. You can stream any part of your screen. I don't use DMA yet, this could reduce CPU even more.

Especially on dark scenes there are still some artifacts on the bottom side, must either be a bug or timing issue.

Videos: NEW http://youtu.be/SDrxM1TDR18 http://youtu.be/x0Wcpol7cO4, http://youtu.be/dmCp1OEAtMU

Here's the Teensy 3.1 sketch:
Code:
    /* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
    * Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
    * Use code freely and distort its contents as much as you want, just remeber to thank the
    * original creaters of the code by leaving their information in the header. :)
    */

    //modified by markus lipp for 32x32 panel


    //PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
    //PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
    //Define pins
    const uint8_t
    //PortC
    APIN      = 15, BPIN      = 22, CPIN      = 23, DPIN = 9,
    CLOCKPIN  = 10, LATCHPIN  = 13, OEPIN     = 11,
    //PortD
    R1PIN     = 2, R2PIN     = 8,
    G1PIN     = 14, G2PIN     = 6,
    B1PIN     = 7, B2PIN     = 20;

    uint8_t pinTable[13] = {
      R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
      APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

    //Addresses 1/8 rows Through a decoder
    uint16_t const A = 1, B = 2,C = 4, D=8;
    //Acts like a 16 bit shift register
    uint16_t const SCLK   = 16;
    uint16_t const LATCH  = 32;
    uint16_t const OE     = 64;

    uint16_t const abcVar[16] = { //Decoder counter var
      0,A,B,A+B,C,C+A,C+B,A+B+C,
      0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};

    //Data Lines for row 1 red and row 9 red, ect.
    uint16_t const RED1   = 1, RED2   = 8;
    uint16_t const GREEN1 = 2, GREEN2 = 16;
    uint16_t const BLUE1  = 4, BLUE2  = 32;

    const uint8_t SIZEX = 32;
    const uint8_t SIZEY = 32;

    //Here is where the data is all read
    uint8_t interleavedBuffer[SIZEX*SIZEY*4];

    //BAM and interrupt variables
    boolean actDisplay = false;
    uint8_t rowN = 0;
    uint16_t BAM;
    uint8_t BAMMAX = 7; //now 24bit color! (0-7)

    void setup() {
      for(uint8_t i = 0; i < 13; i++){
            pinMode(pinTable[i], OUTPUT);
        }
      timerInit();
      Serial.begin(250000);
    }

    uint8_t r,g, prevVal,val;
    int dataPos=0;

    void loop() {       
       if (Serial.available())
       {     
          prevVal = val;
          val = Serial.read();     
       
          if ( (prevVal==0x21 && val==0x8) || dataPos>=4096)
          {
             dataPos=0;
          }
          else
          {
            interleavedBuffer[dataPos++] = val;
          }
       } 
    }

    IntervalTimer timer1;
    #define BAMDUR 2
    void timerInit() {
        timer1.begin(timerCallBack,BAMDUR);
        BAM = 0;
    }


    //Where the PIT calls
    void timerCallBack() {
        attackMatrix(); // Updated the display
        if(BAM > BAMMAX) { //Checks the BAM cycle for next time.
            BAM = 0;
            timer1.begin(timerCallBack,BAMDUR);
            actDisplay = false;
        } else {
            BAM ++;
            actDisplay = true;
        }
    }

    //The updating matrix stuff happens here
    //each pair of rows is taken through its BAM cycle
    //then the rowNumber is increased and id done again
    void attackMatrix() {
        uint16_t portData;

        //sets up which BAM the matrix is on
        if(BAM == 0) { timer1.begin(timerCallBack,BAMDUR); }
        if(BAM == 1) { timer1.begin(timerCallBack,BAMDUR*2); }
        if(BAM == 2) { timer1.begin(timerCallBack,BAMDUR*4); }
        if(BAM == 3) { timer1.begin(timerCallBack,BAMDUR*8); }
        if(BAM == 4) { timer1.begin(timerCallBack,BAMDUR*16); }
        if(BAM == 5) { timer1.begin(timerCallBack,BAMDUR*32); }
        if(BAM == 6) { timer1.begin(timerCallBack,BAMDUR*64); }
        if(BAM == 7) { timer1.begin(timerCallBack,BAMDUR*128); }

        portData = 0; // Clear data to enter
        portData |= (abcVar[rowN])|OE; // abc, OE
        portData &=~ LATCH;        //LATCH LOW
        GPIOC_PDOR = portData;  // Write to Port
       
        uint8_t *start = &interleavedBuffer[rowN*SIZEX*8+((7-BAMMAX)+BAM)*32];
       
        for(uint8_t _x = 0; _x < 32; _x++){

              GPIOD_PDOR = start[_x]; // Transfer data
              GPIOC_PDOR |=  SCLK;// Clock HIGH
              GPIOC_PDOR &=~ SCLK;// Clock LOW
        }

        GPIOC_PDOR |= LATCH;// Latch HIGH
        GPIOC_PDOR &=~ OE;// OE LOW, Displays line   

        if(BAM == BAMMAX){
           if(rowN == 15){
                rowN = 0;
            } else {
                rowN ++;
            }
        }
    }

And here is the Java live streaming app for your PC. Just start the jar in the bin directory. Move&Scale the small window to define what to stream. Select Interleaved RGB8 for Teensy as output mode. Click "enable output" to start streaming.
https://dl.dropboxusercontent.com/u/17009785/ScreenStream.rar

streamingApp.png

Here's a link to the Arduino version I posted earlier. It's just 4bit and 12fps. http://forums.adafruit.com/viewtopic.php?f=47&t=50115
 
Last edited:
Found the bug causing some artifacts at the bottom. It was an index out of range because of a wrong timer.

Edit: After hours of searching and writing unit tests i fixed another rare bug, caused by a collision of the framesync with specific colors. Java-app and sketch is updated.

Edit2: Removed another nasty bug. Didn't realize IntervallTimer is periodic, ouch. Also tweaked timing for smoother gradients.

Ps: if you want to try it, it's quite easy: Attach your 32x32 panel inputs (e.g. https://www.sparkfun.com/products/12584) to the pins shown in the beginning of the code. Add 5V power to the panel (NOT to the Teensy, only connect the grounds). Attach the Teensy to USB, start the Java app and stream your screen.

Updated code:

Code:
/*
* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
* Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
* Use code freely and distort its contents as much as you want, just remeber to thank the 
* original creaters of the code by leaving their information in the header. :)
*/

//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//Define pins
const uint8_t
//PortC
APIN      = 15, BPIN      = 22, CPIN      = 23, DPIN = 9,
CLOCKPIN  = 10, LATCHPIN  = 13, OEPIN     = 11,
//PortD
R1PIN     = 2, R2PIN     = 8,
G1PIN     = 14, G2PIN     = 6,
B1PIN     = 7, B2PIN     = 20;

uint8_t pinTable[13] = {
  R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
  APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

//Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;
//Acts like a 16 bit shift register
uint16_t const SCLK   = 16;
uint16_t const LATCH  = 32;
uint16_t const OE     = 64;

uint16_t const abcVar[16] = { //Decoder counter var
  0,A,B,A+B,C,C+A,C+B,A+B+C,
  0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};

//Data Lines for row 1 red and row 9 red, ect.
uint16_t const RED1   = 1, RED2   = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16;
uint16_t const BLUE1  = 4, BLUE2  = 32;

const uint8_t SIZEX = 32;
const uint8_t SIZEY = 32;

//Here is where the data is all read
uint8_t interleavedBuffer[SIZEX*SIZEY*4];

//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7; //now 24bit color! (0-7)


void setup() {
  for(uint8_t i = 0; i < 13; i++){
        pinMode(pinTable[i], OUTPUT);
    }
  timerInit();
  Serial.begin(250000); 
}

uint8_t r,g, prevVal,val;
int dataPos=0;

void loop() {       
   if (Serial.available())
   {     
      prevVal = val;
      val = Serial.read();     
   
      if ( (prevVal==192 && val==192) || dataPos>=4096)
      {
        dataPos=0;
      }
      else
      {
        interleavedBuffer[dataPos++] = val;
      }
   }  
}

IntervalTimer timer1;

void timerInit() {
    BAM = 0;
    attackMatrix();
}


//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and id done again
void attackMatrix() {
    timer1.end();    
    
    uint16_t portData;
    portData = 0; // Clear data to enter
    portData |= (abcVar[rowN])|OE; // abc, OE
    portData &=~ LATCH;        //LATCH LOW
    GPIOC_PDOR = portData;  // Write to Port
    
    uint8_t *start = &interleavedBuffer[rowN*SIZEX*8+((7-BAMMAX)+BAM)*32];    
    for(uint8_t _x = 0; _x < 32; _x++){
          GPIOD_PDOR = start[_x]; // Transfer data
          GPIOC_PDOR |=  SCLK;// Clock HIGH
          GPIOC_PDOR &=~ SCLK;// Clock LOW
    }

    GPIOC_PDOR |= LATCH;// Latch HIGH
    GPIOC_PDOR &=~ OE;// OE LOW, Displays line

    #define LOOPTIME 2 //trial&error to get both smooth gradients & little flicker
    #define CALLOVERHEAD 2
    timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<<BAM)-CALLOVERHEAD);
  
    if(BAM >= BAMMAX) { //Checks the BAM cycle for next time.    
        if(rowN == 15){
            rowN = 0;
        } else {
            rowN ++;
        }        
        BAM = 0;
      } else {
        BAM ++;
    }
}
 
Last edited:
Thanks Markus for sharing your efforts,

I am trying to understand and adapt your code to my needs but no success so far. I cannot run your Java code on my Mac, some problem with jssc, but from its code I feel that you feed a Matrix of argb values to the Teensy. How about for starter to just display a matrix of 1024 colors (simplest case I can think)? What would be the code in this case? Or to draw a pixel for example.

I cannot understand where you make in your code the switch for the rows 16 to 32.
Finally you say your sketch is for Teensy 3.1, does it work also for Teensy 3.0?

My naive attempt was posted here, it worked but flickered a lot.
 
I cannot run your Java code on my Mac
What exactly happes, does it crash or fail to open the COM port? I haven't tested on Mac, maybe I can test tomorrow on a Macbook Air.

but from its code I feel that you feed a Matrix of argb values to the Teensy.
I feed RGB888 values. The argb value is just an intermediate value returned by a Java function.

How about for starter to just display a matrix of 1024 colors (simplest case I can think)? Or to draw a pixel for example.
Right now you always have to stream all pixels from Java. There you can for example change individual pixels in the update() function. You can't change pixels directly on Teensy (yet). This would require implementing drawPixel888() on the Teensy.


I cannot understand where you make in your code the switch for the rows 16 to 32.
There are always two rows pushed to the panel simultaneously, and they are 16 rows apart. So the pairs are [1,16], [2,17] ... [15,32] . This interleaving of lines happens in drawPixel888().

Finally you say your sketch is for Teensy 3.1, does it work also for Teensy 3.0?
It should also work, although I can't test that.
 
OK, i quickly created a debug sketch. It displays a gradient with lots of colors, and does not require any PC connection. It should just work when powering up the Teensy.

Code:
/*
* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
* Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
* Use code freely and distort its contents as much as you want, just remeber to thank the 
* original creaters of the code by leaving their information in the header. :)
*/


//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//Define pins
const uint8_t
//PortC
APIN      = 15, BPIN      = 22, CPIN      = 23, DPIN = 9,
CLOCKPIN  = 10, LATCHPIN  = 13, OEPIN     = 11,
//PortD
R1PIN     = 2, R2PIN     = 8,
G1PIN     = 14, G2PIN     = 6,
B1PIN     = 7, B2PIN     = 20;

uint8_t pinTable[13] = {
  R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
  APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

//Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;
//Acts like a 16 bit shift register
uint16_t const SCLK   = 16;
uint16_t const LATCH  = 32;
uint16_t const OE     = 64;

uint16_t const abcVar[16] = { //Decoder counter var
  0,A,B,A+B,C,C+A,C+B,A+B+C,
  0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};

//Data Lines for row 1 red and row 9 red, ect.
uint16_t const RED1   = 1, RED2   = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16;
uint16_t const BLUE1  = 4, BLUE2  = 32;

const uint8_t SIZEX = 32;
const uint8_t SIZEY = 32;



//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7; //now 24bit color! (0-7)


void setup() {
  for(uint8_t i = 0; i < 13; i++){
        pinMode(pinTable[i], OUTPUT);
    }
  timerInit();
  Serial.begin(250000); 
}

uint8_t r,g, prevVal,val;
int dataPos=0;

byte interleavedBuffer[] = {
0,0,48,63,63,63,63,56,56,56,48,63,63,59,57,61,53,57,29,24,8,63,47,31,63,8,47,47,15,15,63,63,0,0,16,16,16,31,24,24,23,31,31,31,31,23,29,52,52,45,44,31,8,31,8,8,8,40,15,40,63,24,63,7,0,0,48,48,56,48,55,56,56,63,48,55,48,53,63,53,21,43,27,31,40,56,15,24,31,40,63,63,24,8,0,0,0,0,16,16,16,24,16,31,31,31,16,24,23,17,27,61,61,45,29,63,47,8,15,31,24,8,47,31,15,15,7,7,0,0,16,16,16,16,24,24,16,24,31,23,23,19,29,60,61,45,24,24,15,40,24,63,8,47,31,8,15,8,7,56,0,0,48,48,48,48,48,48,56,56,48,56,48,56,61,21,29,60,62,8,40,31,15,63,56,24,8,15,15,8,56,63,0,0,48,48,48,48,48,48,48,
48,56,56,48,52,52,60,60,29,13,15,47,63,63,15,8,8,8,8,8,15,63,63,0,0,48,48,48,48,48,48,48,48,48,48,56,56,60,60,60,60,56,56,24,8,8,8,15,15,15,15,15,15,63,63,0,0,48,63,56,63,55,56,48,48,56,61,61,53,52,30,62,46,60,45,61,30,63,63,63,40,31,15,15,31,63,63,0,0,48,48,55,31,24,24,23,55,61,53,52,21,28,29,53,45,12,44,28,30,24,24,56,8,31,56,63,15,56,7,0,0,16,16,24,48,55,56,56,63,56,61,61,29,21,21,61,60,44,61,45,31,63,40,63,40,47,47,8,24,7,0,0,0,16,16,16,24,16,31,31,31,28,20,29,60,52,60,52,45,12,44,13,8,63,63,40,24,63,15,31,15,7,7,0,0,16,16,16,16,24,24,16,24,23,20,28,29,28,61,52,
29,61,60,29,58,56,15,56,47,31,24,15,8,7,56,0,0,16,16,16,16,16,16,24,24,20,28,28,20,29,61,60,60,13,60,44,25,47,47,24,24,8,15,15,8,56,63,0,0,48,48,48,48,48,48,48,48,56,60,60,52,52,20,29,29,29,44,44,60,31,31,8,8,8,8,8,15,63,63,0,0,48,48,48,48,48,48,48,48,48,52,52,60,60,60,60,60,60,29,29,13,8,8,15,15,15,15,15,15,63,63,0,0,48,31,16,23,31,16,23,20,28,23,21,31,63,55,62,23,62,60,15,45,13,43,15,24,31,47,47,31,63,63,0,0,16,16,23,31,16,16,19,20,21,52,62,54,54,23,62,31,31,47,28,28,12,31,8,63,56,15,24,15,56,7,0,0,16,48,24,16,23,24,20,20,20,60,52,29,61,53,60,28,44,60,61,12,12,9,63,
8,8,47,31,8,7,0,0,0,16,16,48,56,48,63,63,60,60,29,20,21,29,53,52,52,13,44,45,61,45,63,40,8,40,31,31,31,7,7,0,0,16,16,16,16,24,24,16,28,20,28,29,21,52,61,61,60,13,13,44,12,60,31,40,63,8,24,15,8,7,56,0,0,48,48,48,48,48,48,56,60,52,52,60,52,21,29,20,29,29,44,29,12,61,45,8,24,31,15,15,8,56,63,0,0,16,16,16,16,16,16,16,20,28,28,28,20,20,20,29,29,29,60,44,45,29,24,24,8,8,8,8,15,63,63,0,0,48,48,48,48,48,48,48,52,52,52,52,60,60,60,60,60,60,29,29,29,13,13,15,15,15,15,15,15,63,63,0,0,16,55,56,55,63,59,52,63,20,53,63,62,28,55,30,30,45,29,13,47,28,13,61,8,31,31,63,15,63,63,0,
0,16,16,31,23,24,19,22,52,54,21,52,30,60,61,21,20,61,15,12,15,62,9,9,31,8,15,24,15,56,7,0,0,48,48,48,48,63,50,60,20,61,62,31,55,29,21,28,28,29,47,31,13,28,45,13,24,24,47,31,8,7,0,0,0,0,48,48,56,56,56,52,52,52,53,52,60,62,22,55,22,14,29,13,28,29,25,41,24,56,15,15,15,7,7,0,0,0,16,16,16,16,28,20,28,20,28,21,52,61,20,21,21,60,29,61,29,61,9,57,63,8,8,31,24,7,56,0,0,0,16,16,16,16,16,28,28,20,20,28,61,61,28,20,29,60,44,29,12,61,61,9,24,31,31,15,8,56,63,0,0,0,16,16,16,16,20,20,20,28,28,28,60,60,21,29,29,60,60,44,45,29,29,29,8,8,8,8,15,63,63,0,0,0,48,48,48,48,48,52,
52,52,52,52,20,20,60,60,60,29,29,29,29,13,13,13,15,15,15,15,15,63,63,0,0,0,55,48,63,63,62,29,53,29,52,21,20,60,31,22,62,53,29,31,31,63,45,57,61,31,31,31,15,63,7,0,0,0,16,31,31,19,52,52,55,28,29,31,29,22,22,22,31,31,28,45,47,11,59,9,25,56,47,24,31,0,7,0,0,0,48,48,56,59,28,28,30,31,61,60,22,63,62,23,30,30,63,44,46,25,61,57,45,56,15,15,8,63,56,0,0,0,16,16,16,28,22,30,28,20,55,31,31,23,54,30,55,22,15,31,29,57,41,29,61,8,31,31,15,7,7,0,0,0,48,48,48,50,60,60,52,60,20,21,28,29,29,60,29,29,44,12,44,13,61,61,13,24,8,31,24,7,56,0,0,0,48,48,48,52,52,52,60,60,52,52,53,61,52,61,
53,60,29,12,61,45,25,13,9,31,31,15,8,56,63,0,0,0,48,48,48,48,52,52,52,52,60,60,60,60,53,53,61,60,60,61,13,13,29,25,25,8,8,8,15,63,63,0,0,0,16,16,16,20,20,20,20,20,20,20,20,20,28,28,28,29,29,29,29,29,13,13,13,15,15,15,15,63,63,0,0,0,55,24,62,30,63,63,21,62,63,54,28,22,54,62,30,28,47,63,44,45,47,25,29,29,63,15,63,63,7,0,0,0,16,23,20,20,22,21,23,61,20,61,61,54,52,52,53,63,46,28,13,9,29,15,57,29,31,8,63,0,0,0,0,0,48,16,56,54,52,52,63,30,30,29,31,31,52,20,60,62,61,28,46,25,11,13,29,41,15,31,0,63,63,0,0,0,48,16,49,60,52,60,54,63,22,61,61,28,31,62,23,52,29,45,63,27,41,25,
45,9,15,15,7,7,7,0,0,0,48,16,49,54,62,62,52,52,61,31,22,54,55,55,54,22,31,63,29,25,41,41,25,13,24,15,56,7,56,0,0,0,16,48,20,20,20,20,28,28,28,28,21,28,20,29,20,29,29,44,61,45,9,29,9,13,31,31,0,56,63,0,0,0,48,48,54,52,52,52,52,52,52,52,60,61,53,53,60,60,60,29,13,13,13,25,25,29,8,8,63,63,63,0,0,0,16,16,20,20,20,20,20,20,20,20,20,20,28,28,29,29,29,29,29,29,29,13,13,9,15,15,63,63,63,0,0,0,63,16,30,63,28,29,55,62,28,29,31,55,31,22,23,28,55,29,63,63,11,57,59,57,63,15,63,63,7,0,0,0,16,55,62,30,22,61,53,22,21,62,53,20,54,31,30,52,53,60,25,45,57,61,61,41,10,24,56,7,0,0,
0,0,32,16,22,30,31,55,28,54,23,53,31,21,61,20,61,60,62,60,41,27,9,27,41,25,29,31,7,63,63,0,0,0,48,48,54,54,62,22,31,52,60,22,54,21,28,61,20,52,23,47,25,59,15,45,9,29,29,31,7,7,7,0,0,0,32,16,22,22,22,30,30,55,55,62,55,20,28,29,29,61,62,14,15,45,61,29,9,9,29,15,56,7,56,0,0,0,48,16,20,20,20,20,20,60,60,61,53,30,31,23,30,55,60,61,45,25,13,25,25,13,30,31,0,56,63,0,0,0,0,48,52,52,52,52,52,20,20,20,28,61,61,53,52,28,29,29,29,13,9,25,25,29,13,8,63,63,63,0,0,0,16,16,20,20,20,20,20,20,20,20,20,20,20,28,29,29,29,29,29,29,29,13,13,9,9,15,63,63,63,0,0,0,63,22,29,55,61,30,
55,60,61,61,60,29,54,55,22,63,29,47,29,13,59,25,31,45,29,63,63,63,7,0,0,0,0,20,20,55,55,60,60,63,61,52,23,62,21,61,21,60,61,47,15,9,13,31,15,29,9,7,56,7,0,0,0,0,0,20,20,62,55,63,52,31,63,54,61,31,52,61,52,63,20,15,45,43,63,11,57,25,25,63,7,63,63,0,0,0,0,52,52,22,30,31,54,52,29,29,63,22,20,28,28,55,55,31,63,25,59,45,25,13,13,7,7,7,7,0,0,0,0,54,54,52,52,52,29,29,29,20,29,61,63,54,54,21,21,31,63,59,25,9,13,29,9,7,56,7,56,0,0,0,0,54,54,54,54,54,54,54,54,63,63,54,63,54,63,55,62,61,9,25,13,9,29,9,9,7,0,56,63,0,0,0,0,20,20,20,20,20,20,20,20,20,20,29,29,20,
20,28,29,29,29,13,9,9,29,29,29,56,63,63,63,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,29,29,29,29,29,29,29,29,29,9,9,9,63,63,63,63,0,0,0,63,4,54,21,30,53,61,22,52,20,54,30,28,29,30,23,61,55,61,27,41,47,11,29,13,62,63,63,7,0,0,0,0,62,55,62,53,20,30,54,60,23,63,28,63,30,63,63,55,23,57,47,9,25,57,27,9,4,56,7,56,0,0,0,0,36,54,55,62,22,52,22,62,63,63,62,60,29,62,20,54,29,11,61,9,45,11,9,25,61,7,63,63,0,0,0,0,4,22,22,23,30,63,52,21,55,52,30,21,60,22,23,53,55,25,59,45,15,29,9,9,1,7,7,7,0,0,0,0,60,22,22,22,23,55,62,62,52,62,22,21,29,31,30,62,57,45,15,31,29,
25,13,25,5,56,7,56,0,0,0,0,36,54,54,54,54,22,23,23,31,30,55,61,60,55,62,23,31,27,13,25,13,29,25,9,5,0,56,63,0,0,0,0,6,20,20,20,20,20,20,20,20,21,29,31,30,20,21,29,29,29,25,9,13,29,29,29,57,63,63,63,0,0,0,0,20,20,20,20,20,20,20,20,20,20,20,20,21,29,29,29,29,29,29,29,25,9,9,9,57,63,63,63,0,0,0,60,61,52,61,20,62,31,54,52,53,29,52,52,60,31,53,62,63,47,31,57,13,15,13,7,61,63,63,7,0,0,0,6,62,22,23,63,61,28,63,60,55,62,22,60,29,53,55,21,21,9,27,27,63,13,29,61,5,0,63,56,0,0,0,4,6,23,21,53,21,28,54,53,23,63,30,22,54,28,53,54,17,59,11,59,15,9,15,61,61,63,63,63,0,
0,0,6,4,52,52,21,20,20,63,54,21,29,55,61,52,60,31,21,19,59,59,29,15,31,9,1,1,7,7,7,0,0,0,6,6,54,54,54,55,54,20,29,53,52,52,62,62,54,53,53,51,25,27,27,9,13,25,61,1,56,7,56,0,0,0,4,4,20,20,20,20,21,21,21,29,28,21,20,29,20,28,21,31,27,13,25,29,9,25,61,5,0,56,63,0,0,0,6,6,22,22,22,22,22,22,22,22,23,31,30,30,23,23,31,29,29,25,9,13,13,29,1,57,63,63,63,0,0,0,4,4,20,20,20,20,20,20,20,20,20,20,21,21,29,29,29,29,29,29,29,25,25,9,57,57,63,63,63,0,0,0,62,62,60,52,53,61,30,22,55,63,52,30,55,22,63,53,53,31,25,63,25,27,9,41,5,61,59,63,7,0,0,0,4,61,5,20,52,21,
28,60,30,52,22,31,28,53,23,52,27,57,27,29,57,27,9,51,3,61,4,63,63,0,0,0,6,6,63,55,23,20,22,63,28,23,52,21,21,20,31,61,57,23,25,43,31,29,11,55,5,61,58,63,63,0,0,0,6,6,6,55,54,55,53,20,60,63,63,28,22,30,29,61,49,53,57,25,31,25,27,45,61,5,6,7,7,0,0,0,4,4,4,20,21,21,20,21,20,30,23,61,61,53,60,28,31,25,23,13,15,11,29,37,57,5,61,7,56,0,0,0,6,6,6,22,22,22,23,23,22,20,28,31,22,31,30,23,29,17,31,27,13,29,9,29,61,1,3,56,63,0,0,0,6,6,6,22,22,22,22,22,23,23,23,23,30,30,31,23,23,31,25,25,29,13,13,1,1,57,61,63,63,0,0,0,4,4,4,20,20,20,20,20,20,20,20,20,21,21,
21,29,29,29,29,29,25,25,25,57,57,57,57,63,63,0,0,1,60,61,60,62,23,54,29,20,21,29,54,62,60,21,63,29,55,63,63,45,29,31,59,63,3,61,57,63,7,0,0,4,6,63,6,63,23,55,55,52,21,52,60,31,29,52,29,29,49,31,51,11,27,15,43,3,3,61,5,56,63,0,0,6,4,4,60,61,53,20,21,29,61,63,55,22,29,28,23,21,59,57,25,31,29,31,55,3,5,61,61,56,63,0,0,0,4,4,5,5,20,20,21,21,29,23,21,52,52,60,55,61,17,31,27,27,29,25,27,57,57,1,5,0,7,0,0,0,4,4,4,4,21,20,20,21,20,31,22,30,20,28,31,23,17,29,27,25,25,31,17,5,57,5,57,0,56,0,0,0,4,4,4,4,20,21,21,21,20,22,31,30,21,20,30,23,31,29,23,27,15,25,
41,61,61,1,1,63,63,0,0,0,4,4,4,4,20,20,20,20,21,23,23,22,28,29,31,23,23,19,25,25,29,13,37,1,1,57,57,63,63,0,0,0,6,6,6,6,22,22,22,22,22,20,20,21,23,23,21,29,29,29,29,29,25,25,25,57,57,57,57,63,63,0,0,2,60,61,61,60,4,20,21,22,53,31,62,31,23,53,31,31,55,55,57,29,25,3,7,59,1,63,57,63,7,0,0,4,6,63,6,60,63,23,21,28,21,55,53,23,31,21,31,29,55,21,19,31,25,63,57,1,1,57,5,56,63,0,0,5,4,4,60,60,4,21,23,22,21,22,30,60,63,60,61,63,21,31,19,31,9,57,1,1,7,57,57,56,63,0,0,3,6,6,7,6,63,22,22,23,30,21,29,31,29,22,21,29,31,21,17,25,27,63,61,63,61,1,5,0,7,0,
0,4,6,6,6,7,7,22,23,22,23,30,31,20,30,31,22,25,25,27,29,23,9,3,63,1,61,5,57,0,56,0,0,6,4,4,4,4,4,21,21,20,20,21,21,28,29,20,29,29,19,29,17,31,31,1,5,61,57,1,1,63,63,0,0,4,4,4,4,4,4,20,20,21,21,21,21,20,20,29,29,29,23,19,27,29,29,5,1,1,1,57,57,63,63,0,0,6,6,6,6,6,6,22,22,22,22,22,22,23,23,23,23,23,29,29,29,25,25,57,57,57,57,57,57,63,63,0,0,6,63,62,61,60,4,61,61,28,28,23,28,60,53,61,51,53,19,19,31,31,7,7,5,63,5,61,57,63,7,0,0,4,6,62,7,63,61,7,7,23,22,22,29,21,31,22,21,25,29,31,31,43,57,59,57,7,3,63,5,56,7,0,0,6,4,5,60,60,5,60,
4,21,29,29,28,31,31,20,27,17,17,25,31,13,3,63,7,5,7,57,61,56,7,0,0,6,6,6,7,6,63,63,7,23,22,31,22,20,21,30,31,21,31,21,31,43,3,63,61,63,57,5,1,0,63,0,0,6,6,6,6,7,7,6,63,22,22,23,31,22,31,22,29,31,23,21,29,59,5,7,59,5,61,1,57,0,56,0,0,6,6,6,6,6,6,7,7,22,23,23,22,31,31,23,23,25,23,27,29,23,3,5,5,57,57,1,1,63,63,0,0,4,4,4,4,4,4,4,4,21,21,21,20,20,20,29,29,29,19,19,23,29,5,1,1,1,1,57,57,63,63,0,0,6,6,6,6,6,6,6,6,22,22,22,23,23,23,23,23,23,29,29,25,25,57,57,57,57,57,57,57,63,63,0,0,6,63,63,62,63,7,63,62,63,55,30,23,30,31,30,
23,31,19,3,61,3,7,1,3,57,5,57,57,63,7,0,0,6,6,62,6,63,63,6,7,6,30,30,20,31,20,23,19,27,23,33,57,63,63,57,61,5,3,63,61,0,7,0,0,6,6,7,63,62,7,63,7,62,22,22,29,30,30,23,25,31,29,41,7,63,3,57,3,7,7,61,57,0,7,0,0,4,4,4,5,4,61,61,5,4,61,28,23,29,28,20,23,19,25,23,61,3,3,57,57,59,61,1,1,56,63,0,0,6,6,6,6,7,7,6,63,63,62,22,31,31,23,23,27,19,25,33,3,63,1,5,59,5,57,1,57,0,56,0,0,4,4,4,4,4,4,5,5,4,5,20,20,21,28,21,23,25,29,27,61,59,3,7,5,57,57,1,1,63,63,0,0,6,6,6,6,6,6,6,6,7,7,22,22,22,23,31,29,29,25,59,63,61,5,1,
1,1,1,57,57,63,63,0,0,6,6,6,6,6,6,6,6,6,6,23,23,23,23,23,23,23,23,5,1,1,57,57,57,57,57,57,57,63,63,0,0,4,61,60,61,60,5,61,60,60,61,61,60,5,5,59,7,61,3,7,59,7,1,5,7,63,7,57,57,63,7,0,0,6,6,62,7,61,61,4,5,5,61,60,5,5,5,59,1,5,59,7,63,59,59,63,7,1,63,7,57,7,0,0,0,4,4,5,60,60,5,61,5,60,4,61,60,4,60,3,57,61,57,3,3,61,5,57,63,7,7,1,57,0,0,0,0,6,6,6,7,6,63,63,7,6,63,62,6,6,7,63,3,63,3,3,61,1,1,57,57,63,57,57,1,56,56,0,0,6,6,6,6,7,7,6,63,63,62,62,6,6,62,61,5,1,61,5,7,57,7,1,63,1,57,1,57,0,63,0,
0,6,6,6,6,6,6,7,7,6,7,6,63,6,63,63,1,7,1,63,57,57,7,7,1,57,57,1,1,63,63,0,0,6,6,6,6,6,6,6,6,7,7,6,6,7,7,7,63,57,57,63,63,63,1,1,1,1,1,57,57,63,63,0,0,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,1,1,1,57,57,57,57,57,57,57,63,63};


void loop() {       
}

IntervalTimer timer1;

void timerInit() {
    BAM = 0;
    attackMatrix();
}


//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and id done again
void attackMatrix() {
    timer1.end();    
    
    uint16_t portData;
    portData = 0; // Clear data to enter
    portData |= (abcVar[rowN]);//|OE; // abc, OE
    portData &=~ LATCH;        //LATCH LOW
    GPIOC_PDOR = portData;  // Write to Port
    
    uint8_t *start = &interleavedBuffer[rowN*SIZEX*8+((7-BAMMAX)+BAM)*32];    
    for(uint8_t _x = 0; _x < 32; _x++){
          GPIOD_PDOR = start[_x]; // Transfer data
          GPIOC_PDOR |=  SCLK;// Clock HIGH
          GPIOC_PDOR &=~ SCLK;// Clock LOW
    }

    GPIOC_PDOR |= LATCH;// Latch HIGH
    GPIOC_PDOR &=~ OE;// OE LOW, Displays line

    #define LOOPTIME 2 //trial&error to get both smooth gradients & little flicker
    #define CALLOVERHEAD 2
    timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<<BAM)-CALLOVERHEAD);
  
    if(BAM >= BAMMAX) { //Checks the BAM cycle for next time.    
        if(rowN == 15){
            rowN = 0;
        } else {
            rowN ++;
        }        
        BAM = 0;
      } else {
        BAM ++;
    }
}
 
Thanks a lot,
I could easily display the gradient with Teensy 3.0, this is very helpful. Now I am trying to understand the format of your matrix. I can see 4096 numbers, but the pixel value and position is puzzling me!

Regarding your java code, I cannot compile it; I do not develop with Java so I probably don't have the right environment. I just downloaded and added the jssc.jar file in the java library directory and run javac. I got a few error message like:
StreamGUI.java:37: package jssc does not exist
import jssc.SerialPort;

Then I gave-up (very easily I admit) since my interest at the moment, is first to output an image to the matrix.
 
Good to hear the gradient is working.

Actually there is a precompiled version of the Java prog in the /bin directory. It should work without recompiling.

Regarding the matrix layout: It's interleaved to allow fast output to the display, in the order the panel expects. The first byte contains the first rgb bits of row 1 and 16. 2 bits are wasted this way. Second byte: second rgb bits of first element in row 1 and 16, and so on.
 
Hello,
I found the .jar program in bin directory; I can confirm that it works with the LED panel. The program displays the top left portion of my screen.
Thanks for your efforts and sharing.

Now I have work to do to understand how the Teensy sketch works :)
 
I changed parts of Markus sketch for my purpose (display a 32x32 image and interactive painting), it works well except for a global color change from row 16 with BAMMAX = 7. If I reduce the number of colors (BAMMAX = 5) the bottom part looks good (white background and colors) but the top part colors are shifted!

IMG_0046.jpg
Any idea, thanks for your help.

Code:
/*
* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
 * Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, [url]http://PenguinTech.tk[/url]
 * Use code freely and distort its contents as much as you want, just remeber to thank the 
 * original creaters of the code by leaving their information in the header. :)
 */

//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//Define pins
const uint8_t
//PortC
APIN      = 15, BPIN      = 22, CPIN      = 23, DPIN = 9,
CLOCKPIN  = 10, LATCHPIN  = 13, OEPIN     = 11,
//PortD
R1PIN     = 2, R2PIN     = 8,
G1PIN     = 14, G2PIN     = 6,
B1PIN     = 7, B2PIN     = 20;

uint8_t pinTable[13] = {
    R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
    APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

//Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;
//Acts like a 16 bit shift register
uint16_t const SCLK   = 16;
uint16_t const LATCH  = 32;
uint16_t const OE     = 64;

uint16_t const abcVar[16] = { //Decoder counter var
 //   0,A,B,A+B,C,C+A,C+B,A+B+C,
 //   0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};
0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15}; // need to change a few rows to avoid switching !!
//Data Lines for row 1 red and row 9 red, ect.
uint16_t const RED1   = 1, RED2   = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16;
uint16_t const BLUE1  = 4, BLUE2  = 32;

const uint8_t SIZEX = 32;
const uint8_t SIZEY = 32;

//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7; //now 24bit color! (0-7)
IntervalTimer timer1;

//Test image 32x32
int mario[1024] { 
0xFF0000,0x00FF00,0x0000FF,0xF0C30B,0xCA0BF0,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0x181818,0xF8F8F8,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xF82038,0xF82038,0xF82038,0xF82038,0x181818,0xF0C830,0xF8F8F8,0xF8F8F8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0xE08030,0xF0C830,0xF0C830,0x181818,0xF0C830,0xF8F8F8,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0xF0C830,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xA00000,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0x181818,0x181818,0xE06058,0xF8F8F8,0xF8F8F8,0xE06058,0xF8F8F8,0xE06058,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0x181818,0xE06058,0xE06058,0xF8F8F8,0x181818,0xF8A870,0x181818,0xF8A870,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xF8A870,0x181818,0x181818,0xE06058,0xE06058,0xF8F8F8,0x181818,0xF8A870,0x181818,0x181818,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xF8A870,0xF8A870,0x181818,0x181818,0x181818,0xE06058,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE06058,0xF8A870,0xE06058,0x181818,0xE06058,0xF8A870,0x181818,0xE06058,0xE06058,0xF8A870,0xF8A870,0xF8A870,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE06058,0xE06058,0xE06058,0xF8A870,0x181818,0x181818,0x181818,0x181818,0xE06058,0xE06058,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xE06058,0xE06058,0xF8A870,0xF8A870,0x181818,0x181818,0x181818,0x181818,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xE06058,0xE06058,0xE06058,0xE06058,0xE06058,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x4058B8,0x4058B8,0x4058B8,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0x0000FF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x4058B8,0x7088E8,0x7088E8,0x4058B8,0x181818,0x181818,0x4058B8,0x7088E8,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x4058B8,0x7088E8,0x181818,0x181818,0x181818,0xC80018,0x181818,0x303888,0x4058B8,0x7088E8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x303888,0x181818,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xC80018,0x181818,0x303888,0x4058B8,0x4058B8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x181818,0xF0C830,0xF8F8F8,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xF82038,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xF0C830,0xF0C830,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xF8F8F8,0xF8F8F8,0xF82038,0xC80018,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xF0C830,0xF0C830,0xF0C830,0x181818,0xC80018,0xF8F8F8,0xF8F8F8,0xF82038,0xC80018,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0x181818,0x181818,0x181818,0xC80018,0xF82038,0xF82038,0xF82038,0xF82038,0xC80018,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xC80018,0xC80018,0xC80018,0xC80018,0xF82038,0xF82038,0xC80018,0x181818,0xE08030,0xE08030,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0xC80018,0xA00000,0xC80018,0xC80018,0x181818,0xE08030,0xE08030,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xC80018,0xC80018,0xC80018,0xA00000,0xA00000,0xA00000,0xA00000,0x181818,0xE08030,0xA85000,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0x181818,0xA00000,0xA00000,0xA00000,0xA00000,0xA00000,0x181818,0x181818,0x181818,0x181818,0xE08030,0xA85000,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xE08030,0x181818,0xA00000,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE08030,0xA85000,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xE08030,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xF0C830,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
};

uint8_t gImage[1024][3];
uint8_t gr, gg, gb;

void setup() {
    for(uint8_t i = 0; i < 13; i++){
        pinMode(pinTable[i], OUTPUT);
    }
    
    for (int i = 0; i < 1024; i++) {
        gammaCorrect(mario[i]);
        gImage[i][0] = gr;
        gImage[i][1] = gg;
        gImage[i][2] = gb;
    }
    timerInit();
}

void loop() {       
}

void timerInit() {
    BAM = 0;
    attackMatrix();
}


//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and id done again
void attackMatrix() {
    timer1.end();    

    uint16_t portData;
    portData = 0; // Clear data to enter
    portData |= (abcVar[rowN])|OE; // abc, OE
    portData &=~ LATCH;        //LATCH LOW
    GPIOC_PDOR = portData;  // Write to Port

    for(uint8_t i = 0; i < 32; i++){
         uint16_t tempC[6] = { //Prepare data in correct place
             (gImage[rowN*32+i][0])   , ((gImage[(rowN+16)*32+i][0])<<1),
            ((gImage[rowN*32+i][1])<<2), ((gImage[(rowN+16)*32+i][1])<<3),
            (gImage[rowN*32+i][2])<<4, (gImage[(rowN+16)*32+i][2])<<5  };           
          uint16_t allC =//Put OUTPUT data into temp variable
          ((tempC[0]>>BAM)&RED1)|((tempC[1]>>BAM)&RED2)|
            ((tempC[2]>>BAM)&GREEN1)|((tempC[3]>>BAM)&GREEN2)|
            ((tempC[4]>>BAM)&BLUE1)|((tempC[5]>>BAM)&BLUE2);
        GPIOD_PDOR = (allC); // Transfer data    
        GPIOC_PDOR |=  SCLK;// Clock HIGH
        GPIOC_PDOR &=~ SCLK;// Clock LOW
    }

    GPIOC_PDOR |= LATCH;// Latch HIGH
    GPIOC_PDOR &=~ OE;// OE LOW, Displays line

#define LOOPTIME 1 //trial&error to get both smooth gradients & little flicker
#define CALLOVERHEAD 1
    timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<<BAM)-CALLOVERHEAD);

    if(BAM >= BAMMAX) { //Checks the BAM cycle for next time.    
        if(rowN == 15){
            rowN = 0;
        } 
        else {
            rowN ++;
        }        
        BAM = 0;
    } 
    else {
        BAM ++;
    }
}

void gammaCorrect(int pixel)
{
    float gammaCorrect = 1.0 /0.45;
    gr = uint8_t(255.0 * (pow(((pixel  >> 16) & 0xFF) / 255.0, gammaCorrect)));
    gg = uint8_t(255.0 * (pow(((pixel  >> 8) & 0xFF) / 255.0, gammaCorrect)));
    gb = uint8_t(255.0 * (pow((pixel  & 0xFF) / 255.0, gammaCorrect)));
}
 
Last edited:
By piecing together bits you are doing much more work in the inner loop. Probably you need to increase the delays to get a stable result.
 
Code modified for use with multiple panels

Hi,
here is Benjamin Poilvé's modified code if want to use multiple panels daisy chained

Here is the working code for multiple panels. I added a variable for the number of panels on both teensy code and processing code.
Must set the number of panels variable in both teensy and processing code.

Teensy Code :
Code:
/*
* Modified by Markus Lipp adding interleaved buffers, streaming, 32×32 & 24bit support
* Based on “_16x32_Matrix R3.0″ by Creater Alex Medeiros, http://PenguinTech.tk
* Use code freely and distort its contents as much as you want, just remeber to thank the
* original creaters of the code by leaving their information in the header. :)
**
* 11 June 2014 – modified by Robotpapier: adding multiple panels support to Alex Medeiros who gave me a strating point to tweak the code.
*/

//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//Define pins
const uint8_t
//PortC
APIN = 15, BPIN = 22, CPIN = 23, DPIN = 9,
CLOCKPIN = 10, LATCHPIN = 13, OEPIN = 11,
//PortD
R1PIN = 2, R2PIN = 8,
G1PIN = 14, G2PIN = 6,
B1PIN = 7, B2PIN = 20;

uint8_t pinTable[13] = {
R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

//Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;
//Acts like a 16 bit shift register
uint16_t const SCLK = 16;
uint16_t const LATCH = 32;
uint16_t const OE = 64;

uint16_t const abcVar[16] = { //Decoder counter var
0,A,B,A+B,C,C+A,C+B,A+B+C,
0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};

//Data Lines for row 1 red and row 9 red, ect.
uint16_t const RED1 = 1, RED2 = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16;
uint16_t const BLUE1 = 4, BLUE2 = 32;

const uint8_t NBPANEL = 2;
const uint8_t SIZEX = 32*NBPANEL;
const uint8_t SIZEY = 32;

//Here is where the data is all read
uint8_t interleavedBuffer[SIZEX*SIZEY*4];

//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 4; //now 24bit color! (0-7) // I supposed the more panels we add the less color depth we must use in order to avoid flickering

void setup() {
for(uint8_t i = 0; i =4096*NBPANEL)
{
dataPos=0;
}
else
{
interleavedBuffer[dataPos++] = val;
}
}
}

IntervalTimer timer1;

void timerInit() {
BAM = 0;
attackMatrix();
}

//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and id done again
void attackMatrix() {
timer1.end();

uint16_t portData;
portData = 0; // Clear data to enter
portData |= (abcVar[rowN])|OE; // abc, OE
portData &=~ LATCH; //LATCH LOW
GPIOC_PDOR = portData; // Write to Port

uint8_t *start = &interleavedBuffer[rowN*SIZEX*8+((7-BAMMAX)+BAM)*32*NBPANEL];
for(uint8_t _x = 0; _x < 32*NBPANEL; _x++){
GPIOD_PDOR = start[_x]; // Transfer data
GPIOC_PDOR |= SCLK;// Clock HIGH
GPIOC_PDOR &=~ SCLK;// Clock LOW
}

GPIOC_PDOR |= LATCH;// Latch HIGH
GPIOC_PDOR &=~ OE;// OE LOW, Displays line

#define LOOPTIME 2 //trial&error to get both smooth gradients & little flicker
#define CALLOVERHEAD 2
timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<= BAMMAX) { //Checks the BAM cycle for next time.
if(rowN == 15){
rowN = 0;
} else {
rowN ++;
}
BAM = 0;
} else {
BAM ++;
}
}

Processing code:

Code:
/*processing version of 32*32 led panel with teensy 3.0 or 3.1
Made by benjamin Poilvé http://www.theelectrisquid.fr based on the work of Markus Lipp based on the work by Alex Medeiros!
Enjoy!*/

/* 11 June 2014 – modified by Robotpapier: adding multiple panels support. Thanks to Alex Medeiros who gave me a strating point to tweak the code. Based on Benjamin Poilvé’s code
*/

import processing.serial.*;
int nbPanel = 2; // set number of panel here

//import processing.video.*;

//Capture cam;
Serial serialPort;
PImage img;
byte[] matrixbuff = new byte[4096*nbPanel];

void setup(){

frameRate(100);
size(32*nbPanel, 32);

println(Serial.list());

// Open the port you are using at the rate you want:
serialPort = new Serial(this, Serial.list()[1], 250000);
//String[] cameras = Capture.list();

/* if (cameras.length == 0) {
println(“There are no cameras available for capture.”);
exit();
} else {
println(“Available cameras:”);
for (int i = 0; i < cameras.length; i++) {
println(cameras[i]);
}

// The camera can be initialized directly using an
// element from the array returned by list():
cam = new Capture(this, cameras[12]);
cam.start();
}*/
}

void draw(){
/*if (cam.available() == true) {
cam.read();
}
img=cam.get(0,0,45,45);
*/

background(0);
img = loadImage("test_color.png"); // must be a png the size of all the panels chained
img.resize(32*nbPanel,32);
image(img,0,0);

noSmooth();
stroke(255,255,255);
point(mouseX, mouseY);

//background(127,0,0);
update();

}

void update(){
if (serialPort != null ) {

serialPort.write((byte)(192)); //00001000
serialPort.write((byte)(192)); //00100001

int pIdx = 0;
for (int y = 0; y < 32; y++) {
for (int x = 0; x < 32*nbPanel; x++) {

float ga = 4f;

color c = get(x, y); //img.get(x,y);

int r = int(red(c));
int g = int(green(c));
int b = int(blue(c));

r = (byte)(Math.pow(((float)r)/255.0,ga)*255.0);
g = (byte)(Math.pow(((float)g)/255.0,ga)*255.0);
b = (byte)(Math.pow(((float)b)/255.0,ga)*255.0);

matrixbuff=drawPixel888(x,y,(byte)r,(byte)g,(byte)b,matrixbuff);

pIdx++;
}}

serialPort.write(matrixbuff);
//println(matrixbuff);
}

}

byte[] drawPixel888(int x, int y, byte r, byte g, byte b, byte target[]) {

int rowLength = 32*nbPanel*8;

int targetRow =getTargetRow(y);
boolean targetHigh = getTargetHigh(y);

int baseAddr = targetRow*rowLength;
for (int i=0; i<8; i++)
{
int baseAddrCol = baseAddr+getTargetCol(x,i);
int bit = 1<=16;
}
 
Heyho!
Great project, it worked immediately after connecting everything.
Unfortunately you are using a different pin configuration for connecting the panel than the SmartMatrix Lib uses. But I'd like to use their breakout board and maybe even the Lib itself to stream data to the panel. Now your PC software has the option "Full RGB8 (Teensy MatrixLib)", but was it ment for the SmartMatrix Lib? And how does the Sketch look like?

I've tried and so far failed to understand your concept of the interleaved buffer, but I think, its quite easy to transform it to the Smartmatrix BackBuffer, which consists of three individual buffers, for every color one.

An example for showing a bitmap:
Code:
 rgb24 *buffer;

    buffer = matrix.backBuffer();

    for (i = 0; i < 32 * matrix.getScreenHeight(); i++) {
        buffer[i].red = bitmap.pixel_data[i * 3 + 0];
        buffer[i].green = bitmap.pixel_data[i * 3 + 1];
        buffer[i].blue = bitmap.pixel_data[i * 3 + 2];
    }

It would be great if you could give me a push!

Edit: I've tried to set the interleavedBuffer to a size of 32*32*3 (1024*3 Bytes)
and my loop() looks like:

Code:
void loop() {
  int i;
  rgb24 *buffer;
  buffer = matrix.backBuffer();

  if (Serial.available())
  {     
    prevVal = val;
    val = Serial.read();     

    if ( (prevVal==192 && val==192) || dataPos>=2048+1024)
    {

      for (i = 0; i < 32 * matrix.getScreenHeight(); i++) {
        buffer[i].red = interleavedBuffer[i * 3 + 0];
        buffer[i].green = interleavedBuffer[i * 3 + 1];
        buffer[i].blue = interleavedBuffer[i * 3 + 2];
      }

      matrix.swapBuffers(true);
      dataPos=0;
    }
    else
    {
      interleavedBuffer[dataPos++] = val;
    }

  }  
}

And setting the ScreenStream to Full RGB8 it works.. almost.. Some colors are shifted or some positions are incorrect, but it's close from being the real thing!
Just something isn't right yet.
 
Last edited:
You did it robotpapier! Sorry I couldn't be of any help on that, but I'm very impressed..
We are starting to have some pretty good piece of code for those panels! Anyone up to turning it into a library?
Still great work everybody!
On a somehow related topic, we are currently working on making it work on the WebIO card, (http://www.we-io.net/index.html) my teacher/friend Uros creation!
 
Hi Freto

Markus' youtube video lead me to this thread and your code with the Mario test image motivated me to pick up a Teensy 3.1 and a 32x32 panel to experiment with driving RGB LEDs using BAM modulation. Found a couple of bugs that prevented the image from being displayed correctly. Interesting problem - the picture kinda displays correctly even if you pick the color values wrong.

So it looks like you were playing with the row decoder but left the rows out of order. I removed this and just used nRow as an index

Code:
 //Addresses 1/8 rows Through a decoder
uint16_t const A = 1, B = 2,C = 4, D=8;

...

uint16_t const abcVar[16] = { //Decoder counter var
 //   0,A,B,A+B,C,C+A,C+B,A+B+C,
 //   0+D,A+D,B+D,A+B+D,C+D,C+A+D,C+B+D,A+B+C+D};
0,1,4,5,2,3,6,7,8,9,12,13,10,11,14,15}; // need to change a few rows to avoid switching !!

The reason why the lower half of the image was light blue rather than white was because the code has a logic error in it and not because of ISR overhead. I removed a few intermediate variables and repeated calculations in to minimize ISR execution time. The code runs fine with LOOPTIME and CALLOVERHEAD = 1. Here is the updated code and thanks for an interesting project!!!

Code:
/*
* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
 * Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
 * Use code freely and distort its contents as much as you want, just remeber to thank the 
 * original creaters of the code by leaving their information in the header. :)
 */

//PortC[0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
//PortD[0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
//Define pins
const uint8_t
//PortC
APIN      = 15, BPIN      = 22, CPIN      = 23, DPIN = 9,
CLOCKPIN  = 10, LATCHPIN  = 13, OEPIN     = 11,
//PortD
R1PIN     = 2, R2PIN     = 8,
G1PIN     = 14, G2PIN     = 6,
B1PIN     = 7, B2PIN     = 20;

#define RED 0
#define GRN 1
#define BLU 2

uint8_t pinTable[13] = {
    R1PIN,R2PIN,G1PIN,G2PIN,B1PIN,B2PIN,
    APIN,BPIN,CPIN,DPIN,CLOCKPIN,LATCHPIN,OEPIN};

// bit masks
uint16_t const SCLK   = 16, LATCH  = 32, OE = 64;
uint16_t const RED1   = 1,  RED2   = 8;
uint16_t const GREEN1 = 2,  GREEN2 = 16;
uint16_t const BLUE1  = 4,  BLUE2  = 32;

const uint8_t SIZEX = 32;
const uint8_t SIZEY = 32;

//BAM and interrupt variables
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7; //now 24bit color! (0-7)
IntervalTimer timer1;

//Test image 32x32
int mario[1024] { 
0xFF0000,0x00FF00,0x0000FF,0xF0C30B,0xCA0BF0,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0x181818,0xF8F8F8,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xF82038,0xF82038,0xF82038,0xF82038,0x181818,0xF0C830,0xF8F8F8,0xF8F8F8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0xE08030,0xF0C830,0xF0C830,0x181818,0xF0C830,0xF8F8F8,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0xF0C830,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xA00000,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0x181818,0x181818,0xE06058,0xF8F8F8,0xF8F8F8,0xE06058,0xF8F8F8,0xE06058,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0x181818,0xE06058,0xE06058,0xF8F8F8,0x181818,0xF8A870,0x181818,0xF8A870,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xF8A870,0x181818,0x181818,0xE06058,0xE06058,0xF8F8F8,0x181818,0xF8A870,0x181818,0x181818,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xF8A870,0xF8A870,0x181818,0x181818,0x181818,0xE06058,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0xF8A870,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE06058,0xF8A870,0xE06058,0x181818,0xE06058,0xF8A870,0x181818,0xE06058,0xE06058,0xF8A870,0xF8A870,0xF8A870,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE06058,0xE06058,0xE06058,0xF8A870,0x181818,0x181818,0x181818,0x181818,0xE06058,0xE06058,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xE06058,0xE06058,0xF8A870,0xF8A870,0x181818,0x181818,0x181818,0x181818,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xE06058,0xE06058,0xE06058,0xE06058,0xE06058,0x181818,0x4058B8,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x4058B8,0x4058B8,0x4058B8,0x181818,0x181818,0x181818,0x181818,0x181818,0x181818,0x303888,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0x0000FF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x4058B8,0x7088E8,0x7088E8,0x4058B8,0x181818,0x181818,0x4058B8,0x7088E8,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x4058B8,0x7088E8,0x181818,0x181818,0x181818,0xC80018,0x181818,0x303888,0x4058B8,0x7088E8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x303888,0x181818,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xC80018,0x181818,0x303888,0x4058B8,0x4058B8,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x303888,0x181818,0xF0C830,0xF8F8F8,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xF82038,0x181818,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xF0C830,0xF0C830,0xF8F8F8,0xF8F8F8,0xF8F8F8,0x181818,0xF8F8F8,0xF8F8F8,0xF82038,0xC80018,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0xF0C830,0xF0C830,0xF0C830,0x181818,0xC80018,0xF8F8F8,0xF8F8F8,0xF82038,0xC80018,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0x181818,0x181818,0x181818,0xC80018,0xF82038,0xF82038,0xF82038,0xF82038,0xC80018,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xC80018,0xC80018,0xC80018,0xC80018,0xF82038,0xF82038,0xC80018,0x181818,0xE08030,0xE08030,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xC80018,0xC80018,0xC80018,0xC80018,0xA00000,0xC80018,0xC80018,0x181818,0xE08030,0xE08030,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA00000,0xA00000,0xC80018,0xC80018,0xC80018,0xA00000,0xA00000,0xA00000,0xA00000,0x181818,0xE08030,0xA85000,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0x181818,0xA00000,0xA00000,0xA00000,0xA00000,0xA00000,0x181818,0x181818,0x181818,0x181818,0xE08030,0xA85000,0xA85000,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xE08030,0x181818,0xA00000,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xE08030,0xA85000,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xE08030,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0xA85000,0xF0C830,0xF0C830,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0x181818,0x181818,0x181818,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,0xFFFFFF,
};

uint8_t gImage[1024][3];
uint8_t gr, gg, gb;

void setup() {
    for(uint8_t i = 0; i < 13; i++){
        pinMode(pinTable[i], OUTPUT);
    }
    
    for (int i = 0; i < 1024; i++) {
        gammaCorrect(mario[i]);
        gImage[i][0] = gr;
        gImage[i][1] = gg;
        gImage[i][2] = gb;
    }
    timerInit();
}

void loop() {       
}

void timerInit() {
    BAM = 0;
    attackMatrix();
}

//The updating matrix stuff happens here
//each pair of rows is taken through its BAM cycle
//then the rowNumber is increased and id done again
void attackMatrix() {
    timer1.end();    

    uint16_t portData;
    GPIOC_PDOR = (rowN & 0x0F)|OE; // row select abcd, OE
    GPIOC_PDOR &=~ LATCH;          // LATCH LOW

    for(uint8_t i = 0; i < 32; i++){
          int const pix = rowN*32 + i;
          int const pix1 =(rowN+16)*32+i;
          /* using the BAM counter, isolate bit of interest in the color byte then shift the bit
             into the correct position in port D.  Do for all 6 LEDs                         */
          GPIOD_PDOR =  
          
          (((gImage[pix][RED]) >> BAM) & RED1) | (((gImage[pix1][RED]) >> BAM) << 3 & RED2) |
          ((gImage[pix][GRN] >> BAM) << 1 & GREEN1) | ((gImage[pix1][GRN] >> BAM) << 4 & GREEN2) |
          ((gImage[pix][BLU]>>BAM) << 2 & BLUE1) | ((gImage[pix1][BLU] >> BAM) << 5 & BLUE2);
          GPIOC_PDOR |=  SCLK; // Clock HIGH
          GPIOC_PDOR &= ~SCLK; // Clock LOW
    }

    GPIOC_PDOR |= LATCH;// Latch HIGH
    GPIOC_PDOR &= ~OE;  // OE LOW, Displays line

#define LOOPTIME 1 //trial&error to get both smooth gradients & little flicker
#define CALLOVERHEAD 1

    timer1.begin(attackMatrix,((LOOPTIME+CALLOVERHEAD)<<BAM)-CALLOVERHEAD);  // 1uS ticks

    if(BAM >= BAMMAX) { //Checks the BAM cycle for next time.    
        if(rowN == 15) rowN = 0;  // Hold row constant for a complete BAM cycle
        else rowN ++;        
        BAM = 0;
    } 
    else BAM ++;
}

void gammaCorrect(int pixel)
{
    float gammaCorrect = 1.0 /0.45;
    
    gr = uint8_t(255.0 * (pow(((pixel  >> 16) & 0xFF) / 255.0, gammaCorrect)));
    gg = uint8_t(255.0 * (pow(((pixel  >> 8) & 0xFF) / 255.0, gammaCorrect)));
    gb = uint8_t(255.0 * (pow((pixel  & 0xFF) / 255.0, gammaCorrect)));
}

FullSizeRender (1).jpg
 
movie streaming

Does anyone know how to stream a movie on to a 32x32 panel using an arduino and processing?
 
A few years ago I used a Beaglebone to read a webcam and send the pixels to a pair of Teensy boards at 30 frames/sec. It used the v4l2 library to get the camera data in RGB format.

Maybe it's also possible from Processing? I don't know.
 
Teensy 3.2 USB with 32x32 LED Matrix

Hello all,

I need help. I’m trying to put a LED matrix on my graduation cap. I have completed the circuit build, but I cannot Arduino software for animate gif’s to run without errors. I downloaded it from the library yet the animate gif software is bad. I have no idea how to troubleshoot the software because I don’t have programming skills. Since I cannot get the software to run correctly I cannot upload it to the Teensy. Can anyone help me with this?

Teensy 3.2 USB + Header

32x32 RGB LED Matrix -6mm (MI-T352P6RGB3232-16S-AI-75) PN1484

Smartmatrix SD shield V3 – for Teensy 3.2
 
I just want to say my thanks for this code. I modified the code to make it work with 2 32x16 matrix panels (1/4 scan).
The code is pretty much the same but I need to remap the pinout to make it work with Smartmatrix shield

Code:
/* Modified by Markus Lipp adding interleaved buffers, streaming, 32x32 & 24bit support
* Based on "_16x32_Matrix R3.0" by Creater Alex Medeiros, http://PenguinTech.tk
* Use code freely and distort its contents as much as you want, just remeber to thank the
* original creaters of the code by leaving their information in the header. :)
*/

// Modified by jatty_ to make it work with 2 32x16 matrix (1/4) scan
// gamma8 was taken from adafruit gamma correction https://learn.adafruit.com/led-tricks-gamma-correction/the-issue

#include <TimerOne.h>

// I'm using 2 panels 32x16 (1/4 scan) so every row will shift out 128 data (64 each panel)
#define MAX_WIDTH (128)

int LP = 8;     // Latch Pin		D3
int ClkP = 14; // Clock Pin		D1
int R1P = 2;	   // R1 Pin			D0
int B1P = 6;	   // B1 Pin			D4
int G1P = 5;   // G1 Pin			D7
int R2P = 21; // R2 Pin			D6
int B2P = 20; // B2 Pin			D5
int G2P = 7;  // G2 Pin			D2
int AP = 9;	  // A Pin			C3
int BP = 10;  // B Pin			C4
int CP = 22;  // C Pin			C1
int OEP = 4;  // OE Pin			A13	-- Timer 1 PWM
int row = 0;

// GPIOD -> G1,R2,B2,B1,LAT,G2,CLK,R1
int M_R1 = 1, M_SCK = 2, M_G2 = 4, M_LAT = 8, M_B1 = 16, M_B2 = 32, M_R2 = 64, M_G1 = 128;
// GPIOC -> X, M_C, X, M_A, M_B
uint16_t M_A = 8, M_B = 16, M_C = 2;
IntervalTimer bamTimer;
uint16_t BAM;
uint8_t BAMMAX = 7;
uint16_t const abcVar[4] = { 0, M_A, M_B, M_A | M_B };
uint16_t pwmDuty = 1000;

//Test image 32x32
uint32_t mario[1024] {
	0xFF0000, 0x00FF00, 0x0000FF, 0xF0C30B, 0xCA0BF0, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0x181818, 0xF8F8F8, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0xF82038, 0xF82038, 0xF82038, 0xF82038, 0x181818, 0xF0C830, 0xF8F8F8, 0xF8F8F8, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xC80018, 0xC80018, 0xC80018, 0xE08030, 0xF0C830, 0xF0C830, 0x181818, 0xF0C830, 0xF8F8F8, 0xF0C830, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xC80018, 0xC80018, 0xC80018, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0xF0C830, 0xF0C830, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xA00000, 0xA00000, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0xF0C830, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xA00000, 0x181818, 0x181818, 0xE06058, 0xF8F8F8, 0xF8F8F8, 0xE06058, 0xF8F8F8, 0xE06058, 0x181818, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0x181818, 0xE06058, 0xE06058, 0xF8F8F8, 0x181818, 0xF8A870, 0x181818, 0xF8A870, 0x181818, 0x4058B8, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xF8A870, 0x181818, 0x181818, 0xE06058, 0xE06058, 0xF8F8F8, 0x181818, 0xF8A870, 0x181818, 0x181818, 0x181818, 0x4058B8, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xF8A870, 0xF8A870, 0x181818, 0x181818, 0x181818, 0xE06058, 0xF8A870, 0xF8A870, 0xF8A870, 0xF8A870, 0xF8A870, 0xF8A870, 0x181818, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xE06058, 0xF8A870, 0xE06058, 0x181818, 0xE06058, 0xF8A870, 0x181818, 0xE06058, 0xE06058, 0xF8A870, 0xF8A870, 0xF8A870, 0x181818, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xE06058, 0xE06058, 0xE06058, 0xF8A870, 0x181818, 0x181818, 0x181818, 0x181818, 0xE06058, 0xE06058, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0xE06058, 0xE06058, 0xF8A870, 0xF8A870, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0xE06058, 0xE06058, 0xE06058, 0xE06058, 0xE06058, 0x181818, 0x4058B8, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x4058B8, 0x4058B8, 0x4058B8, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x181818, 0x303888, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0x0000FF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x303888, 0x4058B8, 0x7088E8, 0x7088E8, 0x4058B8, 0x181818, 0x181818, 0x4058B8, 0x7088E8, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x303888, 0x4058B8, 0x7088E8, 0x181818, 0x181818, 0x181818, 0xC80018, 0x181818, 0x303888, 0x4058B8, 0x7088E8, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x303888, 0x303888, 0x181818, 0xF8F8F8, 0xF8F8F8, 0xF8F8F8, 0x181818, 0xC80018, 0x181818, 0x303888, 0x4058B8, 0x4058B8, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x303888, 0x181818, 0xF0C830, 0xF8F8F8, 0xF8F8F8, 0xF8F8F8, 0xF8F8F8, 0x181818, 0xF82038, 0x181818, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0xF0C830, 0xF0C830, 0xF8F8F8, 0xF8F8F8, 0xF8F8F8, 0x181818, 0xF8F8F8, 0xF8F8F8, 0xF82038, 0xC80018, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0xF0C830, 0xF0C830, 0xF0C830, 0x181818, 0xC80018, 0xF8F8F8, 0xF8F8F8, 0xF82038, 0xC80018, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0x181818, 0x181818, 0x181818, 0xC80018, 0xF82038, 0xF82038, 0xF82038, 0xF82038, 0xC80018, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xA00000, 0xC80018, 0xC80018, 0xC80018, 0xC80018, 0xF82038, 0xF82038, 0xC80018, 0x181818, 0xE08030, 0xE08030, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xC80018, 0xC80018, 0xC80018, 0xC80018, 0xA00000, 0xC80018, 0xC80018, 0x181818, 0xE08030, 0xE08030, 0xA85000, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA00000, 0xA00000, 0xC80018, 0xC80018, 0xC80018, 0xA00000, 0xA00000, 0xA00000, 0xA00000, 0x181818, 0xE08030, 0xA85000, 0xA85000, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA85000, 0x181818, 0xA00000, 0xA00000, 0xA00000, 0xA00000, 0xA00000, 0x181818, 0x181818, 0x181818, 0x181818, 0xE08030, 0xA85000, 0xA85000, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA85000, 0xE08030, 0x181818, 0xA00000, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xE08030, 0xA85000, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA85000, 0xE08030, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0xA85000, 0xF0C830, 0xF0C830, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0x181818, 0x181818, 0x181818, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
		0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
};

const uint16_t PROGMEM frameAdx[4096] = {
	1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 0, 1, 2, 3, 4, 5, 6, 7, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 8, 9, 10, 11, 12, 13, 14, 15, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 16, 17, 18, 19, 20, 21, 22, 23, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 24, 25, 26, 27, 28, 29, 30, 31, 3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 32, 33, 34, 35, 36, 37, 38, 39, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 40, 41, 42, 43, 44, 45, 46, 47, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 48, 49, 50, 51, 52, 53, 54, 55, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 56, 57, 58, 59, 60, 61, 62, 63, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 3119, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 64, 65, 66, 67, 68, 69, 70, 71, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 72, 73, 74, 75, 76, 77, 78, 79, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 80, 81, 82, 83, 84, 85, 86, 87, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 88, 89, 90, 91, 92, 93, 94, 95, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 96, 97, 98, 99, 100, 101, 102, 103, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 104, 105, 106, 107, 108, 109, 110, 111, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 112, 113, 114, 115, 116, 117, 118, 119, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 120, 121, 122, 123, 124, 125, 126, 127, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 3176, 3177, 3178, 3179, 3180, 3181, 3182, 3183, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 128, 129, 130, 131, 132, 133, 134, 135, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 136, 137, 138, 139, 140, 141, 142, 143, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 144, 145, 146, 147, 148, 149, 150, 151, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 152, 153, 154, 155, 156, 157, 158, 159, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2183, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 3216, 3217, 3218, 3219, 3220, 3221, 3222, 3223, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 160, 161, 162, 163, 164, 165, 166, 167, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 168, 169, 170, 171, 172, 173, 174, 175, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 176, 177, 178, 179, 180, 181, 182, 183, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 184, 185, 186, 187, 188, 189, 190, 191, 3232, 3233, 3234, 3235, 3236, 3237, 3238, 3239, 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 2216, 2217, 2218, 2219, 2220, 2221, 2222, 2223, 3248, 3249, 3250, 3251, 3252, 3253, 3254, 3255, 2224, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 2232, 2233, 2234, 2235, 2236, 2237, 2238, 2239, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 192, 193, 194, 195, 196, 197, 198, 199, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 200, 201, 202, 203, 204, 205, 206, 207, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 208, 209, 210, 211, 212, 213, 214, 215, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 216, 217, 218, 219, 220, 221, 222, 223, 3264, 3265, 3266, 3267, 3268, 3269, 3270, 3271, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 3280, 3281, 3282, 3283, 3284, 3285, 3286, 3287, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 224, 225, 226, 227, 228, 229, 230, 231, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 232, 233, 234, 235, 236, 237, 238, 239, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 240, 241, 242, 243, 244, 245, 246, 247, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 248, 249, 250, 251, 252, 253, 254, 255, 3296, 3297, 3298, 3299, 3300, 3301, 3302, 3303, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 2280, 2281, 2282, 2283, 2284, 2285, 2286, 2287, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 2288, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 2296, 2297, 2298, 2299, 2300, 2301, 2302, 2303,
	1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 256, 257, 258, 259, 260, 261, 262, 263, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295, 264, 265, 266, 267, 268, 269, 270, 271, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 272, 273, 274, 275, 276, 277, 278, 279, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 280, 281, 282, 283, 284, 285, 286, 287, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 3336, 3337, 3338, 3339, 3340, 3341, 3342, 3343, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 3352, 3353, 3354, 3355, 3356, 3357, 3358, 3359, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 288, 289, 290, 291, 292, 293, 294, 295, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327, 296, 297, 298, 299, 300, 301, 302, 303, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 304, 305, 306, 307, 308, 309, 310, 311, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 312, 313, 314, 315, 316, 317, 318, 319, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 3368, 3369, 3370, 3371, 3372, 3373, 3374, 3375, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359, 3384, 3385, 3386, 3387, 3388, 3389, 3390, 3391, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 320, 321, 322, 323, 324, 325, 326, 327, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 328, 329, 330, 331, 332, 333, 334, 335, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 336, 337, 338, 339, 340, 341, 342, 343, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1375, 344, 345, 346, 347, 348, 349, 350, 351, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 3400, 3401, 3402, 3403, 3404, 3405, 3406, 3407, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 3416, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 352, 353, 354, 355, 356, 357, 358, 359, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, 360, 361, 362, 363, 364, 365, 366, 367, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 368, 369, 370, 371, 372, 373, 374, 375, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 376, 377, 378, 379, 380, 381, 382, 383, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 3447, 2416, 2417, 2418, 2419, 2420, 2421, 2422, 2423, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 2424, 2425, 2426, 2427, 2428, 2429, 2430, 2431, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 384, 385, 386, 387, 388, 389, 390, 391, 1416, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 392, 393, 394, 395, 396, 397, 398, 399, 1424, 1425, 1426, 1427, 1428, 1429, 1430, 1431, 400, 401, 402, 403, 404, 405, 406, 407, 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1439, 408, 409, 410, 411, 412, 413, 414, 415, 3456, 3457, 3458, 3459, 3460, 3461, 3462, 3463, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 3472, 3473, 3474, 3475, 3476, 3477, 3478, 3479, 2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 416, 417, 418, 419, 420, 421, 422, 423, 1448, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 424, 425, 426, 427, 428, 429, 430, 431, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1463, 432, 433, 434, 435, 436, 437, 438, 439, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 440, 441, 442, 443, 444, 445, 446, 447, 3488, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 3512, 3513, 3514, 3515, 3516, 3517, 3518, 3519, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 448, 449, 450, 451, 452, 453, 454, 455, 1480, 1481, 1482, 1483, 1484, 1485, 1486, 1487, 456, 457, 458, 459, 460, 461, 462, 463, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 464, 465, 466, 467, 468, 469, 470, 471, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 472, 473, 474, 475, 476, 477, 478, 479, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 3528, 3529, 3530, 3531, 3532, 3533, 3534, 3535, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 480, 481, 482, 483, 484, 485, 486, 487, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 488, 489, 490, 491, 492, 493, 494, 495, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 496, 497, 498, 499, 500, 501, 502, 503, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 504, 505, 506, 507, 508, 509, 510, 511, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 2552, 2553, 2554, 2555, 2556, 2557, 2558, 2559,
	1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 512, 513, 514, 515, 516, 517, 518, 519, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 520, 521, 522, 523, 524, 525, 526, 527, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 528, 529, 530, 531, 532, 533, 534, 535, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 536, 537, 538, 539, 540, 541, 542, 543, 3584, 3585, 3586, 3587, 3588, 3589, 3590, 3591, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, 3600, 3601, 3602, 3603, 3604, 3605, 3606, 3607, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 2584, 2585, 2586, 2587, 2588, 2589, 2590, 2591, 1568, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 544, 545, 546, 547, 548, 549, 550, 551, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 552, 553, 554, 555, 556, 557, 558, 559, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 560, 561, 562, 563, 564, 565, 566, 567, 1592, 1593, 1594, 1595, 1596, 1597, 1598, 1599, 568, 569, 570, 571, 572, 573, 574, 575, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 2600, 2601, 2602, 2603, 2604, 2605, 2606, 2607, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 3640, 3641, 3642, 3643, 3644, 3645, 3646, 3647, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 1600, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 576, 577, 578, 579, 580, 581, 582, 583, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 584, 585, 586, 587, 588, 589, 590, 591, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 592, 593, 594, 595, 596, 597, 598, 599, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 600, 601, 602, 603, 604, 605, 606, 607, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 3656, 3657, 3658, 3659, 3660, 3661, 3662, 3663, 2632, 2633, 2634, 2635, 2636, 2637, 2638, 2639, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 608, 609, 610, 611, 612, 613, 614, 615, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 616, 617, 618, 619, 620, 621, 622, 623, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 624, 625, 626, 627, 628, 629, 630, 631, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 632, 633, 634, 635, 636, 637, 638, 639, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671, 3696, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 3704, 3705, 3706, 3707, 3708, 3709, 3710, 3711, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, 1664, 1665, 1666, 1667, 1668, 1669, 1670, 1671, 640, 641, 642, 643, 644, 645, 646, 647, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 648, 649, 650, 651, 652, 653, 654, 655, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 656, 657, 658, 659, 660, 661, 662, 663, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 664, 665, 666, 667, 668, 669, 670, 671, 3712, 3713, 3714, 3715, 3716, 3717, 3718, 3719, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 3720, 3721, 3722, 3723, 3724, 3725, 3726, 3727, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 3728, 3729, 3730, 3731, 3732, 3733, 3734, 3735, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 3736, 3737, 3738, 3739, 3740, 3741, 3742, 3743, 2712, 2713, 2714, 2715, 2716, 2717, 2718, 2719, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 672, 673, 674, 675, 676, 677, 678, 679, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 680, 681, 682, 683, 684, 685, 686, 687, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 688, 689, 690, 691, 692, 693, 694, 695, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 696, 697, 698, 699, 700, 701, 702, 703, 3744, 3745, 3746, 3747, 3748, 3749, 3750, 3751, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 2728, 2729, 2730, 2731, 2732, 2733, 2734, 2735, 3760, 3761, 3762, 3763, 3764, 3765, 3766, 3767, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 3768, 3769, 3770, 3771, 3772, 3773, 3774, 3775, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 704, 705, 706, 707, 708, 709, 710, 711, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 712, 713, 714, 715, 716, 717, 718, 719, 1744, 1745, 1746, 1747, 1748, 1749, 1750, 1751, 720, 721, 722, 723, 724, 725, 726, 727, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 728, 729, 730, 731, 732, 733, 734, 735, 3776, 3777, 3778, 3779, 3780, 3781, 3782, 3783, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 3800, 3801, 3802, 3803, 3804, 3805, 3806, 3807, 2776, 2777, 2778, 2779, 2780, 2781, 2782, 2783, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 736, 737, 738, 739, 740, 741, 742, 743, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 744, 745, 746, 747, 748, 749, 750, 751, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783, 752, 753, 754, 755, 756, 757, 758, 759, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 760, 761, 762, 763, 764, 765, 766, 767, 3808, 3809, 3810, 3811, 3812, 3813, 3814, 3815, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 3816, 3817, 3818, 3819, 3820, 3821, 3822, 3823, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, 3824, 3825, 3826, 3827, 3828, 3829, 3830, 3831, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 3832, 3833, 3834, 3835, 3836, 3837, 3838, 3839, 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815,
	1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 768, 769, 770, 771, 772, 773, 774, 775, 1800, 1801, 1802, 1803, 1804, 1805, 1806, 1807, 776, 777, 778, 779, 780, 781, 782, 783, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 784, 785, 786, 787, 788, 789, 790, 791, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 792, 793, 794, 795, 796, 797, 798, 799, 3840, 3841, 3842, 3843, 3844, 3845, 3846, 3847, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 3848, 3849, 3850, 3851, 3852, 3853, 3854, 3855, 2824, 2825, 2826, 2827, 2828, 2829, 2830, 2831, 3856, 3857, 3858, 3859, 3860, 3861, 3862, 3863, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 3864, 3865, 3866, 3867, 3868, 3869, 3870, 3871, 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 800, 801, 802, 803, 804, 805, 806, 807, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 808, 809, 810, 811, 812, 813, 814, 815, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 816, 817, 818, 819, 820, 821, 822, 823, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 824, 825, 826, 827, 828, 829, 830, 831, 3872, 3873, 3874, 3875, 3876, 3877, 3878, 3879, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 3880, 3881, 3882, 3883, 3884, 3885, 3886, 3887, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 3888, 3889, 3890, 3891, 3892, 3893, 3894, 3895, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 832, 833, 834, 835, 836, 837, 838, 839, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 840, 841, 842, 843, 844, 845, 846, 847, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 848, 849, 850, 851, 852, 853, 854, 855, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 856, 857, 858, 859, 860, 861, 862, 863, 3904, 3905, 3906, 3907, 3908, 3909, 3910, 3911, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 3919, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 3920, 3921, 3922, 3923, 3924, 3925, 3926, 3927, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 3928, 3929, 3930, 3931, 3932, 3933, 3934, 3935, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 864, 865, 866, 867, 868, 869, 870, 871, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 872, 873, 874, 875, 876, 877, 878, 879, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 880, 881, 882, 883, 884, 885, 886, 887, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 888, 889, 890, 891, 892, 893, 894, 895, 3936, 3937, 3938, 3939, 3940, 3941, 3942, 3943, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 3960, 3961, 3962, 3963, 3964, 3965, 3966, 3967, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 896, 897, 898, 899, 900, 901, 902, 903, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 904, 905, 906, 907, 908, 909, 910, 911, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 912, 913, 914, 915, 916, 917, 918, 919, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 920, 921, 922, 923, 924, 925, 926, 927, 3968, 3969, 3970, 3971, 3972, 3973, 3974, 3975, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 3976, 3977, 3978, 3979, 3980, 3981, 3982, 3983, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 3984, 3985, 3986, 3987, 3988, 3989, 3990, 3991, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 3992, 3993, 3994, 3995, 3996, 3997, 3998, 3999, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 928, 929, 930, 931, 932, 933, 934, 935, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 936, 937, 938, 939, 940, 941, 942, 943, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 944, 945, 946, 947, 948, 949, 950, 951, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 952, 953, 954, 955, 956, 957, 958, 959, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 4008, 4009, 4010, 4011, 4012, 4013, 4014, 4015, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 4016, 4017, 4018, 4019, 4020, 4021, 4022, 4023, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 4024, 4025, 4026, 4027, 4028, 4029, 4030, 4031, 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 960, 961, 962, 963, 964, 965, 966, 967, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 968, 969, 970, 971, 972, 973, 974, 975, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 976, 977, 978, 979, 980, 981, 982, 983, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 984, 985, 986, 987, 988, 989, 990, 991, 4032, 4033, 4034, 4035, 4036, 4037, 4038, 4039, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 4040, 4041, 4042, 4043, 4044, 4045, 4046, 4047, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 4048, 4049, 4050, 4051, 4052, 4053, 4054, 4055, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 4056, 4057, 4058, 4059, 4060, 4061, 4062, 4063, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 992, 993, 994, 995, 996, 997, 998, 999, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 4064, 4065, 4066, 4067, 4068, 4069, 4070, 4071, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 4072, 4073, 4074, 4075, 4076, 4077, 4078, 4079, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 4080, 4081, 4082, 4083, 4084, 4085, 4086, 4087, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 4088, 4089, 4090, 4091, 4092, 4093, 4094, 4095, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071
};

const uint8_t PROGMEM gamma8[] = {
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,
	2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5,
	5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10,
	10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
	17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
	25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
	37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
	51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
	69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
	90, 92, 93, 95, 96, 98, 99, 101, 102, 104, 105, 107, 109, 110, 112, 114,
	115, 117, 119, 120, 122, 124, 126, 127, 129, 131, 133, 135, 137, 138, 140, 142,
	144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 167, 169, 171, 173, 175,
	177, 180, 182, 184, 186, 189, 191, 193, 196, 198, 200, 203, 205, 208, 210, 213,
	215, 218, 220, 223, 225, 228, 231, 233, 236, 239, 241, 244, 247, 249, 252, 255 };

byte dataBuffer[4096];
byte bufferSwap[4096];

int seed = 4;
byte randNumber;

void setup()
{

	//set pins to output so you can control the shift register
	pinMode(LP, OUTPUT);
	pinMode(ClkP, OUTPUT);
	pinMode(R1P, OUTPUT);
	pinMode(B1P, OUTPUT);
	pinMode(G1P, OUTPUT);
	pinMode(R2P, OUTPUT);
	pinMode(B2P, OUTPUT);
	pinMode(G2P, OUTPUT);
	pinMode(AP, OUTPUT);
	pinMode(BP, OUTPUT);
	pinMode(CP, OUTPUT);
	pinMode(OEP, OUTPUT);
	pinMode(13, OUTPUT);

	digitalWriteFast(AP, LOW);
	digitalWriteFast(BP, LOW);
	digitalWriteFast(CP, LOW);
	Timer1.initialize(100);
	Timer1.pwm(OEP, pwmDuty);
	row = 0;

	//convBuffer();

	timerInit();

	randomSeed(seed);
}

byte testData[6] = {1, 2, 4, 8, 16, 32};
byte ctr = 0;

void loop()
{
	convData2Buffer(mario);
	while(1);
}

void timerInit() {
	BAM = 0;
	attackMatrix();
}

void attackMatrix() {
	bamTimer.end();
	int data = 0;
	Timer1.setPwmDuty(OEP, 1023);
	GPIOC_PDOR = abcVar[row];; // Set Row
	GPIOD_PDOR &= ~M_LAT; // Latch LOW
	byte *start = &dataBuffer[(row * MAX_WIDTH * 8) + (((7 - BAMMAX) + BAM) * MAX_WIDTH)];
	for (uint16_t i = 0; i < MAX_WIDTH; i++)
	{
		GPIOD_PDOR = start[i] | M_SCK;	// Clock HIGH
		GPIOD_PDOR &= ~M_SCK;				// Clock LOW
	}

	GPIOD_PDOR |= M_LAT; // Latch HIGH
	Timer1.setPwmDuty(OEP, pwmDuty);

#define LOOPTIME 2 //trial&error to get both smooth gradients & little flicker
#define CALLOVERHEAD 2
	bamTimer.begin(attackMatrix, ((LOOPTIME + CALLOVERHEAD) << BAM) - CALLOVERHEAD);

	if (BAM >= BAMMAX) { //Checks the BAM cycle for next time.    
		if (row == 3){
			row = 0;
		}
		else {
			row++;
		}
		BAM = 0;
	}
	else {
		BAM++;
	}
}

void convBuffer(byte data[4096]) {
	int t_R1 = 0, t_G1 = 0, t_B1 = 0, t_R2 = 0, t_G2 = 0, t_B2 = 0;
	memset(dataBuffer, 0x00, 4096);

	for (int i = 0; i < 4096; i++)
	{
		t_R1 = ((data[frameAdx[i]] & B00100000) >> 5) * M_R1;
		t_G1 = ((data[frameAdx[i]] & B00010000) >> 4) * M_G1;
		t_B1 = ((data[frameAdx[i]] & B00001000) >> 3) * M_B1;
		t_R2 = ((data[frameAdx[i]] & B00000100) >> 2) * M_R2;
		t_G2 = ((data[frameAdx[i]] & B00000010) >> 1) * M_G2;
		t_B2 = ((data[frameAdx[i]] & B00000001) >> 0) * M_B2;

		dataBuffer[i] = t_R1 | t_G1 | t_B1 | t_R2 | t_G2 | t_B2;
	}
}

void convData2Buffer(uint32_t data[1024]){
	byte buffer[4096];
	int counter = 0;
	for (int i = 0; i < 16; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			for (int k = 0; k < 32; k++)
			{
				uint32_t ptrData = data[(32 * i) + k + (256 * (i/8))];
				uint32_t ptrData2 = data[(32 * i) + k + 256 + (256 * (i / 8))];
				byte r1 = (gamma8[(ptrData >> 16) & 0xFF] >> j) & 0x01;
				byte g1 = (gamma8[(ptrData >> 8) & 0xFF] >> j) & 0x01;
				byte b1 = (gamma8[(ptrData >> 0) & 0xFF] >> j) & 0x01;
				byte r2 = (gamma8[(ptrData2 >> 16) & 0xFF] >> j) & 0x01;
				byte g2 = (gamma8[(ptrData2 >> 8) & 0xFF] >> j) & 0x01;
				byte b2 = (gamma8[(ptrData2 >> 0) & 0xFF] >> j) & 0x01;
				buffer[counter++] = r1 * 32 | g1 * 16 | b1 * 8 | r2 * 4 | g2 * 2 | b2 * 1;

			}
		}
	}

	convBuffer(buffer);

	return;
}
 
how easy is it to get this to run on a smartmatrix 3.x shield? I have a 32x32 screen with a smart matrix shield and a teensy 3.1 I'm not using, and this would be a good way to use it.
 
I have a rpi 3 I'm going to use with a 64x64 display, I wanted to use my 32x32 for something, and this sketch sounds neat..
 
Status
Not open for further replies.
Back
Top