what comes to my mind is this:
we have 8 tubes each has 12 points to activate which means total of 96 lines. 3 of those chips are enough to drive all pins directly.
we get the time, convert it to seconds, minutes, and hours. then get individual tube number. meaning tube 7 and 8 are for seconds, tube 6 is decimal, tube 4-5 are minutes, tube 3 is decimal point, tubes 1-2 are hours. ---> meaning if we got 45 on the seconds this will mean tube 8 is 5 and tube 7 is 4...etc.
after determining each tube number, we have a function to use switch case to determine the signal output to drive the tube... so out of 12 lines which one is to be activated in order to lighten up digit 5 for example.
we store this value in a 12-bit variable (or array?) and we call it tube8. we do the same for all tubes.
now we get a big 96 bit variable (or array or what) which is like this: tube1_tube2_tube3_....._tube8 by doing something like this:
int total [96];
total = 0;
total = total | ( tube1<<(96-12) ) // gets complete 96 bits value and OR it with tube1 12 bits which shifting tube1 bits to be the most significant 12 bits.
total = total | ( tube2<<(96-24) ) // same as above but now arranges (shifts) tube2 12 bits to be just after tube1 bits...
....// we do this until:
total = total | tube8
after getting all 96 bits ready and sorted out, we need to send them to our 3 32-bit chips, meaning dividing them to 3 packets, each is 32 bit:
out1 = total [0:31]
out2 = total [32:63]
out3 = total [64:95]
// above is how to choose array parts in python, don't know how to do it in c. maybe using >>.
serial_send(out1)
serial_send(out2)
serial_send(out3)
latch_ON //now after all bits are sent, each 32-bit in their own chip's register... we latch all of them at once.
is this the correct approach?