Prova cosi, per curiosita' (ho fatto copia incolla dal tuo, ho solo cambiato un paio di linee) ... in teoria dovrebbe (se funziona :P) accenderti i 4 led sulle colonne esterne , passandoli di strato in strato (mettici tu dei delay della durata che vuoi per rallentarlo se vuoi controllare)
void cubo()
{
shiftOut(data, clock, MSBFIRST, 0b10010000);
shiftOut(data, clock, MSBFIRST, 0b00001001);
digitalWrite(npn[0], LOW);
digitalWrite(npn[1], LOW);
digitalWrite(npn[2], LOW);
digitalWrite(npn[3], LOW);
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
digitalWrite(npn[0], HIGH);
digitalWrite(canc, LOW);
digitalWrite(canc, HIGH);
shiftOut(data, clock, MSBFIRST, 0b10010000);
shiftOut(data, clock, MSBFIRST, 0b00001001);
digitalWrite(npn[0], LOW);
digitalWrite(npn[1], LOW);
digitalWrite(npn[2], LOW);
digitalWrite(npn[3], LOW);
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
digitalWrite(npn[1], HIGH);
digitalWrite(canc, LOW);
digitalWrite(canc, HIGH);
shiftOut(data, clock, MSBFIRST, 0b10010000);
shiftOut(data, clock, MSBFIRST, 0b00001001);
digitalWrite(npn[0], LOW);
digitalWrite(npn[1], LOW);
digitalWrite(npn[2], LOW);
digitalWrite(npn[3], LOW);
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
digitalWrite(npn[2], HIGH);
digitalWrite(canc, LOW);
digitalWrite(canc, HIGH);
shiftOut(data, clock, MSBFIRST, 0b10010000);
shiftOut(data, clock, MSBFIRST, 0b00001001);
digitalWrite(npn[0], LOW);
digitalWrite(npn[1], LOW);
digitalWrite(npn[2], LOW);
digitalWrite(npn[3], LOW);
digitalWrite(latch, HIGH);
digitalWrite(latch, LOW);
digitalWrite(npn[3], HIGH);
digitalWrite(canc, LOW);
digitalWrite(canc, HIGH);
}
Bada che anch'io sto imparando ora, quindi non mi ritengo responsabile se i miei tentativi causano risultati imprevedibili, fumo e/o fuoco, la zombificazione del vicinato, o il lancio di una testata nucleare dalla nazione vicina come rappresaglia, ok ? XD
EDIT: per trasformare il blocco di 4 righe che scrive tutti 0 sulle uscite, c'e' un modo per mandare lo stesso comando contemporaneamente a tutte e 4 le uscite ? (sul reference non ho trovato nulla a proposito di questo) ... oppure bisogna per forza definire una subroutine esterna e richiamarla ogni volta ? ...