Un 74HC595 est un shift register registre à décalage 8 bit c'est à dire 1 octet.
Ses sorties sont repérées :
QA à QH dans la doc "ST" et "ON" (ex Motorola)
Q0 à Q7 dans la doc "NXP" (ex Philips)
Dans l'univers Arduino il existe une fonction toute prête et simple d'emploi "shiftout() qui gére l'écriture dans un registre à décalage.
Il faut fournir la pin qui sera raccordée à la broche "Horloge" du registre, la pin qui sera raccordé à la broche Donnée (ou Data) et celle qui sera reliée au verrou (ou Latch), l'octet à transmettre et le sens dans lequel on veut le transmettre.
Sous l'effet d'un front d'horloge le premier bit entre dans le registre à décalage d'abord en QA (ou Q0).
Au front suivant la valeur qui était en QA passe en QB et une nouvelle valeur passe en QA et ainsi de suite.
Si on relie la sortie QH (ou Q7) a l'entrée d'un autre registre à décalage on peut obtenir obtenir 2x8 bits et ainsi de suite il n'y a pas de limite.
Le verrou (Latch) sert à éliminer les états intermédiaires. Quand on envoi un octet le bit destiné à Q7 passe successivement par Q0,Q1,Q2,Q3,Q4,Q5,Q6 et enfin Q7.
Un registre à décallage avec latch possède un registre tampon et un registre "de sortie". Les bits défilent dans le tampon et sont transféré en 1 seule fois dans le registre de sortie, comme celà il n'y a qu'une mise à jour quelque soit le nombre de bit transmis.
Ca c'est pour le fonctionnement du registre.
Pour ton histoire de tableau il faut voir les choses simplement il n'y a aucun mystère ni programmation réservée aux génies ou gourous.
Prenons l'exemple d'un afficheur 7 segments il faut un registre à décalage par module afficheur et chaque segment est relié à une sortie du registre.
Il suffit de faire un tableau sur le papier et d'écrire pour chaque chiffre de 0 à 9 quels segments doivent être allumés.
Disons par exemple que le câblage est réalisé ainsi :
Q0 est relié au segment a , Q4 est relié au segment e
Q1 est relié au segment b , Q5 est relié au segment f
Q2 est relié au segment c , Q6 est relié au segment g
Q3 est relié au segment d , Q7 est relié au segment h
En programmation il faut déclarer un tableau d'entiers de taille 10.
uint8_t chiffres[9] ;
et si par exemple pour écrire un 3 il faut allumer les segments a,c,d,e,g,h (ce n'est qu'un exemple je n'ai pas vérifier avec la spec d'un afficheur réel)
il suffira d'écrire chiffres[3] = 0b10111011 ;
J'ai utilisé la notation binaire parce que visuellement je la trouve mieux adaptée pour dialoguer avec le registre à décalage mais la valeur d'un nombre ne change pas qu'il soit exprimé en décimal, en binaire, en octal ou en hexadécimal.
J'ai utilisé aussi les typages forts pour les entiers car eux seuls permettent de bien maîtriser la taille ocupée en mémoire : un type int occupe généralement 2 entiers avec le compilateur avr-gcc.
Tu vois que ce n'est vraiment pas compliqué et la fonction shiftout() arduino est aussi très simple.
Je dirais même que c'est plus simple à faire soit-même que de passer du temps à trouver un bout de programme tout fait qui ne fera jamais exactement ce que tu veux et qu'en plus il te faudra déchiffrer parce que son auteur n'aura pas écrit de documentation.