Cosa sono gli shift register?

Parliamo di registri, cioè di un insieme di flip flop che permettono la memorizzazione e la gestione di un insieme di bit. I registri a scorrimento (shift register) hanno diverse applicazioni tra cui la conversione di formato da seriale a parallelo e viceversa. Utilizziamo un Arduino UNO ed un analizzatore di stati logici per approfondire il funzionamento di due shift register integrati: 74HC595 e 74HC597.

👉 Datasheet 74HC595

👉 Datasheet 74HC597

👉 Analizzatore di stati logici: https://s.click.aliexpress.com/e/_oDpLjqr

👉 Arduino UNO: https://amzn.to/4hBYy1K

Sketch Arduino per 74HC595

#define SRCLR 13
#define SRCLK 12
#define RCLK 11
#define SER 10

void serial_clock() {
  digitalWrite(SRCLK, HIGH);
  delayMicroseconds(5);
  digitalWrite(SRCLK, LOW);
  delayMicroseconds(5);
}

void parallel_clock() {
  digitalWrite(RCLK, HIGH);
  delayMicroseconds(5);
  digitalWrite(RCLK, LOW);
  delayMicroseconds(5);
}

void serial_trasmission(byte b) {
  // 0x75    0111 0101      b & 0x01    

  // 0000 0001    0000 0010  0000 0100    1000 0000
  for (int i=7; i>=0; --i) {
    bool data = b & 1<<i;
    digitalWrite(SER, data);
    serial_clock();
    Serial.print(data);
  }
  Serial.println();


}

void setup() {
  Serial.begin(9600);

  pinMode(SRCLR, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(RCLK, OUTPUT);
  pinMode(SER, OUTPUT);

  digitalWrite(SRCLR, LOW);
  digitalWrite(SRCLK, LOW);
  digitalWrite(RCLK, LOW);
  digitalWrite(SER, LOW);

  delay(1);

  digitalWrite(SRCLR, HIGH);

  delay(1);

  parallel_clock();

  delay(1);

  serial_trasmission(0x4D);   // 0100 1101
  parallel_clock();

}

void loop() {
  // put your main code here, to run repeatedly:

}

Sketch Arduino per 74HC595

#define IN_D0 2
#define IN_D1 3
#define IN_D2 4
#define IN_D3 5
#define IN_D4 6
#define IN_D5 7
#define IN_D6 8
#define IN_D7 9

#define MR 13
#define SH_CP 12
#define ST_CP 11
#define PL 10

void parallel_out(byte b) {
  digitalWrite(IN_D0, bitRead(b, 0));
  digitalWrite(IN_D1, bitRead(b, 1));
  digitalWrite(IN_D2, bitRead(b, 2));
  digitalWrite(IN_D3, bitRead(b, 3));
  digitalWrite(IN_D4, bitRead(b, 4));
  digitalWrite(IN_D5, bitRead(b, 5));
  digitalWrite(IN_D6, bitRead(b, 6));
  digitalWrite(IN_D7, bitRead(b, 7));

  delayMicroseconds(5);
}

void parallel_clock() {
  digitalWrite(ST_CP, HIGH);
  delayMicroseconds(5);
  digitalWrite(ST_CP, LOW);
  delayMicroseconds(5);
}

void serial_clock() {
  digitalWrite(SH_CP, HIGH);
  delayMicroseconds(5);
  digitalWrite(SH_CP, LOW);
  delayMicroseconds(5);
}

void setup() {
  pinMode(IN_D0, OUTPUT);
  pinMode(IN_D1, OUTPUT);
  pinMode(IN_D2, OUTPUT);
  pinMode(IN_D3, OUTPUT);
  pinMode(IN_D4, OUTPUT);
  pinMode(IN_D5, OUTPUT);
  pinMode(IN_D6, OUTPUT);
  pinMode(IN_D7, OUTPUT);

  pinMode(MR, OUTPUT);
  pinMode(PL, OUTPUT);
  pinMode(ST_CP, OUTPUT);
  pinMode(SH_CP, OUTPUT);
  
  digitalWrite(MR, LOW);
  digitalWrite(PL, HIGH);
  digitalWrite(ST_CP, LOW);
  digitalWrite(SH_CP, LOW);

  delay(1);

  digitalWrite(MR, HIGH);

  delay(1);

  parallel_out(0x6c);   // 0110 1100
  parallel_clock();

  // Caricamento dati dai flip flop di ingresso allo shift register
  digitalWrite(PL, LOW);
  delayMicroseconds(5);
  digitalWrite(PL, HIGH);

  // Shift
  for(int i=0; i<8; ++i) {
    serial_clock();
  }


}

void loop() {
  // put your main code here, to run repeatedly:

}
Avatar Paolo Godino