💥 подключаем сдвиговый регистр 74hc595 ардуино

ШИМ

Как же использовать ШИМ, ведь мы же часто управляем при помощи регистра светодиодами, а выходы регистра могут иметь только 3 состояния — логический ноль LOW, логическая единица HIGH и высокоимпедансное состояние (пин не имеет физического контакта с электрической цепью). И действительно ШИМ сдвиговым регистром не поддерживается, но есть одна небольшая хитрость — мы можем использовать выход регистра OE (Output Enable input) — он отвечает за переключение из высокомного состояния в ноль. Выход OE — можно назвать логическим нолем для всех выходов. Таким образом, если мы подключим этот пин к ШИМ-выходу Arduino, то сможем таким образом смещать логический ноль, тем самым имитировать ШИМ на светодиодах.

Читайте на сайте Codius

Минус данного подхода заключается в том, что в этом случае регулируется яркость всех светодиодов, подключённых к одному сдвиговому регистру. А что же делать, если нам нужно показать разную яркость светодиодов, подключённых к одному сдвиговому регистру. Здесь снова нужно будет пойти на хитрость — создать карту яркостей светодиодов, и зажигать каждую группу со своей яркостью по очереди, так быстро, чтобы создавалось ощущение постоянного свечения:

Но если вы начнёте экспериментировать с задержками и большим количеством карт яркости, то столкнётесь с очень неприятным эффектом мерцания — это связно с большим временем исполнения стандартных для языка Arduino функций-обёрток типа digitalWrite, digitalRead, analogWrite, analogRead и т.д.

Другие регистры, например, STP16C596 могут управлять 16 светодиодами одновременно без использования дополнительных резисторов.

Как работает регистр сдвига?

Прежде чем мы начнем подключать чип, давайте рассмотрим, как этот процесс работает.

Первое, что нужно прояснить, — это понятие «биты» для тех из вас, кто не знаком с двоичным кодом. Когда мы говорим о «битах», мы имеем в виду одно из чисел, составляющих двоичное значение. В отличие от обычных чисел, мы обычно считаем, что первый бит является самым большим. Итак, если мы берем двоичное значение 10100010, первый бит на самом деле равен 0, а восьмой бит равен 1. Следует также отметить, если это не подразумевалось, каждый бит может быть только 0 или 1.

Чип содержит восемь контактов, которые мы можем использовать для вывода, каждый из которых связан с битом в регистре. В случае сдвигового регистра 74HC595 мы рассматриваем их от QA до QH.

Чтобы записать эти выходы через Arduino, мы должны отправить двоичное значение в регистр сдвига, и из этого числа сдвиговый регистр может определить, какие выходы использовать. Например, если мы отправили двоичное значение 10100010, контакты, выделенные зеленым цветом на изображении выше, будут активными, а выделенные красным цветом будут неактивными.

Это означает, что самый правый бит сопоставляется как QH, а левый бит сопоставляется с QA. Выход считается активным, когда бит, сопоставленный с ним, установлен на 1

Важно помнить об этом, так как иначе вам будет очень сложно узнать, какие контакты вы используете

Теперь, когда у нас есть основное понимание того, как мы используем смещение битов, чтобы указать, какие контакты использовать, мы можем начать подключать его к нашему Arduino.

Что такое 4-разрядный 7-сегментный индикатор hs420561k-32

Как можно увидеть на фото, 4-разрядный 7-сегментный индикатор идеально подходит для задуманного прибора. Один разряд будет отвечать за вывод минуса, при необходимости, второй и третий разряд оставим для вывода градусов, а четвертый будет просто для красоты, всегда выводить значок градусов.

В первую очередь нужно разобраться, как работает индикатор. У модуля 12 ног, 4 из них являются катодами, и каждый отвечает за один разряд из четырех – на какую ногу будет подан минус, тот разряд и будет активным. 8 других являются анодами и каждая отвечает за один из 7 сегментов и за точку внизу цифры. Таким образом, мы можем управлять каждым сегментом и разрядом. Единственная проблема кроется в том, что выводить можно одновременно только одну цифру на каждом разряде. Побороть это не сложно, достаточно просто за очень короткий промежуток времени по очереди выводить нужную информацию на каждый из разрядов. Человеческий глаз не сможет уловить переключение и будет казаться, что одновременно горят все разряды. Даже фотокамера не смогла это уловить – это видно по фотографии, которую я прикладывал выше.
Посмотреть какая нога индикатора за что отвечает, можно по картинке ниже.

