Робимо світлодіодний рядок, що біжить, на Arduino своїми руками. Динамічна індикація

Почнемо з типів з'єднання матриці, їх всього два: послідовний і паралельний + суміщений варіант по живленню. Плюси і мінуси вказані на малюнку, для великих матриць краще використовувати паралельний тип, так краще організується харчування. Але з відгалуженнями силових проводів доведеться повозитися. Якщо робити матрицю з гірлянди модулів, то звичайно простіше зробити її зигзагом. Але обов'язково перевірити на різній яскравості і переконатися, що струму вистачає далеким світлодіодам (при просіданні напруги заданий білий колірйде в жовтизну (невелика просадка) або в червоний (сильна просадка напруги). У цьому випадку живлення потрібно буде продублювати товстими дроти до кожного відрізка стрічки (до кожного рядка матриці).

Матриця підключається до Arduino згідно , далі йде вичавка з нього. Важливі моменти:

  • Логічний пін Arduino з'єднаний з піном DINстрічки (матриці) через резистор із номіналом 220 Ом (можна брати будь-який у діапазоні 100 Ом – 1 кОм). Потрібен захисту пина Ардуино від навантаження, тобто. обмежити струм у ланцюзі (див. закон Ома);

  • GND (земля, мінус) стрічки обов'язковоз'єднується з піном GND Arduino навіть при роздільному харчуванні;

  • Електролітичний конденсатор живлення Arduino потрібен для фільтрації різких перепадів напруги, які створює стрічка при зміні кольорів. Напруга конденсатора від 6.3V (що більше, тим більше і дорожче кондер), ємність - в районі 470 мкФ, можна більше, менше не рекомендується. Можна взагалі без нього, але є ризик порушення стабільності роботи!

  • Конденсатор живлення стрічки потрібен для полегшення роботи блока живлення при різких змінах яскравості матриці. Знову ж можна взагалі без нього, але є ризик порушення стабільності роботи!

  • Потужність (і максимальний струм, що віддається) блоку живлення вибирається виходячи з розміру матриці і режимів, в яких вона буде працювати. Дивіться табличку та пам'ятайте про китайських амперах, тобто. блок живлення потрібно брати із запасом по струму на 10-20%! У таблиці наведено значення струму споживання стрічки.

  • У прошивці GyverMatrixOSверсії 1.2 та вище налаштовується обмеження струму системи. Як це працює: у налаштуваннях скетчу є параметр CURRENT_LIMIT, Який задає максимальний струм споживання матриці в міліамперах. Ардуїно буде робити розрахунок на основі кольорів і яскравостей світлодіодів і автоматично зменшувати яскравість всієї матриці, щоб не допустити перевищення встановленого ліміту по струму на режимах, що особливо “жеруть”. Це дуже крута функція!

ЗБІРКА КОРПУСУ І РОЗСІВАЧА

ПРОШИВКА І НАЛАШТУВАННЯ

Насамперед потрібно буде налаштувати в скетчі розміри матриці, точку підключенняі напрямок першого відрізкастрічки. Підказка нижче.

Цей тип ініціалізації матриці дозволяє підключати матрицю будь-якої конфігурації з будь-яким положенням початку матриці. Це зручно для покупних матриць, які можна лише "крутити", так і для саморобних, коли є якісь особливості корпусу або укладання дротів. Тобто як би ви не зробили і не розташували матрицю, вона все одно працюватиме з коректним становищем початку координат. До речі, можна дуже легко "віддзеркалити" матрицю по горизонталі або вертикалі, якщо це навіщось раптом потрібно: просто змінюєте підключення на "протилежне" по бажаній осі. Наприклад, хочемо віддзеркалити тип підключення (1, 0) по вертикалі. Налаштовуємо його як (2, 2) – дивіться рисунок вище. Хочемо віддзеркалити тип (3, 1) по вертикалі – налаштовуємо його як (2, 3). Тип (3, 2) по горизонталі? Будь ласка, ставимо його як (2, 2). Сподіваюся, логіка зрозуміла.

Якщо ви вперше працюєте з Arduino, то зупиніться та вивчіть . Після встановлення драйверів та бібліотек можна переходити до прошивки платформи. У мене є готовий проект з іграми та ефектами, переходьте за подробицями та прошивками. Далі буде інформація для розробників, тобто тих, хто хоче щось написати для матриці самостійно!

На самому початку прошивки містяться налаштування типу матриці та її підключення, тип підключення визначається стоячи обличчям до матриці. Для спрощення налаштування підключення матриці (кут та напрямок) використовуйте підказку зверху =)

// **************** НАЛАШТУВАННЯ МАТРИЦІ **************** #define LED_PIN 6 // пін стрічки #define BRIGHTNESS 60 // стандартна маскимальна яскравість (0-255) #define WIDTH 16 // ширина матриці #define HEIGHT 16 // висота матриці #define MATRIX_TYPE 0 // тип матриці: 0 - зигзаг, 1 - послідовна #define CONNECTION_ANGLE 0 // кут - лівий нижній; 1 - лівий верхній; 2 - правий верхній; 3 - правий нижній.

Також у прошивці міститься вкладка utility_funx, в якій сидять всі функції по роботі з матрицею:

Void loadImage(назва масиву бітмап); // Відобразити картинку з масиву "назва масиву". За картинками читайте нижче drawDigit3x5(byte digit, byte X, byte Y, uint32_t color); // намалювати цифру (цифра, коорд. Х, коорд. У, колір) void drawDots (byte X, byte Y, uint32_t color); // намалювати точки для годинника (коорд. Х, коорд. У, колір) void drawClock(byte hrs, byte mins, boolean dots, byte X, byte Y, uint32_t color1, uint32_t color2); // намалювати годинник (годинник, хвилина, точки вкл/выкл, коорд. Х, коорд. У, цвет1, цвет2) static uint32_t expandColor(uint16_t color); // Перетворити колір з 16 бітного в 24 бітний gammaCorrection (uint32_t color); // Гамма-корекція (перетворює колір більш натуральний колір) void fillAll (uint32_t color); // залити всю матрицю кольором void drawPixelXY(byte x, byte y, uint32_t color); // функція відтворення точки за координатами X Y (коорд. Х, коорд. У, колір) uint32_t getPixColor (int thisPixel); // функція отримання кольору пікселя за номером uint32_t getPixColorXY(byte x, byte y); // функція отримання кольору пікселя в матриці за координатами (коорд. Х, коорд. У) uint16_t getPixelNumber(byte x, byte y); // Отримати номер пікселя в стрічці за координатами (коорд. Х, коорд. У, колір)

