logo
+7 (951) 999-89-94
428003, г. Чебоксары, ул. Федора Гладкова, д.9, оф.319
09.04.2019

Управление светодиодной матрицей

Управление светодиодной матрицей

В прошлом эксперименте мы научились использовать микросхему 74HC595 для управления светодиодной панелью. В этом эксперименте мы будем управлять светодиодной матрицей с помощью этой же микросхемы.

Компоненты

  • Плата Arduino Uno
  • Макетная плата
  • USB кабель
  • Светодиодная матрица
  • Микросхема 74HC595
  • Резистор 220 Ом (8 шт.)

Схема

Используем выводы D11, D12, D13 платы Arduino для управления микросхемой 74HC595. Соединим аноды светодиодной матрицы с выходами 74HC595, остальные 8 выводов светодиодной матрицы подключим к выходам Arduino.

Соединение компонентов

PROGMEM

Микропроцессоры имеет два типа памяти ROM (ПЗУ) и RAM (ОЗУ). В ПЗУ хранятся данные, которые не меняются во время выполнения программы, пока не будет записана в память новая программа. ОЗУ используется для хранения данных, которые могут меняться в процессе выполнения программы. Ключевое слово PROGMEM сообщает микропроцессору, что данные должны храниться в ПЗУ.

Оператор «? :»

Оператор «? :» похож на условные операторы. Когда выражение перед «?» истинно, то код перед «:» будет выполнен. Когда выражение ложно, то будет выполнен код после «:». Например:

int a = (1 > 0) ? 2: 3;

Так как 1>0 истина, то переменной «а» будет присвоено значение 2.

Скетч

Теперь напишем код для отображения на светодиодной матрице статических и динамических изображений.

int latchPin = 12; // connect to ST_CP of 74HC595 (pin 12)
int clockPin = 13; // connect to SH_CP of 74HC595 (pin 11) 
int dataPin = 11; // connect to DS of 74HC595 (pin 14) 

int LEDPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // column pins of matrix

const int smilingFace[] = { 
  0x1C, 0x22, 0x51, 0x45, 0x45, 0x51, 0x22, 0x1C 
};

const int data[] PROGMEM = { 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // " " 
  0x00, 0x00, 0x21, 0x7F, 0x01, 0x00, 0x00, 0x00, // "1" 
  0x00, 0x00, 0x23, 0x45, 0x49, 0x31, 0x00, 0x00, // "2" 
  0x00, 0x00, 0x22, 0x49, 0x49, 0x36, 0x00, 0x00, // "3" 
  0x00, 0x00, 0x0E, 0x32, 0x7F, 0x02, 0x00, 0x00, // "4" 
  0x00, 0x00, 0x79, 0x49, 0x49, 0x46, 0x00, 0x00, // "5" 
  0x00, 0x00, 0x3E, 0x49, 0x49, 0x26, 0x00, 0x00, // "6" 
  0x00, 0x00, 0x60, 0x47, 0x48, 0x70, 0x00, 0x00, // "7" 
  0x00, 0x00, 0x36, 0x49, 0x49, 0x36, 0x00, 0x00, // "8" 
  0x00, 0x00, 0x32, 0x49, 0x49, 0x3E, 0x00, 0x00, // "9" 
  0x00, 0x00, 0x3E, 0x41, 0x41, 0x3E, 0x00, 0x00, // "0" 
  0x00, 0x00, 0x3F, 0x44, 0x44, 0x3F, 0x00, 0x00, // "A" 
  0x00, 0x00, 0x7F, 0x49, 0x49, 0x36, 0x00, 0x00, // "B" 
  0x00, 0x00, 0x3E, 0x41, 0x41, 0x22, 0x00, 0x00, // "C" 
  0x00, 0x00, 0x7F, 0x41, 0x41, 0x3E, 0x00, 0x00, // "D" 
  0x00, 0x00, 0x7F, 0x49, 0x49, 0x41, 0x00, 0x00, // "E" 
  0x00, 0x00, 0x7F, 0x48, 0x48, 0x40, 0x00, 0x00  // "F" 
}; 
 
void setup() { 
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  for (int i = 0; i < 8; i++) { 
    pinMode(LEDPin[i], OUTPUT); 
  } 
} 
 
