// LED Array
int ledArrayYRow[] =   {22, 23, 24, 25, 26, 27, 28, 29}; // Kathode(-)LED
int ledArrayXCol[] =   {37, 36, 35, 34, 33, 32, 31, 30}; // Anode(+)LED
int intDelayAn = 100;
int intDelayAus = 50;

void setup() {
  
  // LEDArray Ports als Ausgänge setzen
  for(int i=0;i<=7;i++){
    pinMode(ledArrayXCol[i], OUTPUT);
    pinMode(ledArrayYRow[i], OUTPUT);
  }
}
void loop() {
  // Gezielt LED steuern
  switchLED(0, 0);
  switchLED(0, 7);
  switchLED(7, 7);
  switchLED(7, 0);

  // Spalte für Spalte schalten
  SetCol4Col();

  // Zeile für Zeile schalten
  SetRow4Row();

  // Lauflicht Spalte für Spalte
  LaufLEDCol();

  // Lauflicht Zeile für Zeile
  LaufLEDRow();
}
// Funktionen
void SetAllOutputs2Low(){
  // Setze alle Ausgänge auf LOW
  for(int i = 0; i<=7; i++){
      digitalWrite(ledArrayXCol[i], LOW); 
  }
  for(int i = 0; i<=7; i++){
    digitalWrite(ledArrayYRow[i], LOW);
  }
}
void SetAllOutputs2High(){
  // Setze alle Ausgänge auf HIGH damit alle LED "gesperrt" werden
  for(int i = 0; i<=7; i++){
    digitalWrite(ledArrayYRow[i], HIGH);
  }
  for(int i = 0; i<=7; i++){
      digitalWrite(ledArrayXCol[i], HIGH); 
  }
}
void loescheMatrix(){
  // Alle Ausgänge aug die LED-Anoden auf LOW setzen und mit Sperren der Kathoden mit HIGH
  for(int i = 0; i<=7; i++){
      digitalWrite(ledArrayXCol[i], LOW); 
  }
  for(int i = 0; i<=7; i++){
    digitalWrite(ledArrayYRow[i], HIGH);
  }
}
void SetCol4Col(){
  SetAllOutputs2Low(); 
  // Da nun alle LED-Kathoden/Zeilen gegen Gnd gezogen sind, leuchten alle LED's wenn die Spalte auf HIGH geht.
  // Schalte Spalte nach Spalte
  for(int i=0;i<=7;i++){
    digitalWrite(ledArrayXCol[i], HIGH);
    delay(200);
    digitalWrite(ledArrayXCol[i], LOW);
    delay(50);
  }
}

void SetRow4Row(){
  SetAllOutputs2High();
  
  // Schalte Zeile nach Zeile
  for(int i=0;i<=7;i++){
    digitalWrite(ledArrayYRow[i], LOW);
    delay(200);
    digitalWrite(ledArrayYRow[i], HIGH);
    delay(50);
  }
}

void LaufLEDCol(){
  loescheMatrix();
  for(int row=0; row<=7; row++){
    for(int col=0; col<=7; col++){
      digitalWrite(ledArrayXCol[row], HIGH);
      digitalWrite(ledArrayYRow[col], LOW);
      delay(intDelayAn);
      digitalWrite(ledArrayXCol[row], LOW);
      digitalWrite(ledArrayYRow[col], HIGH);
      delay(intDelayAus);
    }
  }
}
void LaufLEDRow(){
  for(int col=0; col<=7; col++){
    for(int row=0; row<=7; row++){
      digitalWrite(ledArrayXCol[row], HIGH);
      digitalWrite(ledArrayYRow[col], LOW);
      delay(intDelayAn);
      loescheMatrix();
      delay(intDelayAus);
    }
  }
}

void switchLED(int Zeile, int Spalte){
  loescheMatrix();
  //Versetze entsprechende LED-Spalte mit 5V HIGH und ziehe entsprechende LED-Kathode auf GND (LOW)
  digitalWrite(ledArrayYRow[Spalte], LOW);
  digitalWrite(ledArrayXCol[Zeile], HIGH);
  delay(intDelayAn * 10);
}