Для удобства работы и чтобы закрепить знания из прошлой статьи про сдвиговый регистр я решил использовать в схеме микросхему 74HC595. Это снизит количество задействованных пинов ардуино. Ниже я привел схему подключений, она получилось кривая, надеюсь, со временем я научусь рисовать их качественней :). P.S. На схеме я не нарисовал 3 резистора — пропустил, их нужно добавить между пинами arduino и ножками hs420561k-32 с именами A, F и B.

6Подключение нескольких регистров сдвига к Arduino

Если подключить несколько сдвиговых регистров таким образом, чтобы линии CLOCK (SCLK на рисунке ниже), MOSI и MISO у них были общие, а ENABLE (SS на рисунке) каждой микросхемы подключались к разным цифровым выводам Arduino, то можно независимо обращаться к каждому из сдвиговых регистров, активизируя низким уровнем соответствующий из них, и записывать в регистры данные и считывать из них данные. Такое подключение называется независимым.

Независимый и каскадный типы подключений по интерфейсу SPI

Независимое подключение ведомых SPI устройств (например, регистров 74HC595) к ведущему (например, Arduino) изображено на левой части рисунка. Думаю, это уже достаточно просто для нас, так как оно почти ничем не отличается от подключения одного сдвигового регистра. Поэтому давайте рассмотрим другой тип подключения – каскадный.

3Подключение сдвигового регистра74HC595 к Arduino

Давайте соберём схему, которая показана на рисунке.

Схема подключения сдвигового регистра 74HC595 к Arduino

Вот таблица подключений:

Вывод свдигового регистра 74HC595 Вывод Arduino
VCC 5V
GND GND
DS 11 (MOSI)
STCP 10 (CS)
SHCP 13 (SCK)
Q7′ 12 (MISO)
OE# GND
MR# 5V

Вывод OE# подключим к земле, чтобы разрешение на вывод данных было всегда активно. А вывод MR# подключим к питанию, таким образом заблокируем случайный сброс устройства.

На монтажной плате 8-штырьковый разъём типа PLS – это выход, с которого будем снимать параллельные данные сдвигового регистра.

Я также подключу ко всем ножкам микросхемы регистра сдвига логический анализатор. С помощью него мы увидим, что же происходит на физическом уровне, какие сигналы куда идут, и разберёмся, что они означают. У меня получилось так, как показано на фотографии.

Подключение сдвигового регистра 74HC595 к Arduino

Преимущества использования сдвигового регистра 74HC595:

  • не требует никакой обвязки кроме конденсатора по питанию;
  • работает через широкораспостраненный интерфейс SPI;
  • для самого простого включения достаточно двух выходов микроконтроллера;
  • возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
  • частота работы до 100 МГц;
  • напряжение питания от 2 В до 6 В;
  • дешевый — стоит менее 5 центов;
  • выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).

Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:

  • 8-битного регистра сдвига,
  • 8-битного регистра хранения,
  • 8-битного выходного регистра.

Рассмотрим какие выводы есть у сдвигового регистра 74hc595.

Общего вывод и вывод питания объяснений не требуют.

  • GND — земля
  • VCC — питание 5 вольт

7Каскадное подключение регистров сдвига к Arduino

Давайте подключим три регистра сдвига 74HC595 к Arduino и попробуем управлять ими по SPI.

В разделе 3 этой статьи была дана схема подключения одного регистра 74HC595 к Arduino. Схема, когда к Arduino подключены несколько ведомых устройств в каскадном режиме, отличается не сильно. Основное отличие в том, что используется один пин выбора ведомого, который активирует одновременно все подключённые устройства (пин SS Arduino подключён ко всем входам STCP), а также данные из ведущего (выход MOSI Arduino) передаются первому в цепочке ведомому 74HC595 на вход последовательных данных DS, тот в свою очередь из последовательного порта Q7′ передаёт данные следующему ведомому на последовательный вход DS, и так далее. Последний ведомый из своего порта Q7′ передаёт данные ведущему в линию MISO, но в нашем случае это не обязательно. Остальные выводы сдвиговых регистров подключены так же, как на предыдущей схеме. У Arduino же используются те же 4 стандартных пина SPI, что и при подключении к единственному регистру сдвига.