void loop() { 
  int cols; 
  // Display static smiling
  
  for (int j = 0; j < 500; j++ ) {
    cols = 0x01;
    for (int i = 0; i < 8; i++) {
      matrixColsVal(cols);
      matrixRowsVal(smilingFace[i]);
      delay(1);
      matrixRowsVal(0x00);
      cols <<= 1;
    } 
  }

  // Display dynamic patterns of numbers and letters 
  
  for (int i = 0; i < 128; i++) { 
    for (int k = 0; k < 10; k++) {
      cols = 0x01;
      for (int j = i; j < 8 + i; j++) {
        matrixColsVal(cols);
        matrixRowsVal(pgm_read_word_near(data + j));
        delay(1);
        matrixRowsVal(0x00);
        cols <<= 1;
      }
    }
  }
}

void matrixRowsVal(int value) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, value);
  digitalWrite(latchPin, HIGH);
}
 
void matrixColsVal(byte value) {
  byte cols = 0x01;
  for (int i = 0; i < 8; i++) {
    digitalWrite(LEDPin[i], ((value & cols) == cols) ? LOW : HIGH);
    cols <<= 1;
  } 
}

В коде мы использовали массив для объявления строк светодиодной матрицы.

int LEDPin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // column pins of matrix

Используем другой массив для данных смайлика.

const int smilingFace[] = { 
  0x1C, 0x22, 0x51, 0x45, 0x45, 0x51, 0x22, 0x1C 
};

Также объявим массив, в котором будут содержаться цифры и некоторые символы английского алфавита.

const int data[] PROGMEM = { 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // " " 
  0x00, 0x00, 0x21, 0x7F, 0x01, 0x00, 0x00, 0x00, // "1" 
  0x00, 0x00, 0x23, 0x45, 0x49, 0x31, 0x00, 0x00, // "2" 
  0x00, 0x00, 0x22, 0x49, 0x49, 0x36, 0x00, 0x00, // "3" 
  0x00, 0x00, 0x0E, 0x32, 0x7F, 0x02, 0x00, 0x00, // "4" 
  0x00, 0x00, 0x79, 0x49, 0x49, 0x46, 0x00, 0x00, // "5" 
  0x00, 0x00, 0x3E, 0x49, 0x49, 0x26, 0x00, 0x00, // "6" 
  0x00, 0x00, 0x60, 0x47, 0x48, 0x70, 0x00, 0x00, // "7" 
  0x00, 0x00, 0x36, 0x49, 0x49, 0x36, 0x00, 0x00, // "8" 
  0x00, 0x00, 0x32, 0x49, 0x49, 0x3E, 0x00, 0x00, // "9" 
  0x00, 0x00, 0x3E, 0x41, 0x41, 0x3E, 0x00, 0x00, // "0" 
  0x00, 0x00, 0x3F, 0x44, 0x44, 0x3F, 0x00, 0x00, // "A" 
  0x00, 0x00, 0x7F, 0x49, 0x49, 0x36, 0x00, 0x00, // "B" 
  0x00, 0x00, 0x3E, 0x41, 0x41, 0x22, 0x00, 0x00, // "C" 
  0x00, 0x00, 0x7F, 0x41, 0x41, 0x3E, 0x00, 0x00, // "D" 
  0x00, 0x00, 0x7F, 0x49, 0x49, 0x41, 0x00, 0x00, // "E" 
  0x00, 0x00, 0x7F, 0x48, 0x48, 0x40, 0x00, 0x00  // "F" 
}; 

Напишем две функции, одна будет управлять выходами Arduino, к которым подсоединены выводы светодиодной матрицы.

void matrixColsVal(byte value) {
  byte cols = 0x01;
  for (int i = 0; i < 8; i++) {
    digitalWrite(LEDPin[i], ((value & cols) == cols) ? LOW : HIGH);
    cols <<= 1;
  } 
}

Вторая функция будет управлять микросхемой 74HC595.

void matrixRowsVal(int value) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, value);
  digitalWrite(latchPin, HIGH);
}

В функции loop () мы сначала выводим на матрицу смайлик.

  for (int j = 0; j < 500; j++ ) {
    cols = 0x01;
    for (int i = 0; i < 8; i++) {
      matrixColsVal(cols);
      matrixRowsVal(smilingFace[i]);
      delay(1);
      matrixRowsVal(0x00);
      cols <<= 1;
    } 
  }

Потом мы прорисовываем на дисплее динамическую картинку, состоящую из цифр и букв.

  for (int i = 0; i < 128; i++) { 
    for (int k = 0; k < 10; k++) {
      cols = 0x01;
      for (int j = i; j < 8 + i; j++) {
        matrixColsVal(cols);
        matrixRowsVal(pgm_read_word_near(data + j));
        delay(1);
        matrixRowsVal(0x00);
        cols <<= 1;
      }
    }
  }

Скомпилируйте скетч и загрузите его на плату Arduino, чтобы увидеть результат.

 

Предыдущий урок | В начало | Следующий урок