Урок 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) і все буде працювати.

Я схему зібрав на макетній платі з механічними контактами, ось що вийшло:

При прошивці фьюз-біти залишайте по "заводу", ось картинка на всяк випадок:

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

Позначення Тип Номінал Кількість Примітка
U1 МК AVR 8-біт
ATtiny13
1
U2 Зсувний регістр
SN74HC595
1
R3-R9 Резистор
100 Ом
7
Семисегментний індикатор GNS-5612BS-21 1
Додати всі

Прикреплені файли:

Top