// Бегущая точка по матрице MAX7219 8x8
// Порядок движения: сверху вниз, в каждой строке — справа налево.
const byte PIN_CS = 10;
const byte PIN_CLK = 13;
const byte PIN_DIN = 11;
void sendByte(byte value) {
for (int bit = 7; bit >= 0; bit--) {
digitalWrite(PIN_CLK, LOW);
digitalWrite(PIN_DIN, (value >> bit) & 1);
digitalWrite(PIN_CLK, HIGH);
}
}
void writeRegister(byte address, byte value) {
digitalWrite(PIN_CS, LOW);
sendByte(address);
sendByte(value);
digitalWrite(PIN_CS, HIGH);
}
void clearMatrix() {
for (byte row = 1; row <= 8; row++) {
writeRegister(row, 0x00);
}
}
void setup() {
pinMode(PIN_CS, OUTPUT);
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_DIN, OUTPUT);
digitalWrite(PIN_CS, HIGH);
digitalWrite(PIN_CLK, LOW);
writeRegister(0x0F, 0x00); // display test off
writeRegister(0x0C, 0x01); // normal operation
writeRegister(0x0B, 0x07); // scan all 8 rows
writeRegister(0x09, 0x00); // no decode
writeRegister(0x0A, 0x08); // brightness
clearMatrix();
}
void loop() {
// Старший бит — левый столбец, поэтому 0-й столбец — справа.
for (byte row = 0; row < 8; row++) {
for (int column = 0; column < 8; column++) {
clearMatrix();
// Для этой ориентации матрицы движение справа налево.
byte pixel = 0x01 << column;
writeRegister(row + 1, pixel);
delay(120); // скорость движения точки
}
}
}