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:
}