Подключение MAX7219 к Arduino

Драйвер светодиодной матрицы 8×8

MAX7219 к Arduino Uno и Nano по SPI: DIN на D11 (MOSI), CLK на D13 (SCK), CS на D10, питание 5 В. Уровни совпадают, выводы соединяются напрямую.

Схема подключения MAX7219 к Arduino

MAX7219Arduino Uno
CLKD13
CSD10
DIND11
VCC5V
GNDGND

Схема из примера «Arduino Uno: «Жизнь» Конвея на матрице 8×8».

Arduino Uno: «Жизнь» Конвея на матрице 8×8

Открыть пример целиком

Выводы MAX7219

ВыводНазначение
CLKтактовый сигнал
CSзащёлка (LOAD): по фронту данные попадают в регистры
DINвход данных
VCCпитание 5 В
GNDобщий провод

Код для Arduino

// «Жизнь» Конвея на матрице 8×8.
//
// Клетка выживает, если у неё два или три живых соседа, и рождается на
// пустом месте, если соседей ровно три. Больше правил нет — а из них
// получаются мигалки, планеры и целые машины. Здесь поле замкнуто в
// тор: улетевший вправо планер прилетает слева. Если поле вымерло или
// застыло, засеваем новое.

#include <SPI.h>

const int CS = 10;
byte field[8], next[8];
unsigned long generation = 0;

void maxWrite(byte reg, byte v) {
  digitalWrite(CS, LOW); SPI.transfer(reg); SPI.transfer(v); digitalWrite(CS, HIGH);
}

bool alive(int x, int y) { return field[(y + 8) % 8] & (0x80 >> ((x + 8) % 8)); }

void seed() {
  // Планер и мигалка: чтобы сразу было на что посмотреть.
  memset(field, 0, 8);
  field[0] = 0b01000000;
  field[1] = 0b00100000;
  field[2] = 0b11100000;
  field[5] = 0b00001110;
  generation = 0;
  Serial.println(F("новое поле: планер и мигалка"));
}

void step() {
  for (int y = 0; y < 8; y++) {
    next[y] = 0;
    for (int x = 0; x < 8; x++) {
      int n = 0;
      for (int dy = -1; dy <= 1; dy++)
        for (int dx = -1; dx <= 1; dx++)
          if ((dx || dy) && alive(x + dx, y + dy)) n++;
      if (n == 3 || (n == 2 && alive(x, y))) next[y] |= 0x80 >> x;
    }
  }
  bool same = !memcmp(field, next, 8);
  memcpy(field, next, 8);
  generation++;
  int count = 0;
  for (int y = 0; y < 8; y++) for (byte b = field[y]; b; b &= b - 1) count++;
  Serial.print(F("поколение "));
  Serial.print(generation);
  Serial.print(F(", живых "));
  Serial.println(count);
  if (!count || same || generation > 200) seed();
}

void setup() {
  Serial.begin(9600);
  pinMode(CS, OUTPUT);
  SPI.begin();
  maxWrite(0x0F, 0); maxWrite(0x0C, 1); maxWrite(0x0B, 7); maxWrite(0x09, 0); maxWrite(0x0A, 4);
  seed();
}

void loop() {
  for (int y = 0; y < 8; y++) maxWrite(y + 1, field[y]);
  delay(300);
  step();
}

Скетч можно править и запускать в симуляторе без платы и установки среды.

Что учесть на Arduino

Частые ошибки при подключении к Arduino

Другие детали для Arduino