74HC595

Опубликовано: 05.09.2018

Тема сдвиговых регистров довольно часто поднимается, но все не было подходящего повода. Настал момент — пополнить каталог статей.

Пример. Вам понадобилось 8 семисегментных индикаторов. Допустим, на четырех из них выводится время, на четырех выводится некая информация, пусть температура или еще что либо, не важно. Даже если мы будем использовать динамическую индикацию, то понадобится 7 общих ножек для вывода данных и еще 8 для переключения между индикаторами, итого 15 ножек и достаточно загруженный микроконтроллер.

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

Если в кратце описать, то работает эта микросхема так: есть вход DS на который подается сигнал, либо логическая единица, либо логический ноль. Также имеется восемь выходов Q0-Q7. В первый момент времени, данные со входа, окажутся на выходе Q0. В следующий момент времени, данные со входа снова окажутся на выходе Q0. Но предыдущие данные переместятся на выход Q1. В следующий момент времени, данные «сдвинутся» с Q1 на Q2, c Q0 на Q1, со входа на Q0. Поэтому и называется сдвиговый.

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

1. выставить единицу на ножке данных,

2. послать импульс,

3. выставить ноль на ножке данных,

4. послать 7 импульсов

Получается некисло, но скорость не всегда важна. Для всяких светодиодных мигалок, свистелок и перделок этого может быть более чем достаточно.

Но обзор на этом заканчивать рано, так как плюшки еще не окончены. Из необычных есть еще ножка ST_CP, так называемая защелка. Допустим нужно чтобы загорелся светодиод на выходе Q7, но при этом нельзя чтобы логическая единица появилась на выходах Q0-Q6. С защелкой этот вопрос решается легко — пока данные подаются на вход и сдвигаются, на выходах Q0-Q7 состояние не изменяется, но как только придет импульс на ножку ST_CP, данные появятся на выходе.

Еще одной вкусной плюшкой является возможностью каскадного подключения. Вы возможно уже заметили подозрительную ножку Q7′, так вот, если эту ножку у первой микросхемы подключить на вход DS второй микросхемы, то после сдвига данных с ножки Q7 первой микросхемы, окажутся на выходе Q0 второй микросхемы. Таким образом, используя всего 3 ножки микроконтроллера, можно подключать сколько угодно выходов.

Ножка /OE — запрет работы (разрешение — низкий уровень), /MR — сброс (по низкому уровню).

Теперь должно быть понятно, что восемь семисегментников спокойно рулятся всего тремя ножками, вместо 15, в случае статической индикации, и 7 ножек для динамической. В добавок ко всему, очень хорошо с этим справляется интерфейс SPI, где ножка сдвига SH_CP подключается к SCK, данные DS к MOSI и произвольную ножку можно заюзать для защелки.

При отсутствии аппаратного SPI можно заюзать программный.

#define _soft_data PORTA.0 #define _soft_shift PORTA.1 #define _soft_latch PORTA.2 void write ( char a ) { unsigned char i ; for ( i= 0 ; i< 8 ; i++ ) { if ( a & 0x80 ) { _soft_data = 1 ; } else { _soft_data = 0 ; } #asm("nop") //shift _soft_shift = 1 ; #asm("nop") _soft_shift = 0 ; a <<= 1 ; } #asm("nop") //latch _soft_latch = 1 ; #asm("nop") _soft_latch = 0 ; }

Для желающих можно поковырять заготовки

rss