Соберём в соответствии с этим нашу схему. У меня получилось как-то так:

Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны параллельных выходов 74HC595 Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны пинов управления 74HC595

Теперь напишем скетч для «бегущей волны», но теперь она будет немного длиннее. В моём случае – из 19-ти светодиодов, каждый из которых будет представлять один из разрядов параллельных выходов (на все 24 не хватило места на монтажке).

Скетч «бегущей волны» со сдвиговым регистром (разворачивается)

#include <SPI.h>

void setup() {
  pinMode(PIN_SPI_SS, OUTPUT);
  SPI.begin();
  Serial.begin(9600);
}

void loop() {
  for (int i=0; i<20; i++) { //вообще, тут нужно писать i<25, т.к. всего параллельных выходов у трёх регистров 24

    unsigned long num = (long)1<<i; // "гоним" горящий огонёк по разрядам, сдвигая единицу на 1 разряд влево каждую итерацию 
    /* 
    * 19 (или 24) разрядов числа поместятся только в беззнаковый long 
    * unsigned long может хранить до 32-х разрядов. 
    * Т.к. у нас три сдвиговых регистра или 3*8=24 бит, то используем этот тип данных 
    */

    /* 
    * Реализация SPI в Arduino такова, что можно передавать числа либо байтами, либо словами по 2 байта.
    * Поэтому делим наше число на байты, их получается 3, как и регистров сдвига:
    */
    byte a = (byte)num; //младшие 8 бит числа
    byte b = (byte)(num>>8);//средние 8 бит числа
    byte c = (byte)(num>>16); //старшие 8 бит числа

    digitalWrite(PIN_SPI_SS, LOW); // начинаем передачу по SPI
    SPI.transfer(c); //передаём старший байт числа
    SPI.transfer(b); //передаём средний байт числа
    SPI.transfer(a); //передаём младший байт числа
    digitalWrite(PIN_SPI_SS, HIGH); // завершаем передачу по SPI

    // Контрольный вывод в COM-порт:
    Serial.print((String)i + ": ");
    Serial.print(num, HEX);
    Serial.print("=");
    Serial.print(c, HEX);
    Serial.print(",");
    Serial.print(b, HEX);
    Serial.print(",");
    Serial.println(a, HEX);

    delay(100); // задержимся немного
  }
}

Обратите внимание, мы обращались к параллельным выходам 3-х сдвиговых регистров как к большому 24-разрядному числу. Но что делать, если вы подключили к Arduino большее количество 74HC595? Такими большими числами Arduino, конечно же, оперировать не умеет

В таком случае придётся работать с байтами. То есть передавать в каждый регистр своё 8-разрядное значение.

А вот так это выглядит в действии:

Каскадное подключение трёх сдвиговых регистров к Arduino в действии

На видео в конце статьи результат наглядно показан в динамике. К каждому из трёх сдвиговых регистров подключены светодиоды своего цвета – красные, зелёные и синие, и видно, как наше число «перескакивает» с регистра в регистр.

Таким образом, мы детально изучили вопрос информационного обмена между ведущим устройством, в роли которого выступил Arduino, и сдвиговым регистром 74HC595. Научились подключать сдвиговый регистр, записывать в него данные и считывать из него данные.

Пример 1: Использование одного сдвигового регистра

Сначала сдвиговый регистр нужно обеспечить питанием и включить. Для этого нужно подключить следующие контакты:

  • GND (контакт 8) на регистре к «земле» на Arduino
  • Vcc (контакт 16) на регистре к 5V на Arduino
  • OE (контакт 13) на регистре к «земле» на Arduino
  • MR (контакт 10) на регистре к 5V на Arduino

