74HC595, seri giriş 8 bit paralel çıkışlı Shift Register (Kaydırmalı Kaydedici) entegresidir. Kullanımına geçmeden önce 74HC595 hakkında biraz bilgi verelim
Besleme gerilimi 2 V ile 6V arası olduğu için hem 3.3V hem de 5V ile çalışan devreler için kullanışlıdır. Birden fazla entegre kaskat bağlanarak çıkış sayısı artırılabilir.
74HC595 pin bağlantıları
- Vcc pozitif besleme ucudur. (min 2V, max 7V)
- GND besleme şase (negatif) ucudur.
- QA – QH paralel çıkış uçlarıdır.
- RESET sıfırlama ucudur. (Lojik 0 seviyesinde sıfırlama aktif olur.)
- A seri data girişidir.
- OUTPUT ENABLE çıkış uçlarını etkinleştirir.
- LATCH CLOCK kilitleme pinidir.
- SHIFT CLOCK kaydırma pinidir.
- SQH seri data çıkış ucudur (Kaskat bağlantılar için)
Arduino ile kullanım
Arduino Uno gibi sınırlı sayıda I/O pinleri olan kartları shift register kullanarak genişletmek mümkündür.

Yukarıdaki şemada görüldüğü gibi 8 ledi kontrol etmek için Arduino Uno’nun 3 pini yeterlidir. 74HC595 entegresine seri data gönderimi, Arduino kütüphanesinde önceden tanımlı olan shiftOut fonksiyonu ile gerçekleşir. shiftOut fonksiyonu için dört parametre gereklidir.
shiftOut(dataPin, clockPin, bitOrder, value);
dataPin seri veri gönderimi yapılacak pini tanımlar.
clockPin saat palsi gönderilecek pin burada tanımlanır.
bitOrder başlangıç biti burada tanımlanır.
İki parametreden biri kullanılabilir. MSBFIRST seri veri gönderimi için (Most Significant Bit First) en büyük dereceli bitten başlanacağını belirtir. Binary verinin en solundaki bitten sağa doğru gönderme yapılır. LSBFIRST ise seri veri gönderimi için (Least Significant Bit First) en küçük dereceli bitten başlanacağını belirtir. Yani binary verinin en sağındaki bitten sola doğru gönderme yapılır.
value seri gönderilecek veri burada tanımlanır.
Şimdi 74HC595 entegresinin çıkış uçlarına bağladığımız 8 ledi sırayla yakacak program yazalım.
int latchPin = 5; // Arduino Uno 5 nolu digital pin latchPin olarak etiketlendi.
int clockPin = 6; // Arduino Uno 6 nolu digital pin clockPin olarak etiketlendi.
int dataPin = 4; // Arduino Uno 4 nolu digital pin dataPin olarak etiketlendi.
int sayac = 0; // sayac adlı değişken tanımlandı ve değişkene sıfır değeri atandı.
byte dataArray595[] = { // dataArray595 adında veri dizisi tanımlandı.
B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000 //dataArray595 veri dizisine 8 adet binary veri girildi.
};
void setup() {
pinMode(latchPin, OUTPUT); //latchPin çıkış olarak atandı.
pinMode(dataPin, OUTPUT); //dataPin çıkış olarak atandı.
pinMode(clockPin, OUTPUT); //clockPin çıkış olarak atandı.
}
void loop() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST,dataArray595[sayac]); // Veri 74hc595 entegresine gönderiliyor.
digitalWrite(latchPin, HIGH);
delay(1000); // 1 sn bekle
sayac++; // sayacı 1 artır.
if (sayac == 7) { // sayac değeri 7 olursa sayacı sıfırla
sayac = 0;
}
}
Yukarıdaki kodda arduino kartın çıkış pinlerine değişken atadıktan sonra sayac adlı bir değişken daha oluşturup değerini 0 olarak atadık. dataArray595 adında oluşturduğumuz veri dizisine 8 adet binary sayı tanımladık. Bu veri dizisindeki her sayı 8 bitten oluşmakta ve bu sayının her biti 74HC595 entegresinin bir çıkış ucunu temsil etmektedir.
Programın çalışma mantığına gelecek olursak;
İlk başta sayac değişkeninin değeri 0 olduğundan dolayı dataArray[sayac] değişkenine aktarılan değer dataArray[0] = 00000001 dir. shiftOut ile veri gönderildiğinde 74HC595 entegresinin Q0 çıkış ucu 1, diğer uçları 0 olur.
sayac++ ; sayaç değişkeninin yukarı artmasını sağlar. Yani 0 olan sayaç değişkeni 1 değerini alır.
İkinci döngüde dataArray[sayac] değişkenine aktarılan değer dataArray[1] = 00000010 dir. shiftOut ile veri gönderildiğinde 74HC595 entegresinin Q1 çıkış ucu 1, diğer uçları 0 olur.
Sekizinci döngüde dataArray[7] = 10000000 olacaktır. Bu durumda 74HC595 entegresinin Q7 çıkış ucu 1 diğer uçları 0 olur. sayac değişkeni 7 olduğundan dolayı sayac değişkenine 0 atamak için gerekli koşul yerine gelmiş olur ve döngü tekrar başa döner.
74HC595 entegresi kaskat kullanımı

