Главная » Статьи » Как подключить

Подключение семисегментного индикатора через 74hc595. Статическая индикация.

 Ранее был рассмотрен вариант того, как можно сэкономить кучу портов вывода микроконтроллера, применив сдвиговый регистр 74HC595. Сейчас посмотрим, как это можно применить на практике, подключив к микроконтроллеру, через регистр, семисегментный индикатор с общим анодом. Этот пример подходит только для индикаторов, у которых сегменты между разрядами не соеденены вместе. Например, если индикатор собран из одноразрядных семисегментников.

Схема подключения (кликабельно):

 Каждый разряд индикатора подключен к микроконтроллеру через свой регистр. При этом получается, что сдвиговый регистр является буфером в котором хранится выводимая цифра. И отправив значение на индикатор, микроконтроллер может заниматься своими делами, не отвлекаясь на индикацию. Удобно? Очень! Не нужно заморачиваться с динамической индикацией и таймерами. 


Код в Bascom-AVR, для примера выведем на индикатор число 123 :

$regfile = "m8def.dat"
$crystal = 1000000

Config Portd = Output

'значение этой переменной должны будем вывести на индикатор
Dim A As Word

'переменные для преобразования исходного числа
Dim N1 As Integer
Dim N2 As Integer
Dim N3 As Integer

'для значений отправляемых в регистр
Dim R1 As Byte                                              'сотки
Dim R2 As Byte                                              'десятки
Dim R3 As Byte                                              'единицы



A
= 123                                                             'выведем вот это число

'раскладываем число на составляющие

N1 = A / 100                                                'подготовка соток, N1=1

N2 = A Mod 100                                              'подготовка десяток, N2=2
N2 = N2 / 10

N3 = A Mod 10                                               'подготовка единиц, N3=3


'вытаскиваем из массива подготовленные значения
R1 = Lookup(n1 , Numbers)
R2 = Lookup(n2 , Numbers)
R3 = Lookup(n3 , Numbers)

'задвигаем в регистры значения, единицы идут первыми
Shiftout Portd., Portd., R3 , 1
Shiftout Portd., Portd., R2 , 1
Shiftout Portd., Portd., R1 , 1

Pulseout Portd , 7 , 5                                      'защелкиваем данные

End

'массив с кодами для семисегментника
Numbers:
Data &B11000000                                             '0
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9


 Схему собрал на беспаячной макетке (solderless breadboard), вещь зачетная если не обращать внимание на необходимое количество соединительных проводов =) Результат экспериментов ниже:

 

 

 Еще одним огромным плюсом этого метода является неизменное количество занимаемых ног микроконтроллера. Для использования необходимы всего три вывода мк, вне зависимости от количества подключаемых разрядов.  

 Скачать файлы проекта (в архиве исходник, прошивка и файлик протеуса)


 Из минусов рассмотренного метода (куда же без них) можно назвать большое количество используемых сдвиговых регистров (но учитывая копеечную стоимость этой логики это не так страшно). Главным минусом  метода является невозможность использовать многоразрядные индикаторы, в которых выводы сегментов соединены вместе. Такие индикаторы предназначены для динамической индикации, поэтому рассмотрим следующий пример:

 Подключение семисегментного индикатора через 74hc595. Динамическая индикация >>>>


Смотрите также:

Категория: Как подключить | Добавлено: 29.11.2011
Просмотров: 48629 | Комментарии: 6 | Рейтинг: 5.0/6
Всего комментариев: 6
6 exersizze   (02.06.2012 19:36) [Материал]
Команда pulseout расчитана на частоту 4МГц, тоесть если частота будет больше то импульс будет меньше. А при частоте 1МГц команда "Pulseout 5" должна по идее выдать импульс длительностью 20 мсек

5 amv2000   (02.06.2012 18:01) [Материал]
Pulseout Portd , 7 , 5 'защелкиваем данные

Здесь нет ошибки 5 мкс это для 8 Мгц ? для 10 Мгц наверное 15, для 16 Мгц 20 мкс....