Это сделает все выходные контакты активными и всегда доступными. Впрочем, есть и один недостаток – до того, как скетч запустится, светодиоды получат значения, которые отправлялись им в самый последний раз, или даже произвольные значения. Решить эту проблему можно, выделив для OE и MR дополнительные контакты на Arduino, однако в этом случае свободных контактов на Arduino, что очевидно, станет на два меньше.

Затем к Arduino нужно подключить 3 «интерфейсных» контакта:

  • DS (контакт 14) на регистре к цифровому контакту 11 на Arduino (синий провод)
  • SH_CP (контакт 11) на регистре к цифровому контакту 12 на Arduino (желтый провод)
  • ST_CP (контакт 12) на регистре к цифровому контакту 8 на Arduino (зеленый провод)

В скетчах эти контакты будут называться dataPin (контакт для данных), clockPin (тактовый контакт) и latchPin (контакт-защелка) соответственно

Обратите внимание, что к контакту-защелке подключен конденсатор на 0,1 фарад – он нужен для того, чтобы смягчить возможные колебания от импульсов.

Теперь подключаем светодиоды. Катод (короткая ножка) каждого светодиода подключается к общей «земле», а анод (длинная ножка) – к соответствующему выходному контакту сдвигового регистра. В результате получается, что регистр не только управляет светодиодами, но и питает их энергией, т.е. он является для них «источником тока». У некоторых регистров такой функции нет, они могут только «потребителями тока». Если вам попался именно такой регистр, то светодиоды к нему нужно подключать по-другому: аноды – к питанию, а катоды (т.е. заземляющие контакты светодиодов) – к выходным контактам сдвигового регистра. Если это чип, не принадлежащий к семейству «595», то лучше свериться с даташитом. И не забывайте про 220-омовые резисторы, чтобы защитить светодиоды от перегрузки.

Так будет выглядеть вся схема:

Код

Ниже – три скетча-примера. Первый – это «Простая передача битов», который просто выводит на светодиоды байт со значением от «0» до «255». Второй скетч одновременно зажигает все светодиоды. Третий циклами проходит по массиву.

Все эти скетчи базируются на информации из даташита – диаграмме синхронизации и таблицы с описанием логики (см. ниже)

В частности, таблица с логикой объясняет, что все самое важное происходит при переходе из LOW в HIGH. В частности, когда состояние на контакте clockPin переходит из LOW в HIGH, сдвиговый регистр считывает состояние с контакта данных

Попав в сдвиговый регистр, данные сохраняются во внутреннем регистре памяти. Кроме того, когда состояние переключается из LOW в HIGH на контакте latchPin, эти данные из регистра памяти перемещаются к выходным контактам, подключенным к светодиодам.

Вот диаграмма синхронизации:

Вот таблица, описывающая логику:

ВВОД ВЫВОД Функция
SH_CP ST_CP OE MR DS Q7’ Qn
X X L L X L б.и. Состояние LOW на MR затрагивает только сдвиговый регистр
X ˄ L L X L L Пустой сдвиговый регистр загружается в регистр памяти
X X H L X L Z Сдвиговый регистр очищается; параллельные выходы переключаются в высокоимпедансное состояние
˄ X L H H Q6 б.и. 0-ой триггер сдвигового регистра получает значение HIGH; содержимое всех триггеров сдвигового регистра движется дальше; к примеру, предыдущее значение 6-го триггера (внутренний Q6) перемещается на последовательный выход (Q7’’)
X ˄ L H X б.и. Qn Содержимое триггеров сдвигового регистра (внутренние Qn) переходит в регистр памяти и в триггеры последовательного выхода
˄ ˄ L H X Q6 Qn Содержимое сдвигового регистра перемещается дальше; предыдущее содержимое сдвигового регистра перемещается в регистр памяти и триггеры параллельного выхода

Условные обозначения:

H – уровень напряжения HIGH

L – уровень напряжения LOW

˄ – переход от LOW к HIGH

˅ – переход от HIGH к LOW

Z – высокоимпедансное состояние

б.и

– без изменений

X – не важно. Ниже – скетчи, которые можно использовать вместе с этой цепью:

