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

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


Микропроцессоры имеет два типа памяти 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, чтобы увидеть результат.