Семисегментный индикатор отличное средство для отображения небольшого объема информации, он может отображать все цифры и некоторые буквы. Он достаточно дешёв, распространён, им легко управлять. Но у семисегментного индикатора есть один существенный недостаток - это большое количество проводов для его управления. Представьте ситуацию, вы собираете, какое либо устройство на микроконтроллере и вам нужно добавить средство отображения информации, например семисегментник. Хорошо когда МК "жирный" и в нём есть куча лишних портов ввода/вывода, а если МК "маленький", 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 | Поиск в магазине Отрон | |||
Скачать список элементов (PDF)
Прикрепленные файлы:
- t13HC595SEG.rar (99 Кб)
Комментарии (10) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Для индикатора с общим катодом этот самый общий катод должен быть подключен не на Vcc как у вас, а на GND.