Ниже – скетчи, которые можно использовать вместе с этой цепью:

  • 1.1 – Простая передача битов
  • 1.2 – Один за одним
  • 1.3 – Использование массива

1Описание и назначение сдвигового регистра 74HC595

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

Схема выводов («распиновка») приведена на рисунке слева.

Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16

Назначение выводов микросхемы 74HC595 такое.

Обозначение вывода Назначение
Q0…Q7 выходы параллельных данных;
GND земля (0 В);
Q7′ выход последовательных данных;
MR сброс ведущего устройства (активный низкий);
SHCP вход тактовых импульсов сдвигового регистра;
STCP вход тактовых импульсов «защёлки»;
OE разрешение вывода (активный низкий);
DS вход последовательных данных;
VCC питание +5 В.

Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).

Начинаем с 8 светодиодов

Для первой части урока нам понадобятся следующие комплектующие:

  • Arduino Uno
  • Макетная плата
  • Ардуино сдвиговый регистр 74HC595
  • 8 светодиодов
  • 8 резисторов – 220 ом должно хватить
  • Провода/перемычки

Начните с размещения сдвигового регистра на вашем макете, гарантируя, что каждая сторона находится на отдельной стороне макета, как показано ниже.

С надписью, направленной вверх, штифты 1-8 с левой стороны сверху вниз и 16 — 9 с правой стороны сверху вниз, как показано на рисунке ниже.

Собираем схему

Для начала подключим контакты 16 (VCC) и 10 (SRCLR) к выходу 5v на Arduino и соединяем выводы 8 (GND) и 13 (OE) с выводом Gnd на Arduino. Pin 13 (OE) используется для включения выходов, так как это активный низкий контакт, который мы можем подключить непосредственно к земле.

Затем нам нужно соединить три контакта, которыми мы будем управлять сдвиговым регистром:

  • Pin 11 (SRCLK) сдвигового регистра 74HC595 на пин 11 на Arduino — это будет называться «синхронизирующим пином»,
  • Pin 12 (RCLK) сдвигового регистра на пин 12 на Arduino — это будет обозначаться как «пин защелка»,
  • Pin 14 (SER) сдвигового регистра на пин 13 на Arduino — это будет называться «пином данных»,

Все три этих контакта используются для выполнения сдвига битов, упомянутого ранее в этом руководстве. К счастью, ардуино предоставляет вспомогательную функцию специально для регистров сдвига, называемую shiftOut, которая будет обрабатывать почти все для нас, но мы вернемся к этому при просмотре кода.

Теперь нам просто нужно подключить все выходные выводы к нашим светодиодам, гарантируя, что резистор размещается перед светодиодами, чтобы уменьшить ток и что катоды светодиодов направлены на землю.

Чтобы уменьшить нагромождение проводов до минимума, мы поместили резисторы и светодиоды на отдельный макет, однако, вы можете воспользоваться одной макетной платой.

При размещении светодиодов убедитесь, что они подключены по порядку, так что QA подключен к первому светодиоду, а QH подключен к последнему светодиоду, так как иначе наш код не включит светодиоды в правильном порядке. Когда вы закончите, у вас должно получится что-то вроде этого:

Скетч для ардуино

Теперь мы готовы загрузить код. Подключите свой Arduino к компьютеру и загрузите на него следующий эскиз для 74hc595 Arduino:

Для начала определим в верхней части эскиза следующее:

  • Расположение пинов: синхронизатора, защелки и данных
  • Байт, который будет хранить биты, которые указывают сдвиговому регистру, какой вывод использовать
  • Переменную, которая будет отслеживать, какой светодиод мы должны включить

В методе setup мы просто инициализируем режимы пинов и переменную светодиодов.

В методе loop (цикл) мы очищаем биты в переменной leds в начале каждой итерации, так что все биты устанавливаются в 0, так как мы хотим только включать один светодиод за раз. После этого мы увеличиваем или перезапускаем текущую переменную currentLED, чтобы затем опять включать правильный светодиод.

После этих двух операций мы переходим к более важной части — смещению бит. Сначала мы начинаем с вызова метода bitSet

Мы передаем методу bitSet байт, что хранит биты, и переменную currentLED.

