Знакомство с микросхемой регистра сдвига 74HC595 - управление 16 светодиодами

74HC595

Из этого руководства вы узнаете, как управлять 16 светодиодами используя всего 3 линии управления. Мы осуществим это путем последовательной передачи данных в сдвиговые регистры 74HC595.

Знакомство с микросхемой регистра сдвига 74HC595

Микросхема 74HC595 содержит 8 битный регистр хранения и 8 битный сдвиговый регистр. Данные последовательно передаются в сдвиговый регистр, затем фиксируются в регистре хранения. К регистру хранения подключены 8 выходных линий. На картинке ниже показано расположение выводов микросхемы 74HC595.

74HC595

Вывод 14 (DS) это вывод данных. В некоторых описаниях он обозначается как «SER».

Когда уровень на выводе 11 (SH_CP, иногда обозначается как SRCLK) переходит из низкого в высокий, значение на выводе DS сохраняется в сдвиговом регистре, при этом данные сдвигаются на один разряд, чтобы предоставить место для нового бита.

Пока на выводе 12 (ST_CP, иногда обозначается как RCLK) низкий уровень, данные записываются в регистр сдвига. Когда уровень переходит в высокий, данные из сдвигового регистра фиксируются в регистре хранения, из которого поступают на выводы Q0…Q7.

На представленной ниже временная диаграмме, показано, каким образом можно установить на выходах Q0…Q7 микросхемы значение 11000011, учитывая что изначально там было значение 00000000.

Знакомство с микросхемой регистра сдвига 74HC595

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

Знакомство с микросхемой регистра сдвига 74HC595
Кликните для увеличения

Мы используем перфорированную макетную плату с контроллером Atmega8, которую использовали во многих наших проектах. Добавим еще 2 пустых макетных платы и подведем к ним питание.

Установим микросхему регистра сдвига и подключим к ней питание +5 В и общий провод.

Теперь проведем 3 линии управления между микроконтроллером и регистром сдвига, для чего подсоединим:

  • PC0 к DS
  • PC1 к ST_CP
  • PC2 к SH_CP

Этими линиями являются 3 синих провода на картинке ниже.

Затем подключим светодиоды и резисторы. Я использовал резисторы сопротивлением 510 Ом, но допустимы и другие номиналы.

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

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

Мы используем вывод Q7, чтобы соединить регистры сдвига в одну цепочку.

Модифицированная схема показана ниже.

Знакомство с микросхемой регистра сдвига 74HC595
Кликните для увеличения

Знакомство с микросхемой регистра сдвига 74HC595

Код для реализации скачущего огонька на 16 светодиодах.

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

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

protostack.com

Перевод: [IMG]/i/Image/wand.gif[/IMG] по заказу РадиоЛоцман

На английском языке: Introduction to 74HC595 shift register - Controlling 16 LEDs

Цена 74HC59574HC595 на РадиоЛоцман.Цены — от 1,98 до 20,67 руб.
8 предложений от 7 поставщиков
Исполнение: SO16-150. Логика стандартная: Тип корпуса : SO16-150 Логическая ИС 74HC595D.118. Описание в формате PDF
ПоставщикПроизводительНаименованиеЦена
AliExpressНовый 74HC595 74HC595D SN74HC595D 8 лапками углублением SOP-16 в наличии1,98 руб.
РИВ Электроникс74HC595D.1183,10 руб.
ТриомNexperia74HC595D,1188,67 руб.
ДессиNXPЛогическая ИС 74HC595D.11820,67 руб.
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • В програмке на 8 светодиодах есть ошибки... Исправьте, плиз...
  • А вы знаете какие именно ошибки в программе. Или пробовали компилировать и получили ошибки при компиляции? Как таковых ошибок в программе нет, но есть один нюанс, который был задуман автором, с целью использовать данный пример на разных контроллерах. Всего навсего... Так же один момент - не указана тактовая частота в программе, но я не считаю что это ошибка, а даже наоборот, с этим параметром можно "поиграться" и увидеть результаты и изменения. Единственное, в тексте описания не говорится о том, что мега настроена на работу от внутреннего осциллятора. У меня скомпилировать получилось, все без ошибок (AVRStudio).
  • Я компелировал в CodeVisionAVR. Ошибки в delay_ms это мелочи, компилятор не понимает _BV() и bit_is_set. Схему тестирую в протеусе. А как в АВРстудио писать на С++, там же вроде ассемблер...
  • AVRStudio + компилятор WinAVR и пишем на Си в студии.
  • Поставил WinAVR, не понимает delay.h Какая библиотека в аврстудио для паузы?
  • Используем: include и include
  • ../new.c:2:26: util/delay.h: No such file or directory :confused: текст программы в АВРСтудио 4: #include #include #define DS_PORT PORTC #define DS_PIN 0 #define ST_CP_PORT PORTC #define ST_CP_PIN 1 #define SH_CP_PORT PORTC #define SH_CP_PIN 2 #define DS_low() DS_PORT&=~_BV(DS_PIN) #define DS_high() DS_PORT|=_BV(DS_PIN) #define ST_CP_low() ST_CP_PORT&=~_BV(ST_CP_PIN) #define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN) #define SH_CP_low() SH_CP_PORT&=~_BV(SH_CP_PIN) #define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN) //Define functions //====================== int i; void ioinit(void); void output_led_state(unsigned char __led_state); //====================== void ioinit (void) { DDRC = 0b00000111; //1 = output, 0 = input PORTC = 0b00000000; } void output_led_state(unsigned char __led_state) { SH_CP_low(); ST_CP_low(); for (i=0;i<8;i++) { if (bit_is_set(__led_state, i)) DS_high(); else DS_low(); SH_CP_high(); SH_CP_low(); } ST_CP_high(); } int main (void) { ioinit(); //Setup IO pins and defaults while(1) { for (i=7; i>0; i--) { output_led_state(_BV(i)); _delay_ms(100); } for (i=0; i<8; i++) { output_led_state(_BV(i)); _delay_ms(100); } } } Запускаю в протеусе. Один огонек горит =(((
  • Разобрался с регистром или проблемы остались (а то был занят, поэтому не отвечал). Если чего, выложи проект в протеусе, гляну.
Полный вариант обсуждения »