В прошлом эксперименте мы научились использовать микросхему 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, чтобы увидеть результат.