Подключаем 8-битный сдвиговый регистр SN74HC595 к микроконтроллеру Atmega8. в среде программирования Atmel Studio.

Сегодня мы рассмотрим подключение сдвигового регистра SN74HC595 к микроконтроллеру Atmega 8. Данная микросхема имеет 16 ножек, 8 из которых используются в качестве выходов:

Где:
  Vcc — Питание
  Q0 — Q7  — Параллельные выходы
  DS — Вход для последовательных данных
  OE — Вход для переключения состояния выходов из высокоомного в рабочее состояние
  STCP — защелкивание выходов 
  SHCP — Вход для тактовых импульсов
  MR — Сброс значений регистра
  Q7S — Выход для последовательного соединения регистров
  GND — Земля
Для работы с данным регистром выводы подключим следующим образом:
  Q0-Q7 подключим светодиоды
  VCC, GND — питание +5V
  DS — передача данных  (PD1)
  OE — на GND
  STCP — защелкивание регистра (PD2)
  SHCP — синхронизация (PD0)
  MR  — +5V

Алгоритм работы следующий: 

  1. На STCP подаем логический 0.
  2. Выставляем сигнал (0 или 1) на DS.
  3. На SHCP подаем 1 и через не большую задержку 0, тем самым записываем сигнал внутрь регистра.
  4. Повторяем пункты 2 и 3 пока не передадим все наши данные.
  5. На STCP подаем логический 1, тем самым разрешаем записанным данным из внутреннего регистра перейти на выход.

Программный код (в данном случаи у нас будут по очереди зажигаться светодиоды):

#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>
#define SHCP_on PORTD|=(1<<PD0)
#define SHCP_off PORTD&=~(1<<PD0)
#define DS_on PORTD|=(1<<PD1)
#define DS_off PORTD&=~(1<<PD1)
#define STCP_on PORTD|=(1<<PD2)
#define STCP_off PORTD&=~(1<<PD2)
void zdvig(char z);

int t=0b00000000;
int w=0b00000001;
int i;
int main(void) {
DDRD =0b0000111; //настраиваем D0-D2 на выход
PORTD =0b1111000;// задаем D0-D2 – начальное значение 0
while (1) {
_delay_ms(500);
zdvig(0b00000001);
_delay_ms(500);
zdvig(0b00000010);
_delay_ms(500);
zdvig(0b00000100);
_delay_ms(500);
zdvig(0b00001000);
_delay_ms(500);
zdvig(0b00010000);
_delay_ms(500);
zdvig(0b00100000);
_delay_ms(500);
zdvig(0b01000000);
_delay_ms(500);
zdvig(0b10000000);
}
}

void zdvig(char z) {
STCP_off;
for(i=0;i!=8;i++)
{
t=w&z;// маска для определение значения нулевого бита
if(t==0b00000001){DS_on;_delay_ms(2);SHCP_on;_delay_ms(2);SHCP_off;}
else {DS_off;_delay_ms(2);SHCP_on;_delay_ms(2);SHCP_off;}
z=z>>1;// сдвигаем следующий бит в нулевой бит
}
STCP_on;
}

Теперь мы с Вами немного изменим программный код, что бы можно было подключить два сдвигового регистра SN74HC595. Второй сдвиговый регистр подключаем так же само, к тем же самым ножкам кроме входа DS, который подключаем к выходу Q7S первого сдвигового регистра.

Немного изменим программный код :добавим  в функцию zdvig еще одну переменную, причем z1 — это будет выход с первой микросхемы, а z2 — выход с второй микросхемы. Например:  (0b00001000, 0b100000000);

Программный код:

int main(void)
{
DDRD = 0b00000111;
PORTD = 0b11111000;
while(1)
{
_delay_ms(500);
zdvig(0b00000000,0b00000001);
_delay_ms(500);
zdvig(0b00000000,0b00000010);
_delay_ms(500);
zdvig(0b00000000,0b00000100);
_delay_ms(500);
zdvig(0b00000000,0b00001000);
_delay_ms(500);
zdvig(0b00000000,0b00010000);
_delay_ms(500);
zdvig(0b00000000,0b00100000);
_delay_ms(500);
zdvig(0b00000000,0b01000000);
_delay_ms(500);
zdvig(0b00000000,0b10000000);
_delay_ms(500);
zdvig(0b00000001,0b00000000);
_delay_ms(500);
zdvig(0b00000010,0b00000000);
_delay_ms(500);
zdvig(0b00000100,0b00000000);
_delay_ms(500);
zdvig(0b00001000,0b00000000);
_delay_ms(500);
zdvig(0b00010000,0b00000000);
_delay_ms(500);
zdvig(0b00100000,0b00000000);
_delay_ms(500);
zdvig(0b01000000,0b00000000);
_delay_ms(500);
zdvig(0b10000000,0b00000000);
}
}

void zdvig (char z1, char z2){
STCP_off;
for (i=0; i!=8;i++) {//b01110110
t=w&z1;
if (t==0b00000001){DS_on;_delay_ms(2); SHCP_on; _delay_ms(2);SHCP_off; }
else{DS_off;_delay_ms(2); SHCP_on; _delay_ms(2);SHCP_off;}
z1=z1>>1;
}
for (i=0; i!=8;i++) {//b01110110
t=w&z2;
if (t==0b00000001){DS_on;_delay_ms(2); SHCP_on; _delay_ms(2);SHCP_off; }
else{DS_off;_delay_ms(2); SHCP_on; _delay_ms(2);SHCP_off;}
z2=z2>>1;
}
STCP_on;

}