Початок координат матриці - нижній лівий кут, має нульові координати!

Користуючись цими функціями, можна створювати різні ефекти різного ступеня складності, а також класичні ігри!

Світлодіодні дисплеї-матриці 8х8 бувають різних розмірів та з ними цікаво працювати. Великі промислові збирання мають розмір близько 60 х 60 мм. Однак, якщо ви шукаєте набагато більші LED матриці, їх знайти важко.

У цьому проекті ми будуватимемо реально велику світлодіодну матрицю LED дисплея, що складається з кількох великих 8х8 світлодіодних модулів, які послідовно з'єднані один з одним. Кожен із цих модулів за розміром близько 144 х 144 мм.

Особливість цього дисплея полягає в тому, що при необхідності можна дивитися на задньому фоні. Це дає свободу у творчому використанні цих дисплеїв, наприклад, розміщення їх спереду від скляних панелей, щоб була можливість побачити те, що відбувається позаду дисплея.

Для цього проекту ми будемо використовувати 10 мм. Ви можете використовувати інші розміри. Зазвичай доступні розміри 3 мм, 5 мм, 8 мм та 10 мм.

Хоча дисплей не призначений для роботи з будь-яким мікроконтролером, ми будемо використовувати популярні плати Arduino та підключати його через SPI використовуючи лише 3 сигнальні дроти.

Щоб побудувати цей проект, потрібні базові знання електроніки та пайки компонентів, а також деякі знання щодо використання Arduino. Прошивка.

Тут потрібно спаяти світлодіоди разом, використовуючи довгі ніжки світлодіодів. Ви можете використовувати будь-який розмір і колір LED, але довжина ноги (понад 23 мм) повинна бути достатньою, щоб зігнути та спаяти їх між собою. Світлодіоди розташовані у вигляді матриці 8х8, де катоди спаяні між собою для рядків, а для стовпців - аноди.

Драйвер MAX7219 керує динамічною індикацією світлодіодної матриці. При проектуванні кожна світлодіодна матриця 8х8 буде спиратися на схему, використовуючи наступні компоненти:

  • 1 х MAX7219
  • 1 х 10 мкф 16В електролітичний конденсатор
  • 1 х 0.1 UF керамічний конденсатор
  • 1 х 12 ком резистор (0,25 ВТ)
  • 1 х 24-контактне гніздо DIP IC

Зверніть увагу, що вам може знадобитися вибрати інше значення резистора для роботи з LED, що використовуватимете. Цей резистор обмежує максимальний струм на MAX7219, який на виході подаватиметься на світлодіоди.

А це відео показує наочно, як відбувається монтаж світлодіодної матриці, електронної плати керування та простий тест, щоб запустити її за допомогою популярної плати Ардуїно UNO/Nano.


Одним з важливих переваг цього перетворювача - він практично не потребує налаштування, все налаштування зводиться до підбору частотозадаючого конденсатора мікросхеми, їм налаштовують на потрібну частоту, при збільшенні ємності цього конденсатора частота зменшується, при збільшенні-підвищується.

Після того, як я виготовив матрицю 8х10, до мене звернулося безліч людей із проханням створити матрицю більшого розміру, а також забезпечити запис даних у матрицю за допомогою ПК. Тому одного чудового дня я зібрав світлодіоди, які залишилися після виготовлення світлодіодного куба, і вирішив все-таки зробити матрицю більшого розміру з урахуванням вимог, про які мене просили колеги.

Ну, і чого ж ви чекаєте? Беріть світлодіоди та паяльник, тому, що ми зараз разом будемо робити світлодіодну матрицю 24х6!

Крок 1: Збір всього необхідного

Для даного проекту вам знадобиться базовий набір інструментів: паяльник, припій, щипці, трохи дроту, кусачки, інструмент для зняття ізоляції дроту, а також пристрої для демонтажу, якщо вони вам необхідні.

Для виготовлення матриці необхідно:
1. 144 світлодіоди
2. 24 резистори (номінал визначається за типом світлодіодів, у моєму випадку 91 Ом)
3. Десятковий лічильник 4017
4. 6 резисторів номіналом 1 ком
5. 6 транзисторів 2N3904
6. Довга макетна плата
7. Arduino
8. 3 x 74HC595 регістру зсуву
10. Кілька штирьових роз'ємів

Крок 2: Як це працює?

Ідея роботи світлодіодної матриці полягає в наступному: зазвичай інформація розбивається на невеликі частини, які потім передаються одна за одною. У такий спосіб ви можете заощадити безліч висновків на Arduino і зробити вашу програму досить простою.

Тепер настав час задіяти 3 зсувні регістри, які множать кілька виходів і дозволяють заощадити безліч висновків arduino.

Кожен зсувний регістр має 8 виходів і потрібно лише 3 висновки arduino для контролю майже необмеженої кількості зсувних регістрів.

Ми також будемо використовувати десятковий лічильник 4017 для сканування рядів. За допомогою нього можна сканувати до 10 рядів, оскільки у вас є лише 10 виходів, проте для контролю їх необхідно лише 2 висновки.

4017 – це дуже корисна мікросхема. Ознайомитись з її роботою можна за виноскою

Як я сказав раніше, сканування виконується за допомогою десяткового лічильника 4017, за допомогою приєднання одного ряду до землі за один раз і пересилання даних через резистори зсуву в колонки.

Крок 3: Схемне рішення

Єдиними елементами, які я не вказав на схемі, є резистори обмеження струму, оскільки їх номінал залежить від типу світлодіодів, що використовуються. Тому їхню величину вам необхідно вирахувати самостійно.