Этот метод позволяет нам установить отдельные биты байта, указав их положение. Например, если мы хотим вручную установить байт в 10010, мы могли бы использовать следующие вызовы, поскольку биты, которые нам нужно установить в 1, являются вторыми справа (это позиция 1, когда мы начинаем в позиции 0) и пятый справа, который находится в положении 4:

Таким образом, каждый раз, когда мы увеличиваем текущую переменную currentLED и передаем ее методу bitSet, мы каждый раз устанавливаем бит слева от предыдущего до 1 и, таким образом сообщаем сдвиговому регистру активировать вывод слева от предыдущего.

После установки бит мы записываем на контакт защелки указание сдвиговому регистру, что собираемся отправить ему данные. Как только мы это сделаем, мы вызываем метод shiftOut, который есть Arduino. Этот метод разработан специально для использования сдвиговых регистров и позволяет просто сдвигать биты за один вызов. Для этого мы передаем данные и синхронизацию в качестве первых двух параметров, затем передаем константу LSBFIRST, которая сообщает методу, что первый бит должен быть наименее значимым, а затем мы проходим через байт, содержащий биты, которые мы действительно хотим перенести в регистр сдвига.

Как только мы закончим смещение битов, мы снова обращаемся на контакт защелки (используя HIGH в этот раз), чтобы указать, что мы отправили все данные. После того, как операция записи будет завершена, загорится соответствующий светодиодный индикатор, а затем задержится на 250 миллисекунд, прежде чем всё повторится.

Выходы 74HC595

  • Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоимпедансное состояние
  • Q7′ – выход предназначенный для последовательного соединения регистров.

Временная диаграмма на которой показано движение логической единицы по всем выходам регистра.

Как говориться лучше один раз увидеть, чем семь раз услышать. Я сам впервые применяя регистр 74HC595 не до конца понимал его работу и чтобы понять смоделировал нужную схему в Proteus.

Вот такая схема подключения семисегментных индикаторов к микроконтроллеру ATMega48 по SPI получилась:

Это схема с динамической индикацией, то есть в каждый момент времени загорается только одна цифра счетверенного семисегментного индикатора, потом загорается следующая и так по кругу. Но так как смена происходит очень быстро, то глазу кажется, что горят все цифры. Кроме того одновременно эта схема и опрашивает 4 кнопки S1-S4. Добавив два сдвоенных диода можно опрашивать 8 кнопок. А добавив 4 транзистора и резистора можно подключить дополнительный 4-х знаковый индикатор. Чтобы динамическая индикация заработала в регистры нужно послать два байта: первый байт определяет, какой из 4-х индикаторов будет работать и какую кнопку будем опрашивать. А второй, какие из сегментов загорятся.

12 thoughts on “ Сдвиговый регистр 74HC595 и семисегментный индикатор ”

По моему — это тот случай, когда объяснение простого может выглядеть сложным, а не наоборот. Что может быть проще, чем два бита переслать? В данном примере, биты, пересылаемые микроконтроллером в последовательном виде — преобразуются регистрами в параллельный. Один подает на матрицу, в роли которой выступает индикатор, данные, другой — адрес. Приведен один из примеров интерфейса периферии, обслуживаемой микроконтроллером. Я бы только добавил, что счетверенный семисегментныйт индикатор, чаще всего, используют в роли часов.

В приведенной схеме динамической индикации светодиоды семисегментного индикатора должны быть на напряжение не более 4 В. В больших индикаторах часто используется последовательное включение нескольких светодиодов: например в индикаторах высотой 5см — 4 светодиода.

Поэтому стоит сделать регистру 74HC595 высоковольтный выход: подключить по MosFET на каждый выход. Затвор на выход микросхемы, исток на землю, а к стоку — «высоковольтную» нагрузку.

А действительно, часто такие схемы обслуживают таблоиды и поболее 5 см. Там может и предложенные MosFET (КМОП, полевики с изолированным затвором) будут рентабельны — цена-то у них, как правило, кусючая. В большинстве-же случаев, достаточно будет DD1, как и DD2 подсоединить к токовым ключам, а не напрямую. Этого не сделано на приведенной схеме, так как на DD2 может падать нагрузка одновременно с семи сегментов, а на DD1 — только с одного. А экономичность схематического решения — далеко не последнее дело, в каждом, конкретном случае.

