// SI (Serial input), määrää onko seuraava piiriin kirjoitettava bitti 0 vai 1.
const int dataPin = 8; // dataPin = SI / KELTAINEN
// SHCP (Shift register clock pulse), jos clockPin ja dataPin on HIGH/1 niin data siirtyy seuraavaan piiriin
// jos dataPin LOW/0 niin asetetaan ensimmäinen piiri 74HC595 sisällä nollaksi
const int clockPin = 9; // clockPin = SHCP / RUSKEA
// STCP (Storage register clock pulse), HIGH/1 arvolla siirtää bitit piirin lähdöille
// LOW/0 arvolla on valmis vastaanottamaan siirtorekisterissä olevan datan
const int latchPin = 10; // latchPin = STCP / ORANSSI
byte ledStates[2] = { 0, 0 }; // Taulukko jossa ledien HIGH tai LOW arvot tavuina 0-256
// Määrittää outputit
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
}
void loop() {
for (int j = 0; j < 256; j++) {
ledStates[0] = j; // Päivittää arvon j ledState taulukon sarakkeeseen 1
ledStates[1] = 255 - j; // Päivittää arvon 255 miinus j ledState taulukon sarakkeeseen 2
// STCP = LOW, valmis vastaanottamaan siirtorekisterin data
digitalWrite(latchPin, LOW);
// Lähetä ledStates sarakkeeseen 1 tallennettu LED-tila bitteinä ensimmäiseen siirtorekisteriin
shiftOut(dataPin, clockPin, MSBFIRST, ledStates[0]); // MSBFIRST = Most Significant Bit First
// Lähetä ledStates sarakkeeseen 2 tallennettu LED-tila bitteinä, työntäen enimmäisen siirtorekisterin
// bitit seuraavaan siirtorekisteriin Q7S/Serial out pin outin kautta
shiftOut(dataPin, clockPin, MSBFIRST, ledStates[1]);
// Kirjoita siirtorekistereissä olevat bitit säilytysrekistereihin
digitalWrite(latchPin, HIGH);
// Odottaa sekunnin jotta muutos keretään nähdä
delay(1000);
}
}
// Kääntää tavun biteiksi, lähettää ne yksitellen syöttörekisteriin ja kirjoittaa syöttörekisterin siirtorekisteriin
// shiftOut('dataPin arvo', 'clockPin arvo', 'MSBFIRST', 'ledStates tavu')
void shiftOut(int myDataPin, int myClockPin, byte myBitOrder, byte myDataOut) {
int i;
for (i = 0; i < 8; i++) { // Kiertää tavun kaikki 8 bittiä läpi yksitellen
// Ensin AND-operaatio (myDataOut & (1 << (7 - i))) suoritetaan, mikä ottaa myDataOut -taulukon i:nnen
// bitin ja siirtää sen vasemmalle 7-i bittiä. Tämä asettaa bitin oikeaan kohtaan myDataPinissa.
// Bittioperaatiot '&'(AND), '<<'(LEFT SHIFT), '>>' (RIGHT SHIFT)
digitalWrite(myDataPin, (myDataOut & (1 << (7 - i))) >> (7 - i));
// Siirretään bitti siirtorekisteriin
digitalWrite(myClockPin, HIGH);
// Siirrytään tilaan jossa syöttörekisteri on avoinna uusille biteille
digitalWrite(myClockPin, LOW);
}
}