Главная » Микроконтроллеры
Призовой фонд
на август 2019 г.
1. 1000 руб
Паяльник
2. Тестер компонентов MG328
Паяльник
3. 200 руб.
От пользователей

Урок 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 Поиск в Utsource В блокнот
U2 Сдвиговый регистр
SN74HC595
1 Поиск в Utsource В блокнот
R3-R9 Резистор
100 Ом
7 Поиск в Utsource В блокнот
Семисегментный индикаторGNS-5612BS-211 Поиск в Utsource В блокнот
Добавить все

Скачать список элементов (PDF)

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

Теги:

Опубликована: 0 1
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
Evgeniy #
А Вы не собираетесь описывать подключение лед матриц? (обычные или RGB). Думаю была бы очень полезная информация для начала.
Ответить
0
Antares #
Прикрутить регистр к SPI, и цены этому не будет
Ответить
0
maksms #
Для ардуино имеются такие примеры подключения к SPI - находил в интернете.
Ответить
0
Evgeniy #
Эти примеры есть и просто для MK, не только ардуино. Но в них ничего сложного нет. Главное разобраться как работает регистр и что такое SPI. С ним работать намного легче, чем ногами дергать...
Ответить
+1
Андрей #
Да, кстати, если у вас индикатор с общим катодом - не расстраивайтесь! Просто поменяйте все цифры в массиве на противоположные (1 на 0, 0 на 1) и всё будет работать.
Не будет.
Для индикатора с общим катодом этот самый общий катод должен быть подключен не на Vcc как у вас, а на GND.
Ответить
0
Андрей #
Почему в реальной схеме не видно резисторов токоограничивающих?
Ответить
0
Илья #
А разве нельзя вместо 7 резисторов, поставить один между общим анодом и Vcc?
Ответить
0
Евгений #
В этом случае каждая цифра будет светиться с разной яркостью, так как в каждой цифре будет включено разное количество светодиодных сегментов. В "1" их будет всего 2, а в "8" - 7. Один резистор ограничит ток через ВСЕ подключенные в данный момент светодиоды. Чем их больше, тем меньше ток. В итоге "1" будет гореть ярче, чем "8".
Ответить
0
Арт #
Подключил так 5 индикаторов, вывожу на них время,но они мигают (блекло, но все же видно) при переходе на новый разряд, сталкивался кто с таким?)
Ответить
0
ven100 #
Можно уточнить, 5 индикаторов на одну тиньку13 ?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Бокс для хранения компонентов Модуль измерения тока на ACS712 (30А)
вверх