Урок 20. Підключення семисегментного індикатора по трьом проводам (74HC595)
Семисегментний індикатор - відмінний засіб для відображення невеликого обсягу інформації, він може відображати всі цифри та деякі літери. Він досить дешевий, поширений, ним легко управляти. Але у семисегментного індикатора є один суттєвий недолік - це велика кількість проводів для його управління. Уявіть ситуацію, ви збираєте якесь пристрій на мікроконтролері, і вам потрібно додати засіб відображення інформації, наприклад, семисегментник. Добре, коли МК "жирний" і в ньому є купа зайвих портів вводу/виводу, а якщо МК "маленький", attiny13 або attiny25, наприклад? Тоді, щоб підключити індикатор, вам потрібно використовувати зсувний регістр. Про нього зараз і піде мова, а точніше, як ним управляти в BASCOM-AVR.
Щоб зрозуміти, як управляти зсувним регістром з допомогою МК, давайте поставимо перед собою наступне завдання: зібрати пристрій, яке буде по черзі відображати цифри від 0 до 9 на семисегментному індикаторі за допомогою зсувного регістра 74HC595, а в якості керуючого контролера використаємо МК Attiny13.
І так, "залізна" частина реалізації даного завдання, принципова схема:
Як бачимо, все просто, семисегментний індикатор можна використовувати практично будь-який з загальним анодом. Я використовував GNS-5612BS-21. Живлення схеми від 3 до 5.5 вольт. Я думаю, вам не потрібно пояснювати, що таке зсувний регістр і як він працює.
Тепер "програмна" частина задачі, відкриємо BASCOM-AVR і напишемо наступний код:
regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 8 $swstack = 16 $framesize = 16 Config Portb.2 = Output Config Portb.1 = Output Config Portb.0 = Output Ds Alias Portb.2 Sh_cp Alias Portb.0 Const St_cp = 1 Dim Level As Integer Dim R1 As Byte Do If Level = 9 Then Level = 0 Else Incr Level End If R1 = Lookup(level , Numbers) Shiftout Ds , Sh_cp , R1 , 1 Pulseout Portb , St_cp , 5 Wait 1 Loop End Numbers: Data &B10000001 '0 Data &B11110011 '1 Data &B01001001 '2 Data &B01100001 '3 Data &B00110011 '4 Data &B00100101 '5 Data &B00000101 '6 Data &B10110001 '7 Data &B00000001 '8 Data &B00100001 '9
Цей код повинен відображати цифри від 0 до 9 на семисегментному індикаторі з тимчасовим інтервалом в 1 секунду. Давайте розберемося, як же все це працює і чому.
1, 2, 3, 4 і 5 рядки коду: вказуємо використовуваний мікроконтролер (Attiny13), встановлюємо тактову частоту МК (1.2 МГц) та розміри стеку і фрейму пам'яті.
7, 8 і 9 рядки коду: конфігурування портів мікроконтролера PORTB.2, PORTB.1, PORTB.0 на вихід.
11 і 12 рядки коду: призначення імен для певних портів, в даному випадку Ds для PORTB.2 і Sh_cp для PORTB.0.
13 рядок коду: призначення константи St_cp = 1, в даній константі прописано номер порту PORTB.1, до якого підключена нога St_cp зсувного регістра.
15 і 16 рядки коду: призначення змінних, в яких будуть зберігатися "проміжні" дані.
18 і 31 рядки коду: операторні дужки (Do, Loop) безкінечного циклу, тобто код, що міститься в ці дужки, буде виконуватись безкінечно.
20, 21, 22, 23 і 24 рядки коду: тут постійно збільшується значення змінної Level, при досягненні змінної значення 9 їй присвоюється 0, і рахунок починається заново. До речі, значення змінної Level і виводиться на семисегментний індикатор.
26 рядок коду: присвоюємо змінній R1 дані масиву, в якому зберігаються значення цифр, що виводяться на семисегментний індикатор. Від змінної Level залежить те, які дані з масиву ми присвоїмо змінній R1.
27 рядок коду: відправка в зсувний регістр значення змінної R1.
28 рядок коду: зафіксуємо дані в зсувному регістрі, тобто, відображаємо їх на семисегментнику.
30 рядок коду: зупиняємо виконання програми на одну секунду.
35 рядок коду: мітка масиву даних під назвою Numbers.
36...45 рядки коду: масиви даних для семисегментного індикатора.
Ось так влаштована програма, сподіваюсь, вам все зрозуміло. Так, до речі, якщо у вас індикатор з загальним катодом - не засмучуйтеся! Просто змініть всі цифри в масиві на протилежні (1 на 0, 0 на 1) і все буде працювати.
Я схему зібрав на макетній платі з механічними контактами, ось що вийшло:
При прошивці фьюз-біти залишайте по "заводу", ось картинка на всяк випадок:
Урок 21. BASCOM-AVR та Arduino
Список радіоелементів
Позначення | Тип | Номінал | Кількість | Примітка | ||
---|---|---|---|---|---|---|
U1 | МК AVR 8-біт |
ATtiny13
|
1 | |||
U2 | Зсувний регістр |
SN74HC595
|
1 | |||
R3-R9 | Резистор |
100 Ом
|
7 | |||
Семисегментний індикатор | GNS-5612BS-21 | 1 | ||||
Прикреплені файли:
- t13HC595SEG.rar (99 Кб)