arduino shift in con cd4021

salve a tutti.
sto cercando di realizzare un piccolo progettino il quale deve rilevare lo stato di 8 pulsanti, tramite shift register in ingresso. lo stato dei pulsanti(on /off) viene visualizzato da dei led .

ho provato ad implementare tramite due script eseguiti su arduino mega2560.
primo tentativo.

// prova acquisizione valori di 8 tasti su shifregister

const int data=22;
const int clock=23;
const int latch=24;
int temp=0;
int cont=0;
int attuale=0;
int lettura=0;
const int ledPin[8] = { 40, 41, 42, 43, 44, 45, 46, 47 }; 
byte ledState[8] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};
byte buttonState[8]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};//state of the first 8 buttons
byte buttonRead[8]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};
int i=0;

byte letturaShift(int data,int clock);

void setup() {
  pinMode(data,INPUT);
  pinMode(clock,OUTPUT);
  pinMode(latch,OUTPUT);
   Serial.begin(9600);
  for (cont = 0; cont <= 7; cont++) 
  { 
    pinMode(ledPin[cont], OUTPUT);
  }
 
  for (cont = 0; cont <= 7; cont++) 
  { 
    digitalWrite(ledPin[cont],HIGH );
    delay(20);
    digitalWrite(ledPin[cont],LOW );
  }
}

void loop()
{
  
 
 digitalWrite(latch,HIGH);//gli ingressi paralleli entrano nel latch
 delayMicroseconds(0.2);
 digitalWrite(latch,LOW);// inibisco il latch

for(i=0;i<8;i++)
 {
   buttonRead[i]=letturaShift(data,clock);// leggo lo stato dello switch tramite funzione shift
   // aggiorno lo stato del pulsante
   if(buttonRead[i]!=buttonState[i]) // se la lettura è diversa dall stato attuale
   {                               
     buttonState[i]=!buttonState[i];//commuto lo stato del pulsante
     Serial.print(i);// stampo il numero dello stato che è cambiato
   }
 }
 
 Serial.print("-------------------");
 
  for (i=0; i<8; i++)
 {digitalWrite(ledPin[i],buttonState[i]);}// stampo a led lo stato dei pulsanti
  
  
  
} 
// funzione di shift
byte letturaShift(int data,int clock)
{
 digitalWrite(clock,LOW);// impongo la transizione del clock a basso
 delayMicroseconds(0.2);
 temp=digitalRead(data);// leggo l'out dello shift register
 digitalWrite(clock,HIGH);// transizione alta del clock
 return temp;// ritorno il valore dello stato del led
 }

secondo tentativo

// prova acquisizione valori di 8 tasti su shifregister

const int data=22;
const int clock=23;
const int latch=24;
int cont=0;
int attuale=0;
int lettura=0;
const int ledPin[8] = { 40, 41, 42, 43, 44, 45, 46, 47 }; 
int ledState[8] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};
int buttonState[8]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW};;  //state of the first 8 buttons
int i=0;
void setup() {
  pinMode(data,INPUT);
  pinMode(clock,OUTPUT);
  pinMode(latch,OUTPUT);
   Serial.begin(9600);
  for (cont = 0; cont <= 7; cont++) 
  { 
    pinMode(ledPin[cont], OUTPUT);
  }
  
  for (cont = 0; cont <= 7; cont++) 
  { 
    digitalWrite(ledPin[cont],HIGH );
    delay(20);
    digitalWrite(ledPin[cont],LOW );
  }
}

void loop()
{
  
 delay(50); //delay tra due acquisizioni dati 
 digitalWrite(latch,HIGH);// gli input paralleli entrano nel latch
 delayMicroseconds(20);
 digitalWrite(latch,LOW);// inibisco il latch
 lettura= shiftIn(data,clock,MSBFIRST);// funzione di shiftIn 
 if(attuale!=lettura)// confronto la lettura con il byteattuale(lettura precedente) 
 {attuale=lettura;} // se diverso sostituisco l'attuale con la lettura
  Serial.print(attuale); 

  Serial.print("-------------------");
 
  for (i=0; i<7; i++)
 {
    if(bitRead(attuale,i)==1)//testo lo stato dei vari bit del byte letto
    {buttonState[i]=HIGH; // aggiorno lo stato del tasto
    digitalWrite(ledPin[i],buttonState[i]);}// stampo lo stato sul led
    else
    {buttonState[i]=LOW;// aggiorno lo stato del tasto
    digitalWrite(ledPin[i],buttonState[i]);}// stampo lo stato sul led
  }
  
  
}

problemi riscontrati.
nel primo esempio gli stati vengono stati vengono visualizzati bene e con un ottima reattività, tranne che per un pulsante esattamente l'ottavo che non viene letto, stampando il valore della seriale, il valore non viene acquisito nel byte letto dalla funzione shiftIn. non è un problema di collegamento perchè invertendo l'ordine nella funzione shiftIn da MSBFIRST a LSBFIRST, l'ottavo pulsante funziona ma l'ottavo bit non viene acquisito dalla funzione.

nel secondo tentativo, ho creato io una funzione shifIN, essa funziona nel modo corretto solo che è molto lento il tempo di reazione.

come posso risolvere? a livello implementativo, per il mio scopo i due approcci sono indifferenti, ma in entrambi qualcosa non funziona, sapete dirmi qualcosa??

nota: ho provato ad implementare la funzione shiftIn suggerita negli esempi del sito di arduino cc, ma essa ho le stesse caratteristiche del secondo esempio da me proposto.
mi potete aiutare?