# Understanding timnig for an LED matrix

Hello arduino community. I’m trying to take my LED matrix to the next level and make it scroll. the only problem is that i still don’t fully understand the timing piece of the code that allows the letters to be displayed statically. In the timing piece of the code a while loop runs like so: while ((start+letdelay)>millis()); where start was defined as millis() and letdelay is a global variable of any number i give it for delay. wouldn’t start+letdelay always be greater than millis()? I have no idea why this works, any help would be appreciated. I have posted this question a few times a couple months ago but never received a straight up answer that was understandable.

The specific function that contains the while loop is in the void show function

/* Hopefully the last LED matrix code I ever make

BY: Chris Yambo
*/

int CPR = 8;  // clock pin row
int DPR = 10; // data pin row
int CPC = 11; // clock pin column
int DPC = 12; // data pin column
int LP = 9;   // combined the latch pins so theres only one

byte RA[] = {B10000000, B01000000, B00100000, B00010000, B00001000,}; // way to address rows individually
byte letters[27][5] = {

{B10001000, B10001000, B11111000, B10001000, B11111000}, // A 0
{B11111000, B10001000, B11110000, B10001000, B11111000}, // B 1
{B11111000, B10001000, B10000000, B10001000, B11111000}, // C 2
{B11110000, B10001000, B10001000, B10001000, B11110000}, // D 3
{B11111000, B10000000, B11110000, B10000000, B11111000}, // E 4
{B10000000, B10000000, B11110000, B10000000, B11111000}, // F 5
{B11111000, B10001000, B10011000, B10000000, B11111000}, // G 6
{B10001000, B10001000, B11111000, B10001000, B10001000}, // H 7
{B01000000, B01000000, B01000000, B01000000, B01000000}, // I 8
{B11111000, B10001000, B00001000, B00001000, B00001000}, // J 9
{B10001000, B10010000, B11100000, B10010000, B10001000}, // K 10
{B11111000, B10000000, B10000000, B10000000, B10000000}, // L 11
{B10101000, B10101000, B10101000, B10101000, B11011000}, // M 12
{B10001000, B10011000, B10101000, B11001000, B10001000}, // N 13
{B11111000, B10001000, B10001000, B10001000, B11111000}, // O 14
{B10000000, B10000000, B11111000, B10001000, B11111000}, // P 15
{B11111000, B10011000, B10001000, B10001000, B11111000}, // Q 16
{B10001000, B10010000, B11111000, B10001000, B11111000}, // R 17
{B11111000, B00001000, B11111000, B10000000, B11111000}, // S 18
{B00100000, B00100000, B00100000, B00100000, B11111000}, // T 19
{B11111000, B10001000, B10001000, B10001000, B10001000}, // U 20
{B00100000, B01010000, B10001000, B10001000, B10001000}, // V 21
{B11011000, B10101000, B10101000, B10101000, B10101000}, // W 22
{B10001000, B01010000, B00100000, B01010000, B10001000}, // X 23
{B11111000, B00001000, B11111000, B10001000, B10001000}, // Y 24
{B11111000, B01000000, B00100000, B00010000, B11111000}, // Z 25
{B00000000, B00000000, B00000000, B00000000, B00000000}, // Space to shift out use number 91
};

byte scrollarray[1][5] = {
};

int letdelay = 650;                             // delay between letters
String message = "YAMBO ";             /////WHATS GOING TO BE DISPLAYED Most important part of code/////
int msglength = message.length();               //stores length of message string
int shiftdelay = 145;                           //int for later

//-----------------------------------------------------------------------------------------------------------------------------------------------
void setup() {

pinMode(CPR, OUTPUT);
pinMode(DPR, OUTPUT);
pinMode(CPC, OUTPUT);                         // setting pins as outputs
pinMode(DPC, OUTPUT);
pinMode(LP, OUTPUT);

Serial.begin(9600);
//-----------------------------------------------------------------------------------------------------------------------------------------------
}

void loop() {
unsigned long start = millis();                 //Begin timing the animation
unsigned long start2 = start + letdelay;
Serial.print(start2);
Serial.print(',');
Serial.print(start);
Serial.print(',');
Serial.print(millis());
Serial.println();

}
//-----------------------------------------------------------------------------------------------------------------------------------------------
void shiftout(int letter, int shiftamt){                                    //function to shift out any letter in the letters array
for(int j=0; j<5; j++)
{
byte x = letters[letter - 'A'][j];
byte y = x << shiftamt;
digitalWrite(LP, LOW);                                      //latch pin low
shiftOut(DPR, CPR, LSBFIRST, RA[j]);                        //wries row activator to the rows
shiftOut(DPC, CPC, LSBFIRST, y);         //goes to the yarray letter of the array and shifts out each byte one at a time using j
digitalWrite(LP, HIGH);                                     //latch pin high sshifting everything into registers
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------
void shiftoutscroll(){                                //function to shift out any lettr in the scroll array
for(int j=0; j<5; j++)
{
digitalWrite(LP, LOW);                                      //latch pin low
shiftOut(DPR, CPR, LSBFIRST, RA[j]);                        //wries row activator to the rows
shiftOut(DPC, CPC, LSBFIRST, scrollarray[0][j]);           //goes to the yarray letter of the array and shifts out each byte one at a time using j
digitalWrite(LP, HIGH);                                     //latch pin high sshifting everything into registers
}
}

//-----------------------------------------------------------------------------------------------------------------------------------------------

void show(){                                        // function to display letters statically one after the other
for(int j=0; j<msglength; j++)                    // counts up to the number of characters in the message
{
int character = message.charAt(j);              // puts the letter of the whatever character the counter is on into an integer called character
unsigned long start = millis();                 //Begin timing the animation
while(start + letdelay > millis())              // display each letter for duraton period STILL DONT UNDERSTAND
{
if(character == 32)                           // if the character is a space display a zero. If you dont do this it glitches on spaces
{
shiftout(91, 0);                               // 91 - 'A'or65 is 26 which is the space on the letters array
}

else                                          // this displays letters
{
shiftout(character, 0);                        //shifts out the letter from the array
}
}

if(message.charAt(j + 1) == character)          //for words with two of the same letter next to eachother, it puts a space between them
{

digitalWrite(LP, LOW);
shiftOut(DPR, CPR, LSBFIRST, 0);
shiftOut(DPC, CPC, LSBFIRST, 0);
digitalWrite(LP, HIGH);                       //100 ms delay between two of the same letter
delay(100);
}

}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------
void scroll(){
byte test = {B00001000};
byte x;
int q;
int j = message.charAt(q);
int k = message.charAt(q+1);
shiftout(j, 0);

/*
for(int z=0; z<5; z++)
{
int q = message.charAt(z);
byte t = (letters[0][z] << 2);
byte x = bitWrite(t, 3, y);
scrollarray[0][z] = x;

}
*

shiftoutscroll();
// use | to combine bytes MAYBE!
*/

}

So what makes you think that an explanation now will be more understandable. It is not a question with a straight up and down answer as you call it. It is an answer that requires a bit of thought an knowlage about programming.

That code you posted can not possibly work as nothing is called from the loop function. Do not call it void loop because void is the sort of variable it returns and nothing to do with the function's name.