Для розрахунку величин 24 резисторів перейдіть за наступним посиланням: .

Спочатку необхідно подивитися специфікацію світлодіодів, щоб дізнатися пряму напругу та прямий струм. Цю інформацію можна дізнатись у продавця. Схема працює від напруги 5В. Отже, вам потрібне джерело живлення напругою 5В.

Завантажте оригінальний файл, щоб докладніше вивчити схему (натисніть схему збільшення зображення).

Крок 4: Пайка світлодіодів

Пайка 144 світлодіодів для створення матриці може виявити важким завданням, якщо ви не знаєте напевно, як це зробити.

Останній раз я паяв матрицю, використовуючи багато дротяних джамперів, які дуже важко припаювалися. Тому цього разу я творчіше підійшов до цієї проблеми.

Вам необхідно зігнути вниз позитивний висновок світлодіода у напрямку до інших висновків і зробити ряд, потім відрізати частину виведення, що не використовується, і спробувати зробити ці з'єднання низькими, наскільки це можливо. Далі аналогічно виконати цю процедуру всім позитивних висновків.

Тепер негативні висновки з'єднані в колонку та їх паяння утруднена через позитивний ряд на їхньому шляху. Тому вам необхідно зігнути негативний висновок на 90 градусів, потім зробити місток над позитивним рядом до наступного негативного висновку і таке інше світлодіодів.

Я не пояснюватиму, як припаювати зсувні регістри та інші компоненти, оскільки у кожного є свій стиль і методи роботи.

Крок 5: Програмування матриці

Ось ми і підійшли до останнього етапу нашого проекту – програмування матриці.

До цього я вже написав дві програми, які мають багато спільного.

Я додав програму, яка отримує слово або речення від послідовного IDE монітора arduino і відображає його на матриці. Код програми досить простий і не претендує на найкращий у світі, але він справді працює. Ви можете написати свій код або змінити мій на свій розсуд.

Я доклав файл у форматі excel, щоб ви змогли створити власні знаки та символи.

Ось як це працює:

Створіть необхідний символ пікселя за пікселем (не турбуйтеся, це дуже легко) і скопіюйте вихідний рядок таким чином - #define (OUTPUT LINE)

Надалі я планую додати код для анімації, коли у мене з'явиться більше часу.

Крок 6: Пристрій готовий!

Вітаю! Ви самостійно зробили матрицю a 24x6, і тепер можете оперативно виводити на неї все, що вам потрібно.

Тепер ви можете протестувати матрицю, вигадати нові програми або поліпшити інтерфейс.

Список радіоелементів

Позначення Тип Номінал Кількість ПриміткаМагазинМій блокнот
Плата Arduino

Arduino Uno

1 До блокноту
U1-U3 Зсувний регістр

CD74HC595

3 До блокноту
U4 Спеціальна логіка

CD4017B

1 K561ІЕ8 До блокноту
Q1-Q6 Біполярний транзистор

2N3904

6 До блокноту
Резистор

В останні роки набули широкого поширення зовнішньої рекламита різних інформаційних табло світлодіодні матриці. Досить яскраві, динамічні – вони чудово привертають увагу та не сліпнуть у сонячний день. Кожен із вас бачить їх на вулицях вашого міста щодня.
Звичайно ж, їхньому поширенню посприяла низька ціна (за рахунок китайських виробників) і простота складання екрану.

Але якщо спробувати застосувати подібні матриці у своїх пристроях на мікроконтролерах? Який інтерфейс обміну та логіка виведення у цих матриць?
Спробуймо з цим усім розібратися.

Китайці пропонують як самі матриці різних розмірів та з різною роздільною здатністю, так і контролери для виведення на них зображень з різними нескладними ефектами, а також всю необхідну фурнітуру, кабелі, рами.
Матриці зустрічаються як одноколірні (білі, жовті, червоні, зелені, сині), і 3-колірні (RGB). Позначення моделі матриці виглядає зазвичай так Pxx або PHxx де xx - число, що вказує відстань між пікселями в міліметрах. У моєму випадку це P10. З іншого боку, матриці деяких типорозмірів бувають як прямокутними, а й квадратними.

Можливі варіанти типорозмірів матриць



Отже, маємо білу матрицю 32x16 пікселів з розмірами 320x160мм і, відповідно, міжпіксельною відстанню 10 мм. Давайте розглянемо її ближче.
Вид спереду:

Вам також здалося, що світлодіоди якісь овальні? Вам не здалося...


Над світлодіодами зроблений невеликий козирок, який не дає сонячному світлу засвічувати світлодіоди.

Вид спереду зі знятою пластиковою маскою



Перевертаємо матрицю та бачимо плату:


На платі купка мікросхем логіки. Давайте розберемося, що це за мікросхеми:
1. 1 x SM74HC245D - буфер, що не інвертує.
2. 1 x SM74HC04 – 6-канальний інвертор
3. 1 x SM74HC138D – 8-бітний дешифратор
4. 4 x APM4953 - збірка з 2 P-канальних MOSFET
5. 16 x 74HC595D - зсувний регістр із клямкою
Два 16-пінові роз'єми - інтерфейсні, один з них вхідний (до нього підключається контролер екрану), а другий - вихідний (до нього підключається наступна матриця в ланцюжку). Стрілка на платі спрямована від вхідного роз'єму до вихідного.
Харчування подається на клеми у центрі плати. Напруга живлення – 5В, максимальний струм (коли включені всі світлодіодні матриці) – 2А (для білої матриці).

Вся викладена вище інформація, а також демонстрація роботи матриці у відео нижче. У ньому я з 13:04 по 15:00 говорю про залежність яскравості екрану від кількості матриць. Це через помилку в алгоритмі. Помилка виправлена, і тепер дані завантажуються до вимкнення екрана.

Також буду радий вас бачити на моєму youtube-каналі, де я ще багато всякої всячини підключаю до мікроконтролерів.

Дякую всім за увагу!

