const int CP = 3; /* CP */
const int PL = 4; /* PL */
const int Start = 5; /* start Read */
const int numBit = 6; /* numero data bit */
const int numShift = 9; /* 8+1 shift: idle1-Start0-d0d1d2d3d4-Stop1 */
uint32_t m0;
uint8_t shift_count;
#define BAUD 104
void setup() {
Serial.begin(9600);
pinMode(Start, INPUT_PULLUP);
pinMode(CP, OUTPUT);
pinMode(PL, OUTPUT);
digitalWrite(CP, HIGH);
digitalWrite(PL, HIGH);
shift_count = 0;
load_SR();
}
// Il main può essere esteso inserendo altre attività, purché si abbia l’accortezza di
//richiamare periodicamente la funzione “shifter”
void loop() {
shift_count = shifter(shift_count);
}
void load_SR() {
digitalWrite(PL, HIGH); // Per sicurezza - Flash di cattura
digitalWrite(PL, LOW); // Durata minima impulso (/PL):
digitalWrite(PL, HIGH); // da 20 a 120 nS
}
uint8_t shifter(uint8_t count) {
if (count) {
uint32_t mx = millis();
if ((mx - m0) > BAUD) {
m0 = mx;
digitalWrite(CP, LOW); // Per sicurezza Shift avviene da L --> H
digitalWrite(CP, HIGH); // Durata minima impulso (CP):
digitalWrite(CP, LOW); // da 20 a 120 nS
count--;
}
} else {
if (digitalRead(Start) == 0) { // Carica e trasmetti
m0 = millis();
load_SR();
count = numShift;
}
}
return (count);
}