// Exemple d'utilisation du shioft register 74HC165N avec 16 bouttons pour controler une manette


 // Connection des puces 74HC165 :
// Parrallel Load In
int load = 2;     // SH/LD sur la puce (Shift or load input) 

// Clock 
int clockIn = 3;  // CLk sur la puce (Clock Input)

//Q7 Complementary Output
int dataOut = 4;  // QH sur la puce (Serial Output)

// Miscellaneaous
int D = 1;      // delay
int jButtonDelay = 40; // delay des bouttons du Joystick Virtuel
 
int j;            // cette valeur sert a créer une boucle qui determinera la valeur des bits
int value;        // cette valeur sert à stocker la valeur des bits après leur lecture

byte switchVar = 0; // stocke une array de bit pour afficher la valeur des bits dans le Serial.Monitor



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

pinMode(load,OUTPUT);
pinMode(clockIn,OUTPUT);
pinMode(dataOut,INPUT);
}
//----------------------------------------------------------------------------------------------------------//
void loop() {

// 1 - Récupérations des données par la mémoire à registre
uint16_t dataIn = 0;    // marche aussi avec : byte dataIn =0; => mais pas avec + que 8 bits
digitalWrite(load, 0); // mise en marche des entrées parallèles (plutot que de la sortie en série, c'est un selecteur en gros)
digitalWrite(clockIn,0); // coup d'horloge pour le passage des entrées
digitalWrite(clockIn,1); // blocage de l'horloge (les données sont arrivé dans là mémoire à registre)
digitalWrite(load, 1); // On enclenche les sorties en séries plutot que l'entrée en parallèle 

// 2 - Récupération des données par la carte Arduino (bit par bit)
for(j = 0; j <16; j++){             //2.1 : chaque bit est récupéré par cette boucle (16 bits max)
value = digitalRead(dataOut);
  if (value){                         // 2.2 : lorsqu'un bit est récupéré, on stock ça valeur dans l'ordre
  int A = (1 << j);                   // << veut dire Bitshift left , il sert a garder l'odre dans lequel les bit arrive pour ne pas perdre la pos
  dataIn = dataIn | A;                // |veut dire bitwise OR , il sert a ajouter sans additioner des bits
  }
digitalWrite(clockIn, 0);           // l'horloge refait un On/OFF après chaque bit pour faire passer le suivant    
digitalWrite(clockIn, 1);           // ------------------------------------------------------------------------
}

if(switchVar != dataIn){
  switchVar = dataIn;
  Serial.print("Data In = ");
  Serial.print(dataIn, DEC);
  Serial.print("  /  ");
  Serial.println(dataIn, BIN);
  
}



delay(D);
}
74HC165
74HC165