Семисегментный индикатор отличное средство для отображения небольшого объема информации, он может отображать все цифры и некоторые буквы. Он достаточно дешёв, распространён, им легко управлять. Но у семисегментного индикатора есть один существенный недостаток — это большое количество проводов для его управления. Представьте ситуацию, вы собираете, какое либо устройство на микроконтроллере и вам нужно добавить средство отображения информации, например семисегментник. Хорошо когда МК «жирный» и в нём есть куча лишних портов ввода/вывода, а если МК «маленький», 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-битATtiny131
U2
Сдвиговый регистрSN74HC5951
R3-R9
Резистор100 Ом7
Семисегментный индикаторGNS-5612BS-211
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- t13HC595SEG.rar (99 Кб)