İki veya daha fazla 74HC595 entegresini kaskat (ard arda) bağlamak için entegrenin 9. pini olan SQH (seri data out) ucundan yararlanılır. Kaskat bağlantıda bu pin bir sonraki 74HC595 entegresinin DS ucuna bağlanır. Tüm SH_CP ucları kendi arasında paralel, tüm ST_CP uçları da kendi arasında paralel bağlanır.
Şimdi örnek kodumuza geçelim.
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
byte son595veri = 0;
byte ilk595veri = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
son595veri = B10000000; // Son 74HC595 verisi
ilk595veri = B00000001; // İlk 74HC595 verisi
registerYaz(); // RegisterYaz fonksiyonunu çalıştır.
delay(500); // 500ms bekle
son595veri = B01000000; // Son 74HC595 verisi
ilk595veri = B00000010; // İlk 74HC595 verisi
registerYaz(); // RegisterYaz fonksiyonunu çalıştır.
delay(500); // 500ms bekle
son595veri = B00100000; // Son 74HC595 verisi
ilk595veri = B00000100; // İlk 74HC595 verisi
registerYaz(); // RegisterYaz fonksiyonunu çalıştır.
delay(500); // 500ms bekle
son595veri = B00010000; // Son 74HC595 verisi
ilk595veri = B00001000; // İlk 74HC595 verisi
registerYaz(); // RegisterYaz fonksiyonunu çalıştır.
delay(500); // 500ms bekle
}
void registerYaz()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, son595veri); // Son 74HC595 entegre için veri gönder.
shiftOut(dataPin, clockPin, LSBFIRST, ilk595veri); // İlk 74HC595 entegre için veri gönder.
digitalWrite(latchPin, HIGH);
}
İki 74HC595 entegre ile yapılan kaskat bağlantıda tüm entegre çıkışlarını kontrol edebilmek için shiftOut fonksiyonu ile iki defa veri göndermek gereklidir. İlk gönderilen 8 bitlik veri ikinci entegrenin çıkışlarını kontrol ederken son gönderilen 8 bitlik veri ise ilk entegrenin çıkışlarını kontrol eder. Böylece toplam 16 çıkışa karşılık 16 bitlik veri gönderilmiş olur.
registerYaz() komutuyla çağrılan registerYaz fonksiyonu; son595veri ve ilk595veri değişkenindeki toplam 16 bitlik veriyi entegre çıkışlarına iletir.
İkiden fazla 74HC595 kaskat bağlanacaksa aynı şekilde entegrenin 9. pini bir sonraki entegrenin SQH (seri data out) ucuna bağlanarak devam edilir. Tüm çıkışları kontrol edebilmek için ise entegre sayısı kadar shiftOut fonksiyonu kullanmak yine entegre sayısı kadar 8 bitlik veri göndermek yeterlidir.
Şimdilik bu kadar..