Іноді потрібно підключити до мікроконтролера кілька семисегментних індикаторів або світлодіодну матрицю, для відображення інформації використовується динамічна індикація. Суть динамічної індикації полягає у послідовному виведенні інформації на індикатори. Нижче на схемі представлений приклад з'єднання кількох семисегментних індикаторів (для прикладу із загальним катодом) для реалізації динамічної індикації, взагалі з урахуванням точки виходить 8 сегментів, але по-старому їх називають саме так. Всі висновки (аноди) однойменних сегментів з'єднують разом, разом 8 ліній які через резистори підключають до мікроконтролера. Загальний катод кожного індикатора підключають до мікроконтролера через транзистор.


Алгоритм індикації наступний: спочатку встановлюємо на лініях необхідні логічні рівні в залежності від того, які сегменти треба включити на першому індикаторі (індикація зліва направо), при цьому високий логічний рівень для включення, низький для вимикання сегмента. Далі подаємо високий логічний рівень на базу транзистора VT1, тим самим загальний катод першого індикатора підключається до загального проводу, в цей момент загоряються сегменти, на анодах яких є логічна одиниця. Через певний час(пауза) індикатор відключаємо, подавши низький логічний рівень на базу транзистора, потім знову змінюємо логічні рівні на лініях відповідно до інформації, що призначена для другого індикатора, і подаємо сигнал включення на транзистор VT2. Таким чином, по порядку у круговому циклі комутуємо всі індикатори, от і вся динамічна індикація.

Для отримання цілісного зображення без мерехтінь, перемикання необхідно виконувати з великою швидкістюДля виключення мерехтіння світлодіодів частоту оновлення необхідно встановлювати від 70 Гц і більше, я зазвичай встановлюю 100 Гц. Для вищерозглянутої конструкції пауза розраховується так: для частоти в 100 Гц період дорівнює 10 мс, всього 4 індикатори, відповідно час світіння кожного індикатора встановлюємо на рівні 10/4=2,5 мс. Існують багаторозрядні семисегментні індикатори в одному корпусі, в яких однойменні сегменти з'єднані всередині корпусу, природно для їх використання необхідно застосовувати динамічну індикацію.

Для реалізації динамічної індикації необхідно скористатися перериваннями щодо переповнення одного з таймерів. Нижче наведено код з використанням таймера TMR0:

;Реалізація динамічної індикації для 4-х семисегментних індикаторів ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; swapf STATUS,W; clrf STATUS; movwf STATUS_TEMP; ; bcf ind1 ;вимикання 1-го індикатора bcf ind2 ;вимикання 2-го індикатора bcf ind3 ;вимикання 3-го індикатора bcf ind4 ;вимикання 4-го індикатора; incf shet,F ;інкремент регістру shet movlw .5 ;перевірка вмісту регістра shet xorwf shet,W ;на рівність числу 5 btfss STATUS,Z ; goto met1 ;число в регістрі shet не дорівнює 5 movlw .1 ;число в регістрі shet дорівнює 5: запис числа 1 movwf shet ;у регістр shet ; met1 movlw .1 ;перевірка вмісту регістру shet xorwf shet,W ;на рівність числу 1 btfss STATUS,Z ; goto met2; число в регістрі shet не дорівнює 1: перехід на met2 movf datind1,W; число в регістрі shet дорівнює 1: копіювання movwf PORTB; вмісту регістру datind1 в регістр PORTB bsf ind1; включення 1-го індикатора met2. вмісту регістра shet xorwf shet,W; на рівність числу 2 btfss STATUS,Z; goto met3 ;число в регістрі shet не дорівнює 2: перехід на met3 movf datind2,W ;число в регістрі shet дорівнює 2: копіювання movwf PORTB ;вміст регістру datind2 в регістр PORTB bsf ind2 ;включення 2-го індикатора goto exxit met3 movlw .3 ;перевірка вмісту регістра shet xorwf shet,W ;на рівність числу 3 btfss STATUS,Z ; goto met4 ;число в регістрі shet не дорівнює 3: перехід на met4 movf datind3,W ;число в регістрі shet дорівнює 3: копіювання movwf PORTB ;вміст регістру datind3 в регістр PORTB bsf ind3 ;включення 3-го індикатора goto exxit met4 movf datind4,W ;копіювання вмісту регістру datind3 movwf PORTB ;в регістр PORTB bsf ind4 ;включення 4-го індикатора; movlw .100; запис числа 156 в регістр таймера TMR0 movwf TMR0; ; movwf STATUS; swapf W_TEMP,F; swapf W_TEMP,W; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основна програма ................. movlw b"11010011" ;OPTION_REG, цим встановлюємо внутрішній ;встановлюємо коефіцієнт предделителя 1:16 ; clrf shet ;обнулення регістра shet, перед запуском;переривань по переповненню TMR0, виконується; clrf datind1 ;очищення регістрів виведення інформації на clrf datind2 ;індикатори, рівнозначно вимкненню clrf datind3 ;індикаторів, так як індикатори із загальним clrf datind4 ;катодом; bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0 bsf INTCON,T0IE ;дозвіл переривань по переповненню TMR0 bsf INTCON,GIE ;дозвіл глобальних переривань; movlw b"00000110"; приклад виведення числа 13,52 movwf datind1; movlw b"11001111"; movwf datind2; movlw b"01101101"; movwf datind3; movlw b"01011011"; movwf datind4; ; . ................; .................; .................; ; end ;кінець всієї програми;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реалізація динамічної індикації для 4-х семисегментних індикаторів

Частота тактового генератора для прикладу 4 МГц, машинний цикл 1 мкс

org 0000h ;почати виконання програми з адреси 0000h

goto Start ;перехід на мітку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Підпрограма обробки переривань

org 0004h ;почати виконання підпрограми з адреси 0004h

movwf W_TEMP ;збереження значень ключових регістрів

swapf STATUS,W;

movwf STATUS_TEMP;

bcf ind1 ;вимикання 1-го індикатора

bcf ind2 ;вимикання 2-го індикатора

bcf ind3 ;вимикання 3-го індикатора

bcf ind4 ;вимикання 4-го індикатора

incf shet,F; інкремент регістру shet

