/* --------------------------------------------------------------------------- sn74hc595.cpp Einfache Source zur Datenausgabe ueber ein serielles Schieberegister SN74HC595 03.05.2026 R. Seelig --------------------------------------------------------------------------- */ #include "sn74hc595.h" /* ---------------------------------------------------------- Konstruktor ---------------------------------------------------------- */ shiftreg595::shiftreg595(uint8_t srclk, uint8_t srdat, uint8_t srstb) { clk = srclk; dat = srdat; stb = srstb; } /* ---------------------------------------------------------- begin initialisiert die GPIO-Pins, an die das Schiebe- register angeschlossen ist, als Ausgang ---------------------------------------------------------- */ void shiftreg595::begin() { pinMode(dat, OUTPUT); pinMode(clk, OUTPUT); pinMode(stb, OUTPUT); setvalue(0, 1); } /* ---------------------------------------------------------- setvalue schiebt ein einzelnes Byte (8-Bit) in das Schiebe- register mittels Bitbanging. Uebergabe: value : zu sendender Wert setlatch : 1 => ein Strobeimpuls wird nach dem Senden von Value ausgegeben und somit wird der Wert in Value an den Pins des Schieberegisters angelegt. 0 => es wird kein Strobeimpuls gegeben und somit liegt Value nur im Schiebe- register aber nicht im Ausgangslatch. Hierdurch ist es moeglich, mehrere Schieberegister zu kaskadieren ---------------------------------------------------------- */ void shiftreg595::setvalue(uint8_t value, uint8_t setlatch) { int8_t i; for (i = 7; i > -1; i--) { if ((value >> i) & 1) { digitalWrite(dat, HIGH); } else { digitalWrite(dat, LOW); } digitalWrite(clk, HIGH); digitalWrite(clk, LOW); // Taktimpuls } if (setlatch) { // Strobeimpuls : Daten Schieberegister ins Ausgangslatch uebernehmen digitalWrite(stb, HIGH); digitalWrite(stb, LOW); } bufvalue = value; } /* ---------------------------------------------------------- setsinglebit setzt ein einzelnes Bit in der Buffervariable bufvalue und sendet dieses anschliesend an das Schieberegister ---------------------------------------------------------- */ void shiftreg595::setsinglebit(char nr) { bufvalue |= ((uint32_t)1 << nr); setvalue(bufvalue, 1); } /* ---------------------------------------------------------- clrsinglebit loescht ein einzelnes Bit in der Buffervariable bufvalue und sendet dieses anschliesend an das Schieberegister ---------------------------------------------------------- */ void shiftreg595::clrsinglebit(char nr) { bufvalue &= ~((uint32_t)1 << nr); setvalue(bufvalue, 1); }