Cambiar caracter en Matriz Led [SOLUCIONADO]

Hola! Veréis, he construido la matriz led de instructables de 24x6 (esta: http://www.instructables.com/id/Make-a-24X6-LED-matrix/?ALLSTEPS) y funciona perfecta. El tema es que el sketch que trae lo que hace es mostrar un texto predefinido, sin posibilidad de animaciones ni nada.

Este es el codigo:

#define LT{B01000000,B01000000,B11100000,B01000000,B01001000,B00110000}
#define LU{B00000000,B00000000,B10001000,B10001000,B10011000,B01101000}
#define LV{B00000000,B00000000,B10001000,B10001000,B01010000,B00100000}
#define LW{B00000000,B00000000,B10001000,B10101000,B10101000,B01010000}
#define LX{B00000000,B10001000,B01010000,B00100000,B01010000,B10001000}
#define LY{B00000000,B10001000,B10001000,B01111000,B00001000,B01110000}
#define LZ{B00000000,B11111000,B00010000,B00100000,B01000000,B11111000}
#define SPACE{B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}

int latchPin = 10;
int clockPin = 13;
int dataPin = 11;
int clock = 9;
int Reset = 8;
int latchPinPORTB = latchPin - 8;
int clockPinPORTB = clockPin - 8;
int dataPinPORTB = dataPin - 8;
int i = 0;
long scrolling_word[6];
int array_turn=0;
byte your_text[10][6]={BH,BO,BL,BA,SPACE,BM,BI,BG,BU,BI};//PUT YOU TEXT HERE


void setup(){
  Serial.begin(9600);
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(latchPin,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(Reset,OUTPUT);
  digitalWrite(Reset,HIGH);
  digitalWrite(Reset,LOW);
  setupSPI();
}

void display_word(int loops,byte word_print[][6],int num_patterns,int delay_langth){// this function displays your symbols
  i = 0;// resets the counter fot the 4017
  for(int g=0;g<6;g++)//resets the the long int where your word goes
    scrolling_word[g] = 0;
  for(int x=0;x<num_patterns;x++){//main loop, goes over your symbols
   // you will need to find a better way to make the symbols scroll my way is limited for 24 columns

   for(int r=0;r<6;r++)//puts the buildes the first symbol
      scrolling_word[r] |= word_print[x][r]; 
    for (int z=0;z<6;z++){//the sctolling action
        for(int p=0;p<6;p++)
          scrolling_word[p] = scrolling_word[p] << 1;
// end of the scrolling funcion
      for(int t=0;t<delay_langth;t++){// delay function, it just loops over the same display
        for(int y=0;y<6;y++){// scaning the display
          if(i == 6){// counting up to 6 with the 4017
            digitalWrite(Reset,HIGH);
            digitalWrite(Reset,LOW);
            i = 0;
          }
          latchOff();
          spi_transfer(make_word(0x01000000,y));// sending the data
          spi_transfer(make_word(0x00010000,y));
          spi_transfer(make_word(0x00000100,y));
          latchOn();
          delayMicroseconds(800);//waiting a bit
          latchOff();
          spi_transfer(0);// clearing the data
          spi_transfer(0);
          spi_transfer(0);
          latchOn();
          digitalWrite(clock,HIGH);//counting up with the 4017
          digitalWrite(clock,LOW);
          i++;
        }
      }
    }
  }
  finish_scroll(delay_langth);
}

void finish_scroll(int delay_scroll){// this function is the same as the funcion above, it just finishing scrolling
  for (int n=0;n<24;n++){
        for(int h=0;h<6;h++)
          scrolling_word[h] = scrolling_word[h] << 1;
      for(int w=0;w<delay_scroll;w++){
        for(int k=0;k<6;k++){
          if(i == 6){
            digitalWrite(Reset,HIGH);
            digitalWrite(Reset,LOW);
            i = 0;
          }
          latchOff();
          spi_transfer(make_word(0x01000000,k));
          spi_transfer(make_word(0x00010000,k));
          spi_transfer(make_word(0x00000100,k));
          latchOn();
          delayMicroseconds(800);
          latchOff();
          spi_transfer(0);
          spi_transfer(0);
          spi_transfer(0);
          latchOn();
          digitalWrite(clock,HIGH);
          digitalWrite(clock,LOW);
          i++;
        }
      }
    }
}

byte make_word (long posistion,byte turn){
  byte dummy_word = 0;
  for(int q=0;q<8;q++){
    if(scrolling_word[turn] & (posistion<<q))
      dummy_word |= 0x01<<q;
  }
  return dummy_word;
}   


  void loop() {

        display_word(1,your_text,10,15);// calls for the display_pattern function and says that int loop = 15(if you do more loop the pattern whould scrole slower).
   
       }
  
  

void latchOn(){
  bitSet(PORTB,latchPinPORTB);
}

void latchOff(){
  bitClear(PORTB,latchPinPORTB);
}


void setupSPI(){
  byte clr;
  SPCR |= ( (1<<SPE) | (1<<MSTR) ); // enable SPI as master
  //SPCR |= ( (1<<SPR1) | (1<<SPR0) ); // set prescaler bits
  SPCR &= ~( (1<<SPR1) | (1<<SPR0) ); // clear prescaler bits
  clr=SPSR; // clear SPI status reg
  clr=SPDR; // clear SPI data reg
  SPSR |= (1<<SPI2X); // set prescaler bits
  //SPSR &= ~(1<<SPI2X); // clear prescaler bits

  delay(10);
}
byte spi_transfer(byte data)
{
  SPDR = data;			  // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;			  // return the received byte, we don't need that
}

Me gustaría hacer alguna animación, aunque fuera sencilla y para ello, había pensado en cambiar el valor de los #define en mitad del loop que dibuja los caracteres y así conseguir una animación. El tema es que no se como hacerlo. He probado a insertar otro loop dentro del mismo pero nada, estoy muy perdido.
Espero que alguno pueda guiarme un poco.

PD: He eliminado varios define por no excederme en longitud en el mensaje.

Muchas gracias y un saludo!!

Vale, he conseguido avanzar algo. Supongo que aunque no tenga respuesta de nadie mis avances igual ayudan a alguien en un futuro. Al grano, con este código e conseguido "dibujar" lo que quiera en la matriz:

// Cada bloque indica un grupo de ocho leds, de izquierda a derecha y cada cifra el led
int A[18] = {B00000000,B11111111,B00000001,B00000000,B00000000,B11111111,B00000000,B00000000,B00000100,B00000000,B00000000,B00001000,B00000000,B00000000,B00010000,B00000000,B00000000,B00100000};

byte n[3] = {B00000000,B00000000,B00000001};

int latchPin = 10;
int clockPin = 13;
int dataPin = 11;
int clock = 9;
int Reset = 8;
int j = 6;

void setup(){
  Serial.begin(9600);
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(latchPin,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(Reset,OUTPUT);
  digitalWrite(Reset,HIGH);
  digitalWrite(Reset,LOW);
}

void loop(){

// Select the first row
  digitalWrite(Reset,HIGH);
  digitalWrite(Reset,LOW);

  for(int i=0;i<5;i++)  // For each row
    {
    // Send 24 bits to the shift registers
    shiftOut(dataPin, clockPin, MSBFIRST, A[i*3]);
    shiftOut(dataPin, clockPin, MSBFIRST, A[i*3+1]);
    shiftOut(dataPin, clockPin, MSBFIRST, A[i*3+2]);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    delay(4); // Keep the row lit for a bit.  Increase delay to increase brightness.  Decrease to reduce flicker.

    // Clear the row so we can go on to the next row without smearing
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    shiftOut(dataPin, clockPin, MSBFIRST, 0);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);

    // On to the next row.
    digitalWrite(clock,HIGH);
    digitalWrite(clock,LOW);
  }      
 }

La variable "A" es el patrón de dibujo, ahora mi idea es poder alternar entre varios patrones por así decirlo con un delay predefinido y conseguir esa animación. A ver si alguien me ayuda :slight_smile:

Bueno pues con ayuda de mi primo ya conseguí lo que quería, lo dejo aquí por si a alguien le sirve:

#define NUM_LETRAS 6  //define el numero de patrones
int letras[6][18] = {  //lo mismo, numero de patrones
  {B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000},
  {B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000},
  {B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000},
  {B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000},
  {B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000,B00000000,B00000000,B11110000},
  {B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111,B00000000,B00000000,B00001111},

};
byte n[3] = {B00000000,B00000000,B00000001};
int latchPin = 10;
int clockPin = 13;
int dataPin = 11;
int clock = 9;
int Reset = 8;
int j = 6;
void setup(){
  Serial.begin(9600);
  pinMode(dataPin,OUTPUT);
  pinMode(clockPin,OUTPUT);
  pinMode(latchPin,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(Reset,OUTPUT);
  digitalWrite(Reset,HIGH);
  digitalWrite(Reset,LOW);
}
void loop(){
// Select the first row
  digitalWrite(Reset,HIGH);
  digitalWrite(Reset,LOW);
  for(int letra = 0 ; letra < NUM_LETRAS ; letra++ )
  {
    for(int i=0;i<=5;i++)  // For each row
    {
      // Send 24 bits to the shift registers
      shiftOut(dataPin, clockPin, MSBFIRST, letras[letra][i*3]);
      shiftOut(dataPin, clockPin, MSBFIRST, letras[letra][i*3+1]);
      shiftOut(dataPin, clockPin, MSBFIRST, letras[letra][i*3+2]);
      digitalWrite(latchPin, HIGH);
      digitalWrite(latchPin, LOW);
      delay(3); // Este delay define el tiempo en reproducir cada patron.  Increase delay to increase brightness.  Decrease to reduce flicker.
      // Clear the row so we can go on to the next row without smearing
      shiftOut(dataPin, clockPin, MSBFIRST, 0);
      shiftOut(dataPin, clockPin, MSBFIRST, 0);
      shiftOut(dataPin, clockPin, MSBFIRST, 0);
      digitalWrite(latchPin, HIGH);
      digitalWrite(latchPin, LOW);
      // On to the next row.
      digitalWrite(clock,HIGH);
      digitalWrite(clock,LOW);
    }
    digitalWrite(Reset,HIGH);
    digitalWrite(Reset,LOW);
    delay(50); //este delay define el tiempo en cambiar de un patron a otro
    if(letra == (NUM_LETRAS -1) ) {
      letra = -1;
    }
  }      
 }

Un saludo