movlw .5 ;перевірка вмісту регістру shet

xorwf shet,W ;на рівність числу 5

btfss STATUS,Z;

goto met1 ;число в регістрі shet не дорівнює 5

movlw .1 ;число в регістрі shet дорівнює 5: запис числа 1

movwf shet; в регістр shet

met1 movlw .1 ;перевірка вмісту регістру shet

xorwf shet,W ;на рівність числу 1

btfss STATUS,Z;

goto met2 ;число в регістрі shet не дорівнює 1: перехід на met2

movf datind1,W ;число в регістрі shet дорівнює 1: копіювання

movwf PORTB ;вміст регістру datind1 в регістр PORTB

bsf ind1 ;включення 1-го індикатора

goto exxit ;перехід на мітку exxit

met2 movlw .2 ;перевірка вмісту регістру shet

xorwf shet,W ;на рівність числу 2

btfss STATUS,Z;

goto met3 ;число в регістрі shet не дорівнює 2: перехід на met3

movf datind2,W ;число в регістрі shet дорівнює 2: копіювання

movwf PORTB ;вміст регістру datind2 в регістр PORTB

bsf ind2 ;включення 2-го індикатора

goto exxit ;перехід на мітку exxit

met3 movlw .3 ;перевірка вмісту регістру shet

xorwf shet,W ;на рівність числу 3

btfss STATUS,Z;

goto met4 ;число в регістрі shet не дорівнює 3: перехід на met4

movf datind3,W ;число в регістрі shet дорівнює 3: копіювання

movwf PORTB ;вміст регістру datind3 в регістр PORTB

bsf ind3 ;включення 3-го індикатора

goto exxit ;перехід на мітку exxit

met4 movf datind4,W ;копіювання вмісту регістру datind3

movwf PORTB ;у регістр PORTB

bsf ind4 ;включення 4-го індикатора

exxit bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0

movlw .100 ;запис числа 156 в регістр таймера TMR0

swapf STATUS_TEMP,W ;відновлення вмісту ключових регістрів

swapf W_TEMP,F;

swapf W_TEMP,W;

retfie ;вихід з підпрограми переривання

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основна програма

Start ................. ; початкове налаштуваннярегістрів

................. ;спеціального призначення

.................

bsf STATUS,RP0 ;запис двійкового числа 11010011 в регістр

movlw b"11010011" ;OPTION_REG, тим самим встановлюємо внутрішній

movwf OPTION_REG ;джерело тактового сигналу для TMR0

bcf STATUS,RP0 ;включаємо розподільник перед TMR0

;встановлюємо коефіцієнт предделителя 1:16

clrf shet ;обнулення регістра shet, перед запуском

;переривань по переповненню TMR0, виконується

;одноразово, після включення харчування

clrf datind1 ;очищення регістрів виведення інформації на

clrf datind2 ;індикатори, рівнозначно вимкненню

clrf datind3 ;індикаторів, так як індикатори із загальним

clrf datind4 ;катодом

bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0

bsf INTCON,T0IE ;дозвіл переривань по переповненню TMR0

bsf INTCON,GIE ;дозвіл глобальних переривань

movlw b"00000110"; приклад виведення числа 13,52

movlw b"11001111";

movlw b"01101101";

movlw b"01011011";

................. ;

................. ;

................. ;

end ;кінець всієї програми

В основній програмі спочатку налаштовуємо таймер за допомогою регістру OPTION_REG, раніше я розповідав про використання таймерів для . Далі очищаємо регістр shet, призначений для введення рахунку від 1 до 4 для кожного індикатора. Цей регістр інкрементується в підпрограмі обробки переривань і там же коригується (він рахуватиме від 1 до 4), тому дане очищеннявиконується одноразово після включення живлення. За цим регістром визначатимемо, який індикатор включатиме і видаватиме дані відповідні йому. Наступним кроком буде очищення регістрів зберігання інформації, чотири регістри dataind1,2,3,4 відповідні чотирма індикаторами. Очищення рівнозначне вимкненню індикаторів, так як у підпрограмі обробки переривань, вміст цих регістрів передається в регістр PORTB, якого підключені аноди індикаторів. Це необхідно для того, щоб на індикаторах не висвічувалося всяке сміття після дозволу переривань, в принципі цього можна і не робити, якщо відразу записувати правильну інформацію для виведення. Далі скидаємо прапор переривання по переповненню таймера, дозволяємо переривання по переповненню TMR0, і, нарешті, дозволяємо глобальні переривання.

У підпрограмі обробки переривань, в першу чергу вимикаємо всі індикатори (подавши низькі логічні рівні на бази транзисторів), тому що невідомо який із них включений. Виробляємо інкремент регістру shet, з перевіркою на рівність числу 5, за наявності такого збігу записуємо в регістр число 1, тому що необхідно вести рахунок від 1 до 4. Далі перевіряємо, яке саме число лежить в регістрі shet, за яким завантажуємо в PORTB дані з регістрів зберігання інформації (dataind) для відповідного індикатора та включаємо його. Після чого скидаємо прапор переривання по переповненню TMR0, записуємо число 100 у таймер (нижче наведено розрахунок цього значення), для тимчасової затримки та виходимо з обробника переривань. При першому перериванні включається перший індикатор, у другому перериванні другий і так за круговим циклом. В основній програмі залишається лише завантажувати дані в регістри зберігання інформації для кожного індикатора. У підпрограмі переривань не забуваємо зберігати та відновлювати значення ключових регістрів, про це я писав у статті про .

Для виведення чисел краще використовувати знакогенератор як таблиці даних. Наприклад, щоб вивести число 3456 на індикатори, його необхідно розбити на розряди, при цьому краще використовувати окремі регістри для зберігання чисел розрядів (від 0 до 9), далі прогнати ці регістри через знакогенератор, отримавши цим правильні байти (завантажуються в регістри dataind) для запалення відповідних сегментів.

