Сдвиговый регистр 74HC595 и Arduino

Если цифровых выходов на плате Arduino не хватает, то можно увеличить их количество микросхемой 74HC595.

Использование сдвигового регистра позволит получить дополнительно 8  выхода, за действуя всего 3 выхода на Arduino. Причем это не предел, добавив еще одну микросхему получим на выходе уже 16 выходов, и так добавлять микросхемы можно до бесконечности, а на Arduino будут заняты всё те же 3 выхода.

Познакомимся со сдвиговым регистром 74HC595 и логикой его работы

как это работает сдвиговый регистр 74HC595

  • Q0…Q7 – выходы для управления, это те самые новые выходы. Могут быть только HIGH или LOW
  • GND – земля
  • Q7′ – выход предназначенный для последовательного соединения регистров.
  • MR – сброс регистра.
  • SH_CP – вход для тактовых импульсов
  • ST_CP – вход «защёлкивающий» данные
  • OE – вход переводящий выходы из HI-Z в рабочее состояние
  • DS – вход данных
  • VCC – питание 5 вольт

 Логика работы с регистром

 Когда на тактовом входе SH_CP появляется логическая единица, бит находящийся на входе данных DS считывается и записывается в сдвиговый регистр. Этот бит записывается в самый младший разряд. При поступлении на тактовый вход следующего импульса высокого уровня, в сдвиговый регистр записывается следующий бит со входа данных. А тот бит который был записан ранее сдвигается на один разряд влево, а его место занимает вновь пришедший бит. Следующий тактовый импульс запишет третий бит, а два предыдущих сдвинутся дальше. Когда все восемь бит заполнились и приходит девятый тактовый импульс то регистр снова начинает заполнятся с младшего разряда и всё повторятся вновь. Что бы данные появились на выходах Q0…Q7 нужно их «защёлкнуть». Для этого необходимо подать логическую единицу на вход ST_CP.
 — MR осуществляет сброс регистра, устанавливая все выходы Q0…Q7 в состояние логического нуля. Для осуществления сброса нужно подать логический ноль на этот вход и подать положительный импульс на входST_CP. Очень полезная функция, так как при подаче питания на микросхему на выходе появляется некое произвольное значение. При работе с регистром на этом выводе должна находится логическая единица.
 — OE (output enable) если подать сюда логическую 1, то выходы будут находится в высокоомном HI-Z состоянии. Когда подаем на этот вход логический 0, выходы будут находится в рабочем состоянии.
 — Q7′ предназначен для последовательного соединения сдвиговых регистров.

Вот как это работает сдвиговый регистр 74HC595:

 

вторую микросхему

Теперь перейдем к подключению к Arduino

Сдвиговый регистр 74HC595 и Arduino

 

Подключаем микросхему с Arduino по рисунку выше. На Q0-Q7 цепляем светодиоды.

На Q0-Q7 цепляем светодиоды

В итоге получаем что-то похожее на это:

74hc595 Arduino

Переходим к самому интересному — загружаем скетч.

int latchPin = 12;
int clockPin = 11;
int dataPin = 13;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
byte c = B10000011; // формируем байт информации из 8 бит для 8 светодиодов
digitalWrite(latchPin, LOW);// открываем защелку для ввода информации
shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации
digitalWrite(latchPin, HIGH);// закрываем защелку
}

Как уже стало понятно из логики работы микросхемы, мы побитово вводим байт информации. Логический ноль «0» работает как LOW, логическая «1» как HIGH и задается это строчкой  byte c = B10000011;

 

HIGH и задается это строчкой byte c

Так на мой взгляд получается наглядно, но можно и задать значение байта от 0 до 255.

void loop()
{
int c = 131;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, c );
digitalWrite(latchPin, HIGH);
}

Еще один пример для наглядности — бегущая строка.

int latchPin = 12;
int clockPin = 11;
int dataPin = 13;
int currentLED = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}

void loop()
{
leds = 0;
if (currentLED == 7)
{
currentLED = 0;
}
else
{
currentLED++;
}

bitSet(leds, currentLED);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
delay(250);
}

Несложными манипуляциями подключаем вторую микросхему.

подключению к Arduino

 

Как видно, выходов стало уже 16, а на ардуине заняты все те же 3. Загружаем скетч такого вида

int latchPin = 12;
int clockPin = 11;
int dataPin = 13;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
byte c = B10000000; // формируем байт информации из 8 бит для 8 светодиодов
byte q = B00000001; // формируем байт информации из 8 бит для 8 светодиодов
digitalWrite(latchPin, LOW);// открываем защелку для ввода информации
shiftOut(dataPin, clockPin, LSBFIRST, q );// побитово закружаем байт информации
shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации
digitalWrite(latchPin, HIGH);// закрываем защелку
}

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

Поделись с друьями:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • MySpace
  • В закладки Google
  • Яндекс.Закладки
  • LinkedIn
  • Reddit

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *