Урок 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