Частоту тактового генератора приймемо за 4 МГц машинний цикл 1 мкс. Частота оновлення кожного індикатора нехай становитиме 100 Гц (період T=10 мс), відповідно, необхідна тимчасова затримка дорівнює 10/4 = 2,5 мс. Коефіцієнт розподільника для TMR0 встановлюємо рівним 1:16, при цьому максимально можлива затримка дорівнює 256х16 = 4096 мкс, а нам потрібна пауза 2,5 мс. Розрахуємо число для запису TMR0: 256-((256х2,5)/4,096) = 256-156,25 = 99,75. Після заокруглення отримаємо число 100.

Нижче можна завантажити модель для програми Proteus, прошивку та вихідник з реалізацією динамічної індикації на 4-розрядний індикатор із загальним катодом із застосуванням мікроконтролера PIC16F628A. Наприклад, на індикатор виводяться числа 0000; 0001; 0002; 13,52; 9764.

Тепер розглянемо підключення матриці з роздільною здатністю 8х8 пікселів (світлодіодів). Структуру матриці зазвичай розглядають у вигляді рядків та стовпців. На малюнку нижче у кожному стовпці з'єднані катоди всіх світлодіодів, а кожному рядку аноди. Рядки (8 ліній, аноди світлодіодів) через резистори підключають до мікроконтролера. Кожен стовпець (катоди світлодіодів) підключають до мікроконтролера через 8 транзисторів. Алгоритм індикації такий самий, спочатку встановлюємо необхідні логічні рівні на рядках, відповідно до того, які світлодіоди повинні горіти в стовпці, далі підключаємо перший стовпець (індикація зліва направо). Через певну паузу вимикаємо стовпець і змінюємо логічні рівні на рядках для відображення другого стовпця, далі підключаємо другий стовпець. І так по черзі комутуємо усі стовпці. Нижче наведена схема підключення матриці до мікроконтролера.


Усього для підключення такої матриці потрібно 16 висновків мікроконтролера, що дуже багато, тому для скорочення ліній, що управляють, краще використовувати послідовні зсувні регістри.

Найпоширенішим послідовним регістром є мікросхема 74НС595, яка містить зсувний регістр для завантаження даних, і регістр зберігання через який дані передаються на вихідні лінії. Завантажувати дані в нього просто, встановлюємо логічний 0 на вході тактування SH_CP, далі встановлюємо необхідний логічний рівень на вході даних DS, після чого вхід переключаємо тактування в 1, при цьому відбувається збереження значення рівня (на вході DS) всередині зсувного регістра. Одночасно з цим відбувається зсув даних на один розряд. Знову скидаємо виведення SH_CP в 0, встановлюємо необхідний рівень на вході DS і піднімаємо SH_CP в 1. Після повного завантаження зсувного регістру (8 біт), встановлюємо в 1 виведення ST_CP, в цей момент дані передаються в регістр зберігання і надходять на вихідні лінії Q0. Q7, після чого скидаємо виведення ST_CP. Під час послідовного завантаження дані зсуваються від Q0 до Q7. Висновок Q7 підключений до останнього розряду зсувного регістру, цей висновок можна підключити на вхід другої мікросхеми, таким чином можна завантажувати дані відразу в дві і більше мікросхеми. Висновок OE перемикає вихідні лінії у третій (високомний) стан, при подачі на нього логічного 1. Висновок MR призначений для скидання зсувного регістру, тобто встановлення низьких логічних рівнів на виходах тригерів регістру, що еквівалентно завантаженню восьми нулів. Нижче представлена ​​діаграма завантаження даних в мікросхему 74НС595, встановлення значення 11010001 на вихідних лініях Q0 ... Q7, за умови, що спочатку там були нулі:


Розглянемо підключення матриці 8×8 до мікроконтролера PIC16F628A за допомогою двох зсувних регістрів 74HC595, схема представлена ​​нижче:


