Я думаю, у багатьох при використанні динамічної індикації на семисегментних індикаторах виникали проблеми з яскравістю індикаторів. А все тому, що сегменти постійно підключаються – відключаються і виходить якусь подобу ШІМ. Щоб цього не відбувалося, слід використовувати статичну індикацію. При такому принципі сегменти запалюються один раз і перемикаються тільки при зміні цифри. Це і програмно зручно: не потрібно постійно викликати з програми функції або підпрограми, що відповідають за динамічну індикацію. Потрібно тільки при зміні даних повторно вивести їх на дисплей і все.

Але виникає проблема: для цього потрібно багато висновків мікроконтролера. Наприклад, якщо у нас 4 цифри, то потрібно 8х4 = 32 висновку, у у Мегі16 їх всього 32. Тому для реалізації статичної індикації необхідно використовувати зсувні регістри або розширювачі портів.

Розширювачі портів, як правило, підключаються до мікроконтролера через SPI/I2C і представляють із себе повноцінний порт введення-виведення, який можна налаштувати на вхід / вихід і перевести в високоомне Hi-Z сотояние (це коли висновок як-би ні до чого не підключений).

А зсувні регістри (я розглядаю саме 74hc595) дають нам сукупність ніжок, що є виходами і їх також можна перевести в стан Hi-Z. Управляються вони через послідовний інтерфейс. У даному випадку це подоба SPI. Звичайно, існують і регістри з паралельним входом – послідовним виходом і інші, але ми не будемо їх розглядати в рамках цієї статті.

Як Ви вже здогадалися, для реалізації статичної індикації нам досить зсувних регістрів. Напевно, найпопулярніші з них – 74hc595. Це регістри-засувки з послідовним входом – паралельним виходом. Засувками вони називаються тому, що після того, як ми запишемо в них дані, їх необхідно “заклацнути” – перевести на деякий час стан одного з пінів в логічну одиницю. Тільки після цього буде змінено стан виходів.

Ось терморегулятори регістра:

Розпишу висновки по порядку:

  • VCC і GND – харчування, воно може бути в межах від 2 до 6 Вольт.
  • Qa – Qh – виходи регістра, кожен з них тягне до 6 мА струму при живленні 5 Вольт.
  • Qh ‘- висновок для об’єднання декількох регістрів. Він підключається до входу даних наступного регістра, ще розповім про це.
  • SER – вхід даних регістра.
  • SRCLK – вхід для тактових імпульсів.
  • RCLK – Засувка. Подаємо на нього одиницю і дані заклацуються.
  • OE – Якщо подати на цей висновок 1, то виходи передут в високоомне стостояніе, якщо 0 – в робочий сотояние (0 або 1).
  • SRCLR – скидання регістра.

Для реалізації статичної індикації на знадобляться висновки харчування, виходи регістра і висновки SER, SRCLK, RCLK. Якщо більше одного регістра – можна з’єднати їх ланцюжком: висновок Qh ‘попереднього регістра з висновком SER наступного. Ось загальна схема включення (підтяжка RESET у МК НЕ намальована, але мається на увазі; картинка клікабельні):

Порядок запису в регітр такий: спочатку встановлюємо потрібний уровель на SER, який повинен відповідати необхідному биту, потім встановлюємо в одиницю SRCLK і потім відразу-ж встановлюємо його в нуль. Відбудеться висновок 1 біта, наступний біт буде зрушувати попередній. Повторюємо такий цикл 8 разів (або 32 рази з 4-ма розрядами індикатора), після всіх дій встановлюємо в одиницю засувку, потім Обнуляємо, і дані будуть обработина і виведені. Більш докладно розписано в коментарях до коду прикладу. Завантажити можна в кінці статті.

Для реалізації статичної індикації я написав недольшую бібліотеку. Вона спочатку підтримує Дисплей з 4-ма цифрами. При бажанні можете скоротити / збільшити кількість цифр. У коментарях до коду всі детально розписано. Користуватися бібліотекою просто. Для початку додайте файл 74hc595segment.asm в папку з проектом, підключіть бібліотеку до проекту де-небудь в кінці програми, там, де знаходяться підпрограми:

.include "74hc595segment.asm"

Після, там, де у Вас ініціалізація, додайте рядок з ініціальзаціей (швидше, налаштуванням портів):

rcall display_init

Далі пропишіть порти введення-виведення, на яких будуть висіти регістри, визначення знаходяться на початку файлу з бібліотекою:

;==========================================================================; Вказуємо висновки, на яких буде сидіти шина даних; Спочатку порти і DDR
.equ DS_PORT =   PORTA. Equ DS_DDR = DDRA; Дані
.equ TAKT_PORT = PORTA. Equ TAKT_DDR = DDRA; Вхід тактіровкі 74hc595
.equ ZAS_PORT =  PORTA. Equ ZAS_DDR = DDRA; Засувка; А далі вказуємо конкретні висновки. Equ ZAS = PA2; Засувка. Equ TAKT = PA1; Вхід тактіровкі 74hc595. Equ DS = PA0; Дані
;=========================================================================

Тепер можна користуватися. Завантажені в змінні цифри і виводимо їх на дисплей:

ldi r16, 1; завантажені ціфоркі у відповідні комірки пам'яті.
sts digits,r16
ldi r16,2
sts digits+1,r16
ldi r16,3
sts digits+2,r16
ldi r16,4
sts digits+3,r16ldi r16, 0b00001000; Установка точки.
sts digits+4,r16; Молодші 4 біти відповідають чотирьом точкам (ліворуч-праворуч).rcall display; Виводимо на дисплей дані

Повний текст програми:

;=========================================================================; Тестова програма для перевірки Біблітека, предназначеной; Для реалізації статичної індикації на семісегментніках з; Використанням зсувних регістрів 74hc595
;    ©LPA, 2012
;  radioelektr.ru
;=========================================================================
.include "m16Adef.inc"
;=========================================================================
ldi r16,low(ramend)
out spl,r16
ldi r16,high(ramend)
out sph,r16; Стек
rcall display_init; Налаштування портів введення-виведення, до яких підключені регістри
;=========================================================================ldi r16, 1; завантажені ціфоркі у відповідні комірки пам'яті.
sts digits,r16
ldi r16,2
sts digits+1,r16
ldi r16,3
sts digits+2,r16
ldi r16,4
sts digits+3,r16ldi r16, 0b00001000; Установка точки.
sts digits+4,r16; Молодші 4 біти відповідають чотирьом точкам (ліворуч-праворуч).rcall display; Виводимо на дисплей даніmain:; Головний цикл порожній
rjmp main
;=========================================================================. Include "74hc595segment.asm"; Підключення бібліотеки

А ось що з цього вийшло:

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

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

В архіві є дві прошивки з вихідними кодами і моделі в Протеус (v 7.7 SP2). Ісходникі прокоментовані.

Удачи!

Завантажити бібліотеку для статичної індикації та приклади

radioelektr.ru