# Проект 16: 8x8 LED матрица ![](../media/9ede64585d4424a669bf6368f3bd9d8c.GIF) #### Описание 8\*8 LED точечная матрица состоит из 8 строк и 8 столбцов светодиодов, всего 64 светодиода. Каждый из них можно независимо управлять, включая или выключая, тем самым формируя различные узоры и символы. В этом проекте вы научитесь программировать на плате разработки UNO R3 (ch340) для управления 8×8 LED матрицей, отображая узоры большого и маленького сердца. #### Аппаратное обеспечение 1\. Плата разработки UNO R3 (ch340) x 1 2\. 8*8 LED матрица x 1 3\. Макетная плата x 1 4\. Соединительные провода #### Принцип работы Внешний вид точечной матрицы показан ниже ![IMG_256](../media/401768fcaa20cda6364bb7ac10e5a362.png) 8*8 точечная матрица состоит из шестидесяти четырех светодиодов, каждый из которых расположен на пересечении строки и столбца. Когда электрический уровень определенной строки равен 1, а электрический уровень определенного столбца равен 0, соответствующий светодиод загорается. Если вы хотите включить светодиод в первой точке, нужно установить пин 9 в высокий уровень, а пин 13 в низкий уровень. Если вы хотите включить светодиоды в первой строке, установите пин 9 в высокий уровень, а пины 13, 3, 4, 10, 6, 11, 15 и 16 — в низкий уровень. Если вы хотите включить светодиоды в первом столбце, установите пин 13 в низкий уровень, а пины 9, 14, 8, 12, 1, 7, 2 и 5 — в высокий уровень. Внутренний вид точечной матрицы показан ниже ![](../media/0346a95f67a3888f58d540b96efbb810.jpeg) Если у нас есть 8x8 точечная матрица, как определить, где пин 1? В микросхемах возле пина 1 обычно есть точка, обозначающая этот пин. Но здесь, как узнать? ![IMG_256](../media/734a23945f1c86d60b0adacbda3a6b76.jpeg) Пины начинаются со стороны ручки На модуле LED матрицы производитель указывает метку или отметку со стороны пина 1, как показано на рисунке. Мы обязательно её найдём. Также возле пина 1 есть выемка. ![IMG_257](../media/b17aeb308f2b1ed514d24225e4074566.jpeg) Подключение батареи Строка = + положительное питание Столбец = - отрицательное питание Для тестирования требуется источник питания 1.5 В постоянного тока. Достаточно одной батарейки или можно использовать резистор 130 Ом последовательно с положительной или отрицательной стороной. ![IMG_258](../media/6f0a2759641654cd719d69c5b0704f8c.jpeg) Тестирование LED матрицы с батарейкой После подключения светодиода к источнику питания мы видим, что светодиод в 8-м столбце и 5-й строке загорается, как показано на рисунке. Как подключить батарейку к матрице. ![IMG_259](../media/f55ead1001bebdeaf01c44196f8dddb2.jpeg) Подключение пинов столбцов и строк #### Тест пинов LED точечной матрицы Как показано на рисунке, пины 1 и 16 подают питание, и светодиод в 8-м столбце и 5-й строке загорается. Перед использованием матрицу следует проверить, так как если какой-либо светодиод неисправен, его можно заменить. ![IMG_260](../media/0bf91de18dbc4292079bb48addc92de6.jpeg) Светодиодная матрица загорается Если вы хотите отобразить улыбающееся лицо, вот что нужно сделать: ![IMG_256](../media/16205706dec0e3dc27b0d39809e90a2f.jpeg) #### Схема подключения ![IMG_256](../media/401768fcaa20cda6364bb7ac10e5a362.png) Строки 1--8 > цифровые пины D2--D9 Столбцы 1--8 > цифровые пины D10--D17 ![Img](../media/img-20260401191100.png) #### Пример кода ```cpp /* Electronics Learning Starter Kit for Arduino Project 16 8x8 LED Matrix Edit By Keyes */ // 2-dimensional array of row pin numbers: int R[] = {2,7,A5,5,13,A4,12,A2}; // 2-dimensional array of column pin numbers: int C[] = {6,11,10,3,A3,4,8,9}; unsigned char biglove[8][8] = //the big "heart" { 0,0,0,0,0,0,0,0, 0,1,1,0,0,1,1,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, }; unsigned char smalllove[8][8] = //the small "heart" { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,0,1,0,0, 0,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0, }; void setup() { // iterate over the pins: for(int i = 0;i<8;i++) // initialize the output pins: { pinMode(R[i],OUTPUT); pinMode(C[i],OUTPUT); } } void loop() { for(int i = 0 ; i < 100 ; i++) //Loop display 100 times { Display(biglove); //Display the "Big Heart" } for(int i = 0 ; i < 50 ; i++) //Loop display 50 times { Display(smalllove); //Display the "small Heart" } } void Display(unsigned char dat[8][8]) { for(int c = 0; c<8;c++) { digitalWrite(C[c],LOW);//use thr column //loop for(int r = 0;r<8;r++) { digitalWrite(R[r],dat[r][c]); } delay(1); Clear(); //Remove empty display light } } void Clear() //clear the display { for(int i = 0;i<8;i++) { digitalWrite(R[i],LOW); digitalWrite(C[i],HIGH); } } ``` #### Объяснение кода 1\. Конфигурация пинов Сначала нужно настроить пины строк и столбцов: ```cpp // 2-dimensional array of row pin numbers: int R[] = {2, 7, A5, 5, 13, A4, 12, A2}; // 2-dimensional array of column pin numbers: int C[] = {6, 11, 10, 3, A3, 4, 8, 9}; ``` В коде определены два массива `R[]` и `C[]`, которые представляют номера пинов для строк и столбцов LED матрицы соответственно. Каждый из массивов содержит 8 пинов, используемых для управления 8x8 LED матрицей. 2\. Определение узоров Далее определены два двумерных массива `biglove` и `smalllove`, которые представляют узоры большого и маленького сердца: ```cpp unsigned char biglove[8][8] = { 0,0,0,0,0,0,0,0, 0,1,1,0,0,1,1,0, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, }; unsigned char smalllove[8][8] = { 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,0,1,0,0, 0,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,0, 0,0,1,1,1,1,0,0, 0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0, }; ``` В этих массивах `1` означает, что светодиод включен, а `0` — что светодиод выключен. С помощью этих массивов можно управлять светодиодами на матрице для формирования узоров в виде сердца. 3\. Настройка инициализации В функции `setup()` все пины инициализируются как выходы: ```cpp void setup() { for (int i = 0; i < 8; i++) { pinMode(R[i], OUTPUT); pinMode(C[i], OUTPUT); } } ``` 4\. Основной цикл В функции `loop()` происходит последовательное отображение узоров большого и маленького сердца: ```cpp void loop() { for (int i = 0; i < 100; i++) { Display(biglove); } for (int i = 0; i < 50; i++) { Display(smalllove); } } ``` С помощью циклов `for` узор большого сердца отображается 100 раз, а маленького — 50 раз. 5\. Функция отображения Функция `Display(unsigned char dat[8][8])` отвечает за конкретные операции отображения: ```cpp void Display(unsigned char dat[8][8]) { for (int c = 0; c < 8; c++) { digitalWrite(C[c], LOW); for (int r = 0; r < 8; r++) { digitalWrite(R[r], dat[r][c]); } delay(1); Clear(); } } ``` Эта функция последовательно сканирует каждый столбец, используя `dat[r][c]` для определения, должен ли светодиод быть включен или выключен. Затем вызывается функция `Clear()`, чтобы очистить дисплей и предотвратить эффект "призрака". 6\. Функция очистки дисплея Функция `Clear()` используется для очистки текущего содержимого дисплея: ```cpp void Clear() { for (int i = 0; i < 8; i++) { digitalWrite(R[i], LOW); digitalWrite(C[i], HIGH); } } ``` Все пины строк устанавливаются в низкий уровень, а пины столбцов — в высокий, что выключает все светодиоды. #### Результат проекта После загрузки кода на плату Arduino LED матрица чётко отображает узоры большого и маленького сердца. При переключении узоров заметно изменение свечения, что делает эффект очень наглядным. ![P16](../media/P16.gif)