"I don't even recognize the array that you have used here;

byte dataArray[]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; "

Okay, so rewrite it like the cube display then:

B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000

Same data, different number format. Lot easer to follow than:

Decimal, 1,2,4,6,16,32,64,128 - who can tell where those bits are going to end up? Hex (0x01) and Binary (B00000001) are a lot easier to visualize.

In this case, each group represents 1 column of data, and you have 8 columns representing the matrix.

B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000

column 0, column 1, column 2, column 3, column 4, column 5, column 6, column 7

As wired to the shift registers & matrix:

cccccccc

76543210

10000000

01000000

00100000

00010000

00001000

00000100

00000010

00000001

So now you have this 8x8 set of data and it up to you to decide how you will fill that set up and when you will change/update it. Content, that's always the killer

We already have blink-without-delay going to determine when the display is refreshed.

Add a second one at different time interval, and shift the data in the array:

7 goes into a temporary copy, 6 goes into 7, 5 goes into 6, 4 into 5, 3 into 4, 2 into 3, 1 into 2, 0 into 1, and the temporary copy goes into 0. Now the display becomes:

1st shift 2nd shift 3rd shift

01000000 00100000 00010000

00100000 00010000 00001000

00010000 00001000 00000100

00001000 00000100 00000010

00000100 00000010 00000001

00000010 00000001 10000000

00000001 10000000 01000000

10000000 01000000 00100000

You see how the data moves right and then wraps around?

So that's one thing you can do, and then build other features from there.