Светодиодная матрица 8×8, общий анод

Светодиодная матрица — еще одно устройство, которое может выполнять функцию индикации, а в некоторых случаях и функцию дисплея.

Светодиодная матрица может отображать информацию как в статичном режиме, так и в режиме каскадного переливания. Главная особенность такого матричного дисплея – возможность объединения с такими же дисплеями с целью сборки большого табло.

Управление всеми сегментами производится через последовательный SPI интерфейс с любых микроконтроллеров Arduino. Для подключения светодиодной матрицы требуется либо специальный драйвер, либо сдвиговый регистр.

Программирование светодиодной матрицы — это очень увлекательное занятие. Фактически, управление матрицей сводится к управлению конкретным светодиодом на пересечении строк и и столбцов схемы.

Схема подключения светодиодной матрицы 8×8, общий анод

Ниже представлена схема подключения светдиодной матрицы к контроллеру через сдвиговые регистры.

Код для подключения светодиодной матрицы 8×8, общий анод

С помощью кода, представленного ниже, можно подключить светодиодную матрицу к контроллеру.

#define data_pin 2     //data_pin 1-го регистра
#define st_pin 3      //latch_pin общий
#define sh_pin 4     //clock_pin 1-го регистра
#define data_pin2 5 //data_pin 2-го регистра
#define sh_pin2 6  //clock_pin 2-го регистра

byte pic0[8] {
  0b01111111,
  0b10111111,
  0b11011111,
  0b11101111,
  0b11110111,
  0b11111011,
  0b11111101,
  0b11111110
};
//массив pic0 не трогаем, по нему отключаются логические единицы на сроках

byte pic[8] {
  0b10111011,
  0b11101110,
  0b00000000,
  0b10111011,
  0b11101110,
  0b00000000,
  0b10111011,
  0b11101110
};
//в этом массиве создаем картинку построчно, единицы обозначают зажженные светодиоды, нули - погашенные

byte cifra[10][8] {
  { B00001110,
    B00011011,
    B00011011,
    B00011011,
    B00011011,
    B00011011,
    B00001110,
    B00000000
  },
  { B00000010,
    B00000110,
    B00001110,
    B00000110,
    B00000110,
    B00000110,
    B00000110,
    B00000000
  },
  {
    B00001110,
    B00011011,
    B00000011,
    B00000110,
    B00001100,
    B00011000,
    B00011111,
    B00000000
  },
  {
    B00001110,
    B00011011,
    B00000011,
    B00001110,
    B00000011,
    B00011011,
    B00001110,
    B00000000
  },
  {
    B00000011,
    B00000111,
    B00001111,
    B00011011,
    B00011111,
    B00000011,
    B00000011,
    B00000000
  },
  {
    B00011111,
    B00011000,
    B00011110,
    B00000011,
    B00000011,
    B00011011,
    B00001110,
    B00000000
  },
  {
    B00001110,
    B00011011,
    B00011000,
    B00011110,
    B00011011,
    B00011011,
    B00001110,
    B00000000
  },
  {
    B00011111,
    B00000011,
    B00000110,
    B00001100,
    B00001100,
    B00001100,
    B00001100,
    B00000000
  },
  {
    B00001110,
    B00011011,
    B00011011,
    B00001110,
    B00011011,
    B00011011,
    B00001110,
    B00000000
  },
  {
    B00001110,
    B00011011,
    B00011011,
    B00001111,
    B00000011,
    B00011011,
    B00001110,
    B00000000
  },
};
//в этом массиве хранятся изображния цифр

void setup() {
  //включаем передачу данных по последовательному порту
  Serial.begin(9600);
  //задаем режим OUTPUT ( выход )
  for ( int i = 2; i < 7; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  //output(массив с изображением);
  if (Serial.available() > 0) {     //ожидание доступных данных в com порте
    int cif = Serial.read() - '0'; //считывние данных из com порта 
      output(cifra[cif]);         //вывод цифры
  }
  obnulenie();
}

void obnulenie() {
  //в этом блоке гаснет вся матрица, при необходимости - использовать
  digitalWrite(st_pin, 0);
  shiftOut(data_pin, sh_pin, MSBFIRST, 0b11111111);
  shiftOut(data_pin2, sh_pin2, MSBFIRST, 0b00000000);
  digitalWrite(st_pin, 1);
}

void output(byte picture[8]) {
  //в этом блоке осуществляется вывод изображения на экран длительностью в 1 секунду (125*8мс)
  for (int kadr = 0; kadr < 125; kadr++) {
    for (int i = 7; i > -1; i--) {
      //в этом цикле осуществляется вывод изображения, хранящегося в массиве ( выводится в обратном порядке чтобы изображение было в нормальной ориентации, при необходимости поменять на for (int i=0; i<8; i++))
      digitalWrite(st_pin, 0);
      shiftOut(data_pin, sh_pin, MSBFIRST, pic0[i]);
      shiftOut(data_pin2, sh_pin2, MSBFIRST, picture[i]);
      digitalWrite(st_pin, 1);
      delay(1);
    }
  }
}

Скачать файл с кодом, формат .INO: Матрица 8×8