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

Похожие статьи:



Никелевая лента для точечной сварки аккумуляторов 18650

Урок 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-211 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (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

Программатор Pickit3
Программатор Pickit3
Конструктор УНЧ 60 Вт на LM3886 Discovery V8
вверх