Дані завантажуються в мікросхему DD2 (управління логічними рівнями на рядках, аноди світлодіодів) потім через виведення Q7' передаються в DD3 (управління шпальтами), відповідно спочатку завантажуємо байт для включення стовпця, потім байт з логічними рівнями на рядках. До вихідних ліній DD3 підключені транзистори комутують стовпці матриці (катоди світлодіодів). Нижче наведено код програми для виведення зображення на матрицю:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Реалізація динамічної індикації для матриці з роздільною здатністю 8х8 ;Частота тактового генератора для прикладу 4 МГц, машинний цикл 1 мкс org 0000h ;почати виконання програми з адреси 0000h goto Start ;перехід на мітку Start;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Підпрограма обробки переривань org 0004h ;почати виконання підпрограми з адреси 0004h movwf W_TEMP ;збереження значень ключових регістрів swapf STATUS,W ; clrf STATUS; movwf STATUS_TEMP; ; movwf FSR_osn ;у регістр FSR_osn movf FSR_prer,W ;відновлення раніше збереженого значення movwf FSR ;реєстру FSR з регістру FSR_prer ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;завантаження вмісту регістру stolb в мікросхему movf stolb,W ;копіювання вмісту регістра stolb movwf var ;у регістр var met2 btfsc var,0 ;встановлюємо висновок ds відповідно до btfss var,0 ; bcf ds; bcf sh_cp; rrf var,F ;зсув регістра var вправо, для підготовки;наступного біта goto met2 ;scetbit не дорівнює нулю: перехід на мітку met2 ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;; ;завантаження вмісту регістра INDF в мікросхему;74HC595 (послідовний зсувний регістр) movf INDF,W ;копіювання вмісту регістра INDF movwf var ;у регістр var movlw .8 ;запис числа 8 в регістр scetbit, для відліку var tb ; ,7; встановлюємо виведення ds відповідно до bsf ds; значенням 7-го біта регістра var btfss var,7; bcf ds; bsf sh_cp ;тактуємо висновок sh_cp, для замикання даних bcf sh_cp ; rlf var,F ;зсув регістру var вліво, для підготовки;наступного біта decfsz scetbit,F ;декремент з умовою регістра scetbit goto met1 ;scetbit не дорівнює нулю: перехід на мітку met1 ; bsf st_cp ;тактуємо висновок st_cp, передачі завантажених bcf st_cp ;байтів на вихідні лінії мікросхем 74HC595 ; bcf STATUS,C ;скидання біта C регістра статус перед зсувом rrf stolb,F ;зсув ліворуч регістра stolb ; incf FSR,F ;інкремент регістру FSR, підготовка наступного;регістра для відправки даних на 74HC595 decfsz shet,F ;декремент з умовою регістра shet goto exxit ;реєстр shet не дорівнює 0: перехід на exxit movlw data1 ;реєстр sh першого movwf FSR ;реєстру зберігання інформації в регістр FSR movlw .8 ;запис числа 8 в регістр shet, для ведення movwf shet ;рахунки стовпців ; exxit bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0 movlw . 124; запис числа 124 в регістр таймера TMR0 movwf TMR0; ; movf FSR,W ;збереження поточного значення регістру FSR movwf FSR_prer ;у регістр FSR_prer movf FSR_osn ,W ;відновлення раніше збереженого значення movwf FSR ;реєстру FSR з регістру FSR_osn ; swapf STATUS_TEMP,W ;відновлення вмісту ключових регістрів movwf STATUS ; swapf W_TEMP,F; swapf W_TEMP,W; ; retfie ;вихід з підпрограми переривання;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основна програма Start ................. ;первинне налаштування регістрів................. ;спеціального призначення..... ............ bsf STATUS,RP0 ;запис двійкового числа 11010011 в регістр movlw b"11010010" ;OPTION_REG, тим самим встановлюємо внутрішній movwf OPTION_REG ;джерело тактового сигналу для TMR0 bcf STATUS,RP0 ; перед TMR0; встановлюємо коефіцієнт предделителя 1:8; movlw .8 ;запис числа 8 в регістр shet, перед запуском movwf shet ;переривань по переповненню TMR0, виконується;одноразово, після включення живлення movlw b"10000000" ;запис двійкового числа 10000000 в movwf stolb ; стовпця; виконується одноразово, після включення харчування; movlw data1 ;запис адреси першого регістра (реєстри зберігання movwf FSR_prer ;інформації) в регістр FSR_prer, виконується;одноразово, після включення живлення; movlw .8 ;очистка 8-ми регістрів виведення інформації на movwf tmp ;матрицю, рівнозначно вимкненню movlw data1 ;матриці movwf FSR ; met3 clrf INDF; incf FSR, F; decfsz tmp,F; goto met3; ; bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0 bsf INTCON,T0IE ;дозвіл переривань по переповненню TMR0 bsf INTCON,GIE ;дозвіл глобальних переривань; m1 movlw data1; приклад виведення літери R movwf FSR; movlw b"00000000"; movwf INDF; incf FSR, F; movlw b"01111111"; movwf INDF; incf FSR, F; movlw b"00001001"; movwf INDF; incf FSR, F; movlw b"00011001"; movwf INDF; incf FSR, F; movlw b"00101001"; movwf INDF; incf FSR, F; movlw b"01000110"; movwf INDF; incf FSR, F; movlw b"00000000"; movwf INDF; incf FSR, F; movlw b"00000000"; movwf INDF; ; .................; .................; .................; ; end ;кінець всієї програми;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Реалізація динамічної індикації для матриці з роздільною здатністю 8х8

Частота тактового генератора для прикладу 4 МГц, машинний цикл 1 мкс

org 0000h ;почати виконання програми з адреси 0000h

goto Start ;перехід на мітку Start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Підпрограма обробки переривань

org 0004h ;почати виконання підпрограми з адреси 0004h

movwf W_TEMP ;збереження значень ключових регістрів

swapf STATUS,W;

movwf STATUS_TEMP;

movf FSR,W ;збереження поточного значення регістра FSR

movwf FSR_osn ;у регістр FSR_osn

movf FSR_prer,W ;відновлення раніше збереженого значення

movwf FSR ;реєстру FSR з регістру FSR_prer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (послідовний зсувний регістр)

movf stolb,W ;копіювання вмісту регістру stolb

movwf var ;у регістр var

movlw .8 ;запис числа 8 в регістр scetbit, для відліку

movwf scetbit ;переданих бітів

met2 btfsc var,0 ;встановлюємо виведення ds відповідно до

bsf ds ;значенням 7-го біта регістра var

bsf sh_cp ;тактуємо висновок sh_cp, для замикання даних

rrf var,F ;зсув регістра var вправо, для підготовки

; наступного біта

decfsz scetbit,F; декремент з умовою регістру scetbit

goto met2 ;scetbit не дорівнює нулю: перехід на мітку met2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;74HC595 (послідовний зсувний регістр)

movf INDF,W ;копіювання вмісту регістру INDF

movwf var ;у регістр var

movlw .8 ;запис числа 8 в регістр scetbit, для відліку

movwf scetbit ;переданих бітів

met1 btfsc var,7 ;встановлюємо виведення ds відповідно до

bsf ds ;значенням 7-го біта регістра var

bsf sh_cp ;тактуємо висновок sh_cp, для замикання даних

rlf var,F ;зсув регістра var вліво, для підготовки

; наступного біта

decfsz scetbit,F; декремент з умовою регістру scetbit

goto met1; scetbit не дорівнює нулю: перехід на мітку met1

bsf st_cp ;тактуємо висновок st_cp, передачі завантажених

bcf st_cp ;байтів на вихідні лінії мікросхем 74HC595

bcf STATUS,C ;скидання біта C регістру статус перед зсувом

rrf stolb,F ;зсув вліво регістра stolb

incf FSR,F ;інкремент регістру FSR, підготовка наступного

;реєстру для відправки даних на 74HC595

decfsz shet,F; декремент з умовою регістру shet

goto exxit; регістр shet не дорівнює 0: перехід на exxit

movlw data1 ;реєстр shet дорівнює 0: запис адреси першого

movwf FSR ;реєстру зберігання інформації в регістр FSR

movlw .8 ;запис числа 8 в регістр shet, для ведення

movwf shet ;рахунки стовпців

movlw b"10000000" ;запис двійкового числа 10000000 в

movwf stolb; регістр stolb, для включення 1-го стовпця

exxit bcf INTCON,T0IF ;скидання прапора переривання по переповненню TMR0

