Сегодня мы рассмотрим подключение сдвигового регистра SN74HC595 к микроконтроллеру Atmega 8. Данная микросхема имеет 16 ножек, 8 из которых используются в качестве выходов:
Алгоритм работы следующий:
Программный код (в данном случаи у нас будут по очереди зажигаться светодиоды):
#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;
}