¿Como deplazar texto verticalmente en una matriz de leds?

Hola, alguien sabe como hacer el desplazamiento vertical en arduino en ide sin librerias externas adjunto codigo de desplazamiento horizontal

int times = 10;
int D = 0;
int K = 0;

byte I[22]={255,255,255, 60, 60, 0, 0, 60, 60, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte T[22]={255,255,255, 252, 252, 0, 0, 252, 252, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte V[22]={255,255,225, 199, 159, 63, 63, 159, 199, 225,255,255,255,255,255,255,255,255,255,255,255,255};

byte F[22]={255,255,255, 0, 0, 228, 228, 252, 255, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte S[22]={255,255,255, 49, 36, 36, 36, 140, 255, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte CC[22]={255,255,255, 129, 0, 60, 60, 60, 24, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte H[22]={255,255,255, 0, 0, 231, 231, 0, 0, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte M[22]={255,255,0, 0, 249, 243, 243, 249, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255};
byte A[22]={255,255,255, 3, 1, 204, 204, 1, 3, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte N[22]={255,255,0, 0, 240, 227, 143, 31, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255};
byte NN[20]={255,255,0, 0, 240, 227, 143, 31, 0, 0,255,255,255,255,255,255,255,255,255,255};

byte emo1[22]={255, 255, 255, 231, 231, 255, 255, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte emo2[22]={255, 255, 195, 219, 219, 195, 255, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte emo3[20]={255, 129, 145, 157, 157, 145, 129, 255,255,255,255,255,255,255,255,255,255,255,255,255};
byte emo4[20]={129, 110, 82, 94, 94, 82, 110, 129,255,255,255,255,255,255,255,255,255,255,255,255};


void setup() {
  DDRD = B11111111;

  for (int x=9;x<19;x++){
    pinMode(x,OUTPUT);
  } 

}

void loop() {
  ITV();
  //itv();
  fischmann();
  emoji();
}

void ITV(){
  delay(1000);
  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = I[D+chars];


      }
    }
  }

  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = T[D+chars];


      }
    }
  }
  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = V[D+chars];


      }
    }
  }
}
void fischmann(){
    for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = F[D+chars];


      }
    }
  }
    for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = I[D+chars];


      }
    }
  }
    for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = S[D+chars];


      }
    }
  }
      for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = CC[D+chars];


      }
    }
  }
        for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = H[D+chars];


      }
    }
  }
          for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = M[D+chars];


      }
    }
  }
          for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = A[D+chars];


      }
    }
  }
          for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = N[D+chars];


      }
    }
  }
          for(int chars=0;chars<8;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = NN[D+chars];


      }
    }
  }
}

void emoji(){
    for(int reps=0;reps<times;reps++){
     for(int C=8;C<16;C++){
      PORTD = emo1[D];
      D++;if(D>7){D=0;}
      digitalWrite(C,HIGH);
      delay(1);
      digitalWrite(C,LOW);

    }
  }

    for(int reps=0;reps<times;reps++){
    for(int C=8;C<16;C++){
      PORTD = emo2[D];
      D++;if(D>7){D=0;}
      digitalWrite(C,HIGH);
      delay(1);
      digitalWrite(C,LOW);

    }
  }
    for(int reps=0;reps<times;reps++){
    for(int C=8;C<16;C++){
      PORTD = emo3[D];
      D++;if(D>7){D=0;}
      digitalWrite(C,HIGH);
      delay(1);
      digitalWrite(C,LOW);

    }
  }
    for(int reps=0;reps<100;reps++){
    for(int C=8;C<16;C++){
      PORTD = emo4[D];
      D++;if(D>7){D=0;}
      digitalWrite(C,HIGH);
      delay(1);
      digitalWrite(C,LOW);

    }
  }
}

void itv(){
    DDRD = B00000000;

  for (int x=9;x<19;x++){
    pinMode(x,INPUT);
  } 
 delay(1000);
  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = I[D+chars];


      }
    }
  }

  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = T[D+chars];


      }
    }
  }
  for(int chars=0;chars<10;chars++){
    for(int reps=0;reps<times;reps++){
      for(int C=8;C<16;C++){
        D++; if(D>7){D=0;}
        digitalWrite(C,HIGH);
        delay(1);
        digitalWrite(C,LOW);
        PORTD = V[D+chars];


      }
    }
  }
}





El desplazador horizontal lee el primer bit de cada fila de LED y luego activa o desactiva el LED. De forma similar, el desplazamiento vertical lee el primer bit de cada columna (igual que leer el byte).

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @carrillo_9000.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.