movlw .124 ;запис числа 124 в регістр таймера TMR0

movf FSR,W ;збереження поточного значення регістра FSR

movwf FSR_prer ;у регістр FSR_prer

movf FSR_osn ,W ;відновлення раніше збереженого значення

movwf FSR ;реєстру FSR з регістру FSR_osn

swapf STATUS_TEMP,W ;відновлення вмісту ключових регістрів

swapf W_TEMP,F;

swapf W_TEMP,W;

retfie ;вихід з підпрограми переривання

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основна програма

Start ................. ;первинне налаштування регістрів

................. ;спеціального призначення

.................

bsf STATUS,RP0 ;запис двійкового числа 11010011 в регістр

movlw b"11010010" ;OPTION_REG, тим самим встановлюємо внутрішній

movwf OPTION_REG ;джерело тактового сигналу для TMR0

bcf STATUS,RP0 ;включаємо розподільник перед TMR0

;встановлюємо коефіцієнт предделителя 1:8

movlw .8 ;запис числа 8 в регістр shet, перед запуском

movwf shet ;переривань по переповненню TMR0, виконується

;одноразово, після включення харчування

movlw b"10000000" ;запис двійкового числа 10000000 в

movwf stolb; регістр stolb, для включення 1-го стовпця

Інформація з логічними рівнями для рядків кожного стовпця, зберігається в 8 регістрах зберігання інформації, звернення до яких виконується через . Адреса першого регістру присвоєно назву data1. Крім початкового запису регістрів shet і stolb, необхідно записати в регістр FSR_prer адресу першого регістра зберігання інформації (регістр – data1, запис у FSR_prer виконується одноразово, далі коригується в обробнику), тільки після цього дозволяти переривання по переповненню TMR0.

Перед дозволом переривань, бажано очистити регістри зберігання інформації, дана операціяпроводиться за допомогою додаткового регістра tmp (як лічильник) і непрямої адресації, очищення рівнозначне вимкненню матриці.

У підпрограмі обробки переривань завантажуємо в мікросхему DD2 вміст регістру stolb (при першому вході в обробник після дозволу переривань, у регістрі лежить число 10000000, як було сказано вище). Завантаження починається з молодшого біта регістра stolb, який зсувається в напрямку від Q0 до Q7 (всередині мікросхеми DD2) у міру завантаження, алгоритм завантаження був розглянутий вище, так що думаю, розібратися в коді не важко. Далі завантажуємо в DD2 вміст регістру INDF, це один з регістрів зберігання інформації, адреса якого знаходиться в FSR (при першому вході в обробник після дозволу переривань FSR лежить адреса першого регістра зберігання інформації з назвою data1). Завантаження починається зі старшого біта регістра INDF. Після завантаження розглянутих 2-х байтів тактуємо висновок st_cp, тим самим завантажені дані передаються на вихідні лінії мікросхем DD2, DD3. Таким чином, при першому вході в обробник комутується перший стовпець матриці, в якому спалахують світлодіоди, на анодах яких є високий логічний рівень, відповідно до вмісту регістра data1 (перший регістр зберігання інформації).

Далі зсуваємо регістр stolb праворуч на один біт, для того щоб підготувати до комутації другий стовпець матриці при наступному вході в обробник переривань. Перед зсувом необхідно очистити прапор C регістру STATUS, так як зсув відбувається через цей прапор, і його стан не відомий на момент зсуву. Після зсуву інкрементуємо регістр FSR, готуючи наступний регістр зберігання інформації (після регістру data1) з логічними рівнями рядків для другого стовпця. Далі декрементуємо з умовою регістр shet, і якщо він не дорівнює нулю, скидаємо прапор переривання по переповненню TMR0, виконуємо запис числа в таймер і виходимо з обробника переривань.

При наступному вході в обробник увімкнеться другий стовпець матриці і так далі. При обнуленні регістра shet (після комутації 8-го стовпця), записується число 8 для чергового циклу комутації стовпів, крім цього коригується значення регістра stolb, в регістр FSR записується адреса першого регістра зберігання інформації (data1).

Здійснимо розрахунок тимчасової затримки для таймера TMR0, частота тактового генератора 4 МГц, машинний цикл 1 мкс. Щоб уникнути мерехтіння світлодіодів, приймемо частоту оновлення кожного стовпця 100Гц (період T=10 мс), тимчасова затримка дорівнює 10/8 = 1,25 мс. Коефіцієнт предделителя TMR0 встановимо рівним 1:8, у своїй максимально можлива затримка дорівнює 256х8 = 2048 мкс. Для паузи в 1,25 мс таймер повинен відрахувати (256х1,25)/2,048 = 156,25 разів, округляючи отримаємо 156 відліків. Відповідно до таймера необхідно записати число 256-156 = 100. Але це не зовсім правильне значення, так як на виконання підпрограми обробки переривань витрачається деякий час, в даному випадку на це йде близько 190 мкс, у перерахунку з урахуванням коефіцієнта преддітеля отримуємо 190/8 = 23,75 чи 24 відліку. Правильне значення для запису TMR0 дорівнює: 100+24=124.

В основній програмі записуємо 8 регістрів зберігання інформації відповідно до того, що хочемо вивести на матрицю. Нижче представлена ​​схема, що пояснює виведення інформації на матрицю для вищерозглянутого коду.


Крім зсувних регістрів існують спеціалізовані драйвера для виведення інформації на семисегментні індикатори та світлодіодні матриці, в цьому випадку динамічну індикацію реалізує сам драйвер, залишається тільки надсилати на нього дані для відображення. Один із таких популярних драйверів я розглянув у статті про .

Нижче за посиланням можна скачати прошивку та вихідник для мікроконтролера PIC16F628A, з реалізацією динамічної індикації на матриці 8х8 із застосуванням двох зсувних регістрів 74HC595, схема підключення була розглянута вище. На матрицю по черзі виводяться букви R, L, цифра 46, смайлик, і просто візерунок у вигляді хреста, ця анімація продемонстрована у відеоролику нижче.

з мітками, . Читати.