Підключення семисегментних індикаторів до avr

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

На малюнку 1 зображено зовнішній вигляд індикатора. Прийнято кожен сегмент індикатора позначати латинською буквою: a, b, c, d, e, f, g. Точка позначається буквою h.

За схемою включення семисегментний індикатори поділяються на індикатори із загальним катодом і з загальним анодом. Схеми включення наведені на малюнку 2.

Підключити один семисегментний індикатор і керувати ним за допомогою мікроконтролера процедура нескладна. Для цього достатньо сегменти індикатора підключити до порту мікроконтролера через струмообмежувальні резистори по 150 Ом. Загальний висновок підключити до лінії іншого порту мікроконтролера. Залежно від того яку цифру треба вивести, в порт виводимо двійковий код цієї цифри, посилаючись на тип підключеного індикатора (із загальним анодом або катодом) на загальний провід подаємо плюс або мінус. Для зручності можна зробити таблицю кодів для індикатора. Якщо підключення таке: PD7-h, PD6-g, PD5-f, PD4-e, PD3-d, PD2-c, PD1-b, PD0-a, то для відображення цифри 1 в порт D потрібно вивести такий двійковий код: 0b00000110.

Для відображення цифрових даних одного семисегментний індикатора зазвичай недостатньо. У таких випадках до мікроконтролеру підключають відразу кілька індикаторів. Однак, через відсутність достатньої кількості висновків у мікроконтролера застосовують спеціальні методи. Один з таких методів це динамічна індикація. Режим динамічної індикації застосовують для побудови багаторозрядних індикаторів. При такому режимі розряди індикатора працюють не одночасно, а по черзі. Перемикання розрядів відбувається з великою швидкістю (50 Гц), через це людське око не помічає. що індикатори працюють по черзі. Так як у світлодіодів дуже мала інерційність, що змінюються розряди сліваютя в одне зображення. У цьому режимі в кожен момент часу працює тільки один розряд, включаються по черзі починаючи з першого закінчуючи останнім, потім все починається спочатку.

Зробимо простий секундомір. Відлік секунд буде проводиться на четирехразрядном індикаторі (із загальним анодом) від 0 до 9999. В нашій програмі використовуємо процедуру переривання по таймеру, тобто зміна розряду індикатора буде відбуватися кожного разу коли таймер дорахував до кінця (до 255). Використовуємо восьмизарядний таймер / лічильник Т2. він буде працювати в нормальному режимі. Але зазвичай для реалізації динамічної індикації використовують режим СТС (скидання при збігу), це режим, при якому частота виникнення переривань за випадковим збігом значень лічильника таймера і регістра OCR2 визначається вмістом OCR2 і предделителя тактової частоти таймера. При такому режимі роботи таймера можна легко змінювати частоту оновлення розрядів, записуючи в регістр порівняння OCR2 необхідне значення, попередньо розраховане. Частоту поновлення розрядів роблять зазвичай 50Hz або більше, так як у нас 4 розряду, частота оновлення буде дорівнює 200Hz. Підрахуємо частоту оновлення для нашого прикладу: тактова частота дорівнює 8MHz, переддільник зробимо на 8. На вхід таймера будуть надходити імпульси частотою 1MHz. Тоді таймер буде збільшувати значення кожні 1 мікросекунду, переповнюватися він буде кожні 255 * 0,000001 = 255 мкс. Частота оновлення буде дорівнює 1 / 255мкс = 3921Hz.

Підключення семисегментних індикаторів до avr

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

Масив з кодами чисел вийде такий:

У обробнику переривань ми використовуємо оператор switch. цей оператор дозволяє замінити складну функцію з операторів if. У загальному вигляді він виглядає так:

Даний оператор робить вибір за висловом, зазвичай це число. Якщо вираз присутній в значенні case. то виконуються команди після case до break. інакше виконується код після default.

Нижче наведено повний текст програми:

Вітаю!
Поясніть, будь ласка, навіщо використовується ключове слово volatile?

Вітаю!
Поясніть, будь ласка, навіщо використовується ключове слово volatile?


Тому що змінна використовується як в обробнику переривання так і в основному циклі

Добрий день.Можно чи за допомогою даного алгоритму виводити дані з двох змінних? Наприклад змінна hour в перші два розряди, а min в другі (припустимо годинник).

Можна, наприклад так:
код:
switch (segcounter)
<
case 0:
PORTD =

(SEGMENTE [hour% 100/10]);
break;
case 1:
PORTD =

(SEGMENTE [hour% 10]);
break;
case 2:
PORTD =

(SEGMENTE [minute% 100/10]);
break;
case 3:
PORTD =

Велике спасибі. Ваш відповідь наштовхнув на думку про те, що в принципі можна створити чотири змінні для кожного розряду, а в основному коді рулити розрядами як завгодно. Як ви думаєте?
код:
switch (segcounter)
<
case 0:
PORTD =

(SEGMENTE [raz2]);
break;
case 2:
PORTD =

(SEGMENTE [raz3]);
break;
case 3:
PORTD =

Перевірив в протеус, працює. Те, що потрібно було.

Привіт, а чи можна як то реалізувати управління 2-розрядних індикатором керуючи всього однією ніжкою розрядами? тобто підключаю як в схемі сегменти. але розряди підключаю один до ніжці МК, другий через логіку (НЕ) до цієї ж ніжці МК. І відповідно при 0 світитися один розряд, при 1 інший розряд. чи можна це програмно як то реалізувати?

Привіт, а чи можна як то реалізувати управління 2-розрядних індикатором керуючи всього однією ніжкою розрядами?


Так, можна, наприклад так:
код:
ISR (TIMER2_OVF_vect)
PORTD = 0xFF;
switch (segcounter)
case 0:
PORTD =

(SEGMENTE [display% 10]);
PORTB | = (1 <break;
case 1:
PORTD =

(SEGMENTE [display% 100/10]);
PORTB =

Добрий вечір. Скажіть а можна і як можна додати енкодер вірніше зробити з цієї моделі реверсивний лічильник на LED індикаторі спамятью EEPROM, пожайлусеф допоможіть мені Плиз. Заздалегідь дякую.