Rejestr przesuwny 74HC595 z Arduino
Shift Register 74HC595 to 8-bitowy chip zawierający 16 pinów, dzięki któremu można zarządzać 8 wyjściami cyfrowymi. Pozwala to rozszerzyć liczbę dostępnych pinów cyfrowych.
Jak działa rejestr przesuwający?
Moduł składa się z rejestru przesuwającego (Shift Register) i rejestru pamięci (storage register).
Każdy z nich posiada osobny zegar wewnętrzny. Kiedy clockPin zmienia stan z Low na High, shift register zczytuje stan z dataPin. Dane zostają przetransferowane do rejestru pamięci. Kiedy latchPin zmienia stan z Low na High, wtedy równoległe sygnały zostają wysłane do wyjść Q0-Q7.
Rejestr 74HC595 podaje prąd na wyjścia, dlatego nazywamy go sourcing current, ale istnieją również rejestry, tzw. sinking current, w przypadku których należy podłączyć odbiorniki na pinach w odwrotny sposób.
74HC595 pinout
SYMBOL | PIN | DESCRIPTION |
Q0 to Q7 | 15, 1 to 7 | parallel data output |
GND | 8 | ground (0 V) |
Q7’ | 9 | serial data output |
MR | 10 | master reset (active LOW) |
SHCP | 11 | shift register clock input |
STCP | 12 | storage register clock input |
OE | 13 | output enable (active LOW) |
DS | 14 | serial data input |
VCC | 16 | positive supply voltage |
shiftOut()
Metoda shiftOut przesuwa byte danych, bit po bicie. Przesuwanie może rozpocząć się od MSB lub LSB.
shiftOut(dataPin, clockPin, bitOrder, value)
dataPin – pin przesyłający dane (int)
clockPin – pin zegara (int)
bitOrder – kierunek przesuwu (MSBFIRST lub LSBFIRST)
value – wartość (byte)
Wyświetlenie 1 bajta za pomocą diod LED i shiftOut
int dataPin = 4;
int latchPin = 5;
int clockPin = 6;
byte databyte = 0b10100101;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(latchPin, LOW);
//shiftOut(dataPin, clockPin, LSBFIRST, databyte);
for (int i = 0; i <= 7; i++) {
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, bitRead(databyte, i));
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
}
Shift Register bez shiftOut
int dataPin = 4;
int latchPin = 5;
int clockPin = 6;
byte databyte = 0b10000101;
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
digitalWrite(latchPin, LOW);
//shiftOut(dataPin, clockPin, LSBFIRST, databyte);
for (int i = 0; i <= 7; i++) {
digitalWrite(clockPin, LOW);
digitalWrite(dataPin, bitRead(databyte, i));
digitalWrite(clockPin, HIGH);
}
digitalWrite(latchPin, HIGH);
}
void loop() {}
Połączenie dwóch rejestrów przesuwnych
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
unsigned int leds1, leds2 = 0;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
leds1 = 0b10101010;
leds2 = 0b00111100;
updateShiftRegisterL(leds1);
updateShiftRegisterL(leds2);
}
void updateShiftRegisterL(byte databyte) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, databyte);
digitalWrite(latchPin, HIGH);
}
void loop() {}
Przeczytaj: Tworzenie własnej biblioteki w Arduino – 74HC595
Przeczytaj: Wyświetlacz 7 segmentowy z Arduino i rejestrem przesuwnym 74HC595