В документации по программированию 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. Поворот матрицы