4 exersizze   (27.05.2012 17:12) [Материал]
Сперва зажигаем анод/катод нужного разряда, затем толкаем в регистр данные для зажигания нужных сегментов. После ожидания в несколько мсек, повторяем со следующим разрядом.

3 amv2000   (27.05.2012 16:20) [Материал]
Что то я не пойму, как со сдвиговым регистром сделать динамическую индикацию, на дисплее каша? что первым проталкиваем цифры или разряды?
Code

$regfile = "m32def.dat" ' тип МК
$crystal = 16000000 ' выбор кристала для расчета задержек

'*****************************************[Определение переменных и констант]************************************

Dim Count As Byte ' переменная для работы с индикацией
Dim Ledout As Byte ' переменная для загрузки в регистры сдвига
Dim Number(4) As Byte ' значения 6-ти разрядов
Dim H_flag(4) As Byte ' флаги точек 6-ти разрядов
Dim Blink_count As Word ' счетчик времени мигания
Dim Blink_flag(4) As Byte ' флаги мигания разрядов

'***********************************************[Инициализация портов]*******************************************

Ddrc = &B11111111 'порт В на выход ' вывод SH_CP регистра (тактовые импульсы)

'*********************************************[Инициализация прерываний]*****************************************

Config Timer0 = Timer , Prescale = 64 ' конфигурируем таймер индикации
On Ovf0 Refresh ' метка на прерывание индикации

Enable Interrupts ' разрешаем прерывания
Enable Ovf0 ' и для индикации в частности

'********************************************[Присвоение уникальных имен]****************************************

595clock Alias Portc.0 : 595data Alias Portc.1 ' выводы 74HC595

'*********************************************[Начало основной программы]****************************************

Number(1) = 1 ' на индикацию выводим -tESt-
Number(2) = 2
Number(3) = 3
Number(4) = 4

Blink_flag(1) = 1 ' мигаем первым и шестым разрядом
Blink_flag(4) = 1

'-------------------------

Do

Loop

'***********************************[Процедуры обработки подпрограмм и прерываний]*******************************

Refresh: ' прерывание таймера Т0

If Blink_flag(count) = 1 And Blink_count > 200 Then ' если флаг мигания выставлен и счетчик > 200
Ledout = Lookup(0 , Rank) ' выключаем разряд
Else ' иначе (флаг не выставлен, либо счетчик < 200)
Ledout = Lookup(count , Rank) ' забираем в переменную номер разряда
End If

Shiftout 595data , 595clock , Ledout , 1 ' закидываем в регистр

Incr Count : If Count > 4 Then Count = 1 ' выбираем разряд для загрузки
Incr Blink_count : If Blink_count > 400 Then Blink_count = 1 ' длительность мигания

Ledout = Lookup(number(count) , Digits) ' забираем в переменную код цифры

If H_flag(count) = 1 Then ' управление точками индикатора
Ledout = Ledout Xor &B00100000
End If

Shiftout 595data , 595clock , Ledout , 1 ' закидываем в регистр

Pulseout Portc , 2 , 20 ' защелкиваем данные (для 8МГц импульс 5мкс)

Return

'******************************************************[DATA]****************************************************

Digits: ' цифры

Data &B11000000 , &B11111100 , &B10100100 , &B10110000 , &B10011001 ' 0 1 2 3 4
'-------------------------

Rank: ' разряды

'Data &B00000000 ' выкл
Data &B00000001 , &B00000010 , &B00000100 ' 1 2 3
Data &B00001000 , &B00010000 , &B00100000 ' 4 5 6

2 exersizze   (09.04.2012 10:13) [Материал]
Как по мне так очень удобная штука, пользуюсь с удовольствием. У меня она 700-дырочная и иногда бывает что негде развернуться, на фотке видно 4 корпуса+3 семисегментника и все, места не осталось.

1 Andrew   (09.04.2012 08:34) [Материал]
Я удивлен что все работает с таким количеством проводов ! Стоит ли мне покупать бреадбоард ?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: