morse over 8 leds

Voor een radioamateur doeleinde ben ik bezig om morse via 8 leds door te sturen, ieder opvolgend led moet een letter zijn. Bijvoorbeeld .- staat voor A, B -... , C -.-. , enz. Als het woord langer is dan 8 letters, moet het vanaf led 1 verder gaan. Dit in een loop. Ik heb me al gek gezocht, maar ik geraak er niet aan uit. Ik ben er al lang mee bezig, doch ik moet toegeven dat zonder wat hulp het me niet zal lukken. Dit is mijn code dat een beetje werkt, maar het geeft voor elke . en - 8x hetzelfde. Veel dank voor wie me op de juiste weg wilt zetten.

int PIN_LEDS[] = {2,3,4,5,6,7,8,9};

#define UNIT_LENGTH    150
int k;
int p;
static const struct {const char letter, *code;} MorseMap[] =
{
  { 'A', ".-" },
  { 'B', "-..." },
  { 'C', "-.-." },
  { 'D', "-.." },
  { 'E', "." },
  { 'F', "..-." },
  { 'G', "--." },
  { 'H', "...." },
  { 'I', ".." },
  { 'J', ".---" },
  { 'K', ".-.-" },
  { 'L', ".-.." },
  { 'M', "--" },
  { 'N', "-." },
  { 'O', "---" },
  { 'P', ".--." },
  { 'Q', "--.-" },
  { 'R', ".-." },
  { 'S', "..." },
  { 'T', "-" },
  { 'U', "..-" },
  { 'V', "...-" },
  { 'W', ".--" },
  { 'X', "-..-" },
  { 'Y', "-.--" },
  { 'Z', "--.." },
  { ' ', "     " },  
    
  { '1', ".----" },
  { '2', "..---" },
  { '3', "...--" },
  { '4', "....-" },
  { '5', "....." },
  { '6', "-...." },
  { '7', "--..." },
  { '8', "---.." },
  { '9', "----." },
  { '0', "-----" },
    
  { '.', "·–·–·–" },
  { ',', "--..--" },
  { '?', "..--.." },
  { '!', "-.-.--" },
  { ':', "---..." },
  { ';', "-.-.-." },
  { '(', "-.--." },
  { ')', "-.--.-" },
  { '"', ".-..-." },
  { '@', ".--.-." },
  { '&', ".-..." },
};

void setup() {

  for (p = 0; p <= 7; p++) {

      pinMode( PIN_LEDS[p], OUTPUT );
  }
}
void loop()
{

  String morseWord = encode( "demo morse programma " );
    
  for(int i=0; i<=morseWord.length(); i++)
   for (k = 0; k <= 7; k++)
{
  {
    switch( morseWord[i] )
    {
      case '.': 
        digitalWrite( PIN_LEDS[k], HIGH );
        delay( UNIT_LENGTH );
        digitalWrite( PIN_LEDS[k], LOW );
        delay( UNIT_LENGTH );
          
        break;

      case '-': 
        digitalWrite( PIN_LEDS[k], HIGH );
        delay( UNIT_LENGTH*3 );
        digitalWrite( PIN_LEDS[k], LOW );
        delay( UNIT_LENGTH );
          
        break;

      case ' ': //gap
        delay( UNIT_LENGTH );

    }
  }
}
}

String encode(const char *string)
{
  size_t i, j;
  String morseWord = "";
  
  for( i = 0; string[i]; ++i )
  {
    for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j )
    {
      if( toupper(string[i]) == MorseMap[j].letter )
      {
        morseWord += MorseMap[j].code;
        break;
      }
    }
    morseWord += " "; 
  }

  return morseWord;  
}

String decode(String morse)
{

  String msg = "";
  
  int lastPos = 0;
  int pos = morse.indexOf(' ');
  while( lastPos <= morse.lastIndexOf(' ') )
  {    
    for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i )
      
    {
      if( morse.substring(lastPos, pos) == MorseMap[i].code )
      {
        
        msg += MorseMap[i].letter;
      
      }
    }

    lastPos = pos+1;
    pos = morse.indexOf(' ', lastPos);
    
    while( morse[lastPos] == ' ' && morse[pos+1] == ' ' )
    {
      pos ++;
    }
  }

  return msg;
}

Probeer het eerst eens met een simpele led en dan elke letter achter elkaar, dat zal je vast lukken zeker met de code die je nu gebruikt,
Je grote probleem zit hem in het gebruik van delay,je kunt dan niets meer terwijl de processor gewoon stilstaat.
Dat kun je oplossen door het gebruik van millis(),je moet dan gaan bijhouden wanneer je iets aanzet en zo, dat kan simpel in een array.
Dat zul je dus voor elke led apart moeten gaan doen, daardoor heb je dus tijden van elke led apart in een array staan.
ook zul je dus 8 letters tegelijk moeten doen.
Heb deze toepassing overigens nog nooit gezien, want het is al lastig om morse met 1 led te doen laat staan met 8.