Datasheet 74HC595 и 74HCT595 от NXP.

Если не нужно каскадирование, регистр хранения и высокоимпедансное состояние на выходах то можно обойтись 74HC164N.

А зачем, если цена фактически одна? Купить сразу несколько сотен 74HC595 по 1,50 за штуку и ставить их везде и всюду, где нужны последовательно-параллельные регистры.

Мне в 74HC595 нравится именно возможность организации статической индикации, с одновременным переключением индикаторов. Так шумов меньше, чем у индикации динамической или у статической индикации без промежуточного (буферного) регистра. К тому же во втором случае имеется паразитная засветка индикатора при частой смене показаний.

А кто и как интересно опрашивает состояние кнопок на такой схеме, регистр же не контроллер он не понимает нажата кнопка или нет, его дело просто подать соответсвующие сигналы навыходных ножках, обратной же связи нет, или я чего-то не понимаю?

Тот микроконтроллер что дает сигнал на включение разрядов индикатора. Например логическим нулем зажигаем разряд который подключен к выводу Q0 микросхемы DD2 , тогда при нажатии кнопки S1 на 9-том контакте X1 разъема появляется логический ноль, этот сигнал и считывает микроконтроллер.

А кто и как будет считывать значения с кнопок?

В этом схеме нет алгоритм для считывание состояние кнопок. Для управление 7сег. индик. лучше включить после 595 микросхему 2003.

Применяйте микросхему TPIC6B595DWR, которая уже содержит полевики с открытым стоком на выходе.

1Описание и назначение сдвигового регистра 74HC595

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

Схема выводов («распиновка») приведена на рисунке слева.

Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16

Назначение выводов микросхемы 74HC595 такое.

Обозначение вывода Назначение
Q0…Q7 выходы параллельных данных;
GND земля (0 В);
Q7′ выход последовательных данных;
MR сброс ведущего устройства (активный низкий);
SHCP вход тактовых импульсов сдвигового регистра;
STCP вход тактовых импульсов «защёлки»;
OE разрешение вывода (активный низкий);
DS вход последовательных данных;
VCC питание +5 В.

Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).

Блог о электронике

Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i 2 с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8.

У него есть 8 выходов и четыре входа. R-сброс, С-тактовый, А1 и А2 вход. На самом деле, внутри они заведены через логический элемент 2И-НЕ и идут на D триггеры. D — это такой тип триггера, который по тактовому импульсу схватывает и отправляет на выход то, что у него на входе. Как видишь, тут они цепью стоят ,передавая бит от одного к другому и нет принципиальной разницы сколько их тут будет, восемь штук или восемь миллиардов. Но чем больше, тем дольше по этой эстафете гнать данные до конца. Поэтому мы смело можем эти регистры соединять последовательно. Получается вот такая схема:

От МК, как видно, требуется только четыре выхода. Одним (RESET) мы сбрасываем состояние регистра. Из второго (Data) побитно вылазит байтик, а тактовый CLC обеспечивает продвижение битов по регистру. Самих регистров тут три. Они сцеплены паровозом. Когда переполняется первый, то биты из него вылазят во второй, потом в третий. Итого, 24 вывода. Катоды диодов подключены все вместе через транзистор и как только будет слово мы подаем сигнал Ready и зажигаем всю эту ботву.

Наполнять регистр просто: 1) Поднимаем и держим RESET в 1 2) Выдаем первый (старший) бит на Data. 3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг. 4) Повторить со второго пункта пока все биты не выдадим.

А для сброса достаточно уронить Reset в ноль на пару микросекунд. Все просто 🙂

З.Ы. Кружок на входе регистра означает, что вход инверсный. Т.е. подал ноль — сработало Треугольник на входе показывает по какому фронту произойдет срабатывание. Запомнить просто: _/ \_ — это, типа, импульс. А треугольник, как стрелочка, указывает на нужный фронт. ->_/ \_ передний (восходящий фронт) и _/ \_ ИнтерфейсЦифра