Minimalist Approach to 2 Digit 7 Segment

No need for interrupts - use SPI to write to two shift registers with 2 SPI.transfers.
Cycle thru the 28 combinations to drive 1 segment at a time:
1-a,1-b,1-c,1-d,1-e,1-f,1-6
2-a,2-b,2-c,2-d,2-e,2-f,2-g
3-a,3-b,3-c,3-d,3-e,3-f,3-g
4-a,4-b,4-c,4-d,4-e,4-f,4-g

I could see it as a for:next loop within a for:next loop, pins & value to be displayed pulled from an array.

for (digit = 1 to 4){
  for (segment = 1 to 7){
    digitalWrite (SS, LOW)
    SPI.transfer( digitArray[digit]);
   SPI.transfer(segmentArray[segment]);
digitalWrite (SS, HIGH);
  }  // next segment
}  // next digit

Hmm, digitArray[] can just be {B00000001, B00000010, B00000100, B00001000}
while segmentArray[] would have to reflect the actual number to be displayed, likely stored in another array
= {a[0],a[1], a[2], a[3], a[4], a[5], a[6], b[0], b[1],b[2],b[3],b[4],b[5],b[6],c[0],c[1],c[2],c[3],c[4],c[5],c[6],d[0],d[1],d[3],d[4],d[5],d[6]}

then when you wanted to change the display, you'd all a function (might actually have to breakdown & write one!) to change the indivual segment values:

case digit(0):
a[0] = 0; // a, where 0123456 represents segments abcdefg, low = on
a[1]= 0; // b
a[2] = 0; // c
a[3] = 0; // d
a[4] = 0; // e
a[5] = 0; // f
a[6] = 1; // g
// repeat for 1,2,3,4,5,6,7,8,9
// and somehow pass in digit info too