В документации по программированию Arduino представлен цикл for в следующем виде for (initialization; condition; increment) {body}. Кроме того, в C++ существует цикл for range-based.

Собираем схему и тестируем ПО.

Рис. 1. Принципиальная электрическая схема LED дисплея 8x8 с микросхемой MAX7219 управляемого микроконтроллером ATtiny88.

Цикл for со счётчиком:

for(инициализация счётчика; условие продолжения цикла; операция выполняющаяся после выполнения тела цикла перед проверкой условия) {
  Тело цикла
}

Напишем программу с использованием библиотеки с github.com/aleksandrdior/MaxAndMatrix

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);

void setup() {
  led88.begin(0);
  led88.force(0);
}

void loop() {
  delay(700);
  led88.clear();
  for (int i=0; i<8; i++) {
    delay(700);
    led88.loadByte(i, 0b10000000);
  }
}

Лист. 1. Перебор строк матрицы с установкой старшего бита в строке.

Циклы могут быть вложенными

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);

void setup() {
  led88.begin(0);
  led88.force(0);
}

void loop() {
  delay(100);
  led88.clear();
  for (int i=0; i<8; i++) {
    delay(100);
    for (int j=1; j<256; j = j*2) {
      led88.loadByte(i, j);
      delay(100);
    }
  }
}

Лист. 2. Перебор строк и столбцов матрицы с установкой старшего бита в строке.

Циклы могут быть без тела

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);

void setup() {
  led88.begin(0);
  led88.force(0);
}

void loop() {
  delay(400);
  led88.clear();
  delay(400);
  for (int i=0; i<8; led88.loadByte(i++, 0b10000000), delay(400));
}

Лист. 3. Перебор строк матрицы с установкой старшего бита в строке.

Любые параметры цикла можно пропустить

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);

void setup() {
  led88.begin(0);
  led88.force(0);
  byte i = 0;
  for (;; led88.loadByte(i++%8, 1<<i%64/8), delay(100));
}

void loop() {
}

Лист. 4. Перебор всех битов матрицы по очереди.

 Цикл for in enumeration

Мы так же можем использовать цикл for с перебором в среде Arduino (версия C++ 11):

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);
byte point[] = {0, 1, 2, 4, 8, 16, 32, 64, 128};

void setup() {
  led88.begin(0);
  led88.force(0);
}

void loop() {
  for (byte i : point){
    led88.loadByte(4, i);
    delay(100);
  }
}

Лист. 5. Перебор битов четвёртой строки матрицы.

#include "MaxAndMatrix.h"

int dataPin = 12;                // DIN
int clockPin = 11;               // CLK
int csPin = 10;                  // LOAD (CS)
MaxAndMatrix led88 = MaxAndMatrix(dataPin, clockPin, csPin);

byte matrix[8] = {0b01110001,
                  0b11011011,
                  0b10001110,
                  0b10001100,
                  0b10001000,
                  0b11111111,
                  0b10000001,
                  0b11111111
                 };

void setup() {
  led88.begin(0);
  led88.force(0);
}

void loop() {
  for (int i=0; i<4; i++) {
  led88.setRotation(i);
  led88.loadMatrix(matrix);
  delay(700);
  }
}

Лист. 6. Поворот матрицы