multiple-shift-registers

danya/74hc595n/multiple-shift-registers

Multiple shift registers 74hc595 can be controlled with this patch.
multiple-shift-registers
@/multiple-shift-registers
Multiple shift registers 74hc595 can be controlled with this patch.
UPDpulse
Triggers new read
DATAport
data input(SER, DS)
LATCHport
latch input(RCLK, ST_CP)
CLOCKport
clock input(SRCLK, SH_CP)
CHOICEnumber
select the shift register you want to control
TOTALnumber
the number of shift registers you are using.
1 portboolean
port QA (Q0)
2 portboolean
port QB (Q1)
3 portboolean
port QC (Q2)
4 portboolean
port QD (Q3)
5 portboolean
port QE (Q4)
6 portboolean
port QF (Q5)
7 portboolean
port QG (Q6)
8 portboolean
port QH (Q7)
multiple-shift-registers
UPD
DATA
LATCH
CLOCK
CHOICE
TOTAL
1 port
2 port
3 port
4 port
5 port
6 port
7 port
8 port
DONE
DONEpulse
Fires on a successful write
To use the node in your project you should have the danya/74hc595n library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

#pragma XOD evaluate_on_pin enable input_UPD
#pragma XOD error_raise enable
struct State {
    
};

{{ GENERATED_CODE }}

void evaluate(Context ctx) {
    if (!isInputDirty<input_UPD>(ctx))
        return;

    const uint8_t lch = getValue<input_LATCH>(ctx);
    const uint8_t cl = getValue<input_CLOCK>(ctx);
    const uint8_t dt = getValue<input_DATA>(ctx);
  
    int cho = getValue<input_CHOICE>(ctx);
    ::pinMode(lch, OUTPUT);
    ::pinMode(cl, OUTPUT);
    ::pinMode(dt, OUTPUT);
   
    int allnumb = getValue<input_TOTAL>(ctx);
  
     bool mass[8000];

    mass[0+(8*(cho-1))] = getValue<input_1_port>(ctx);
    mass[1+(8*(cho-1))] = getValue<input_2_port>(ctx);
    mass[2+(8*(cho-1))] = getValue<input_3_port>(ctx);
    mass[3+(8*(cho-1))] = getValue<input_4_port>(ctx);
    mass[4+(8*(cho-1))] = getValue<input_5_port>(ctx);
    mass[5+(8*(cho-1))] = getValue<input_6_port>(ctx);
    mass[6+(8*(cho-1))] = getValue<input_7_port>(ctx);
    mass[7+(8*(cho-1))] = getValue<input_8_port>(ctx);
    

   ::digitalWrite(lch, 0);
      while(allnumb > 0){
    ::digitalWrite(dt, mass[7+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[6+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[5+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[4+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[3+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[2+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[1+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
    ::digitalWrite(dt, mass[0+(8*(allnumb-1))]);
     ::digitalWrite(cl, 1);
     ::digitalWrite(cl, 0);
               allnumb = (allnumb-1);
      }
     ::digitalWrite(lch, 1);
    emitValue<output_DONE>(ctx, 1);
}