I've seen loads of different ways to drive 7 segment displays
They are all quite simple and can be written in a way that is completely transparent to the user.
The simplest is just 8 segment pins and four digit pins. The flow looks like this:
turn off all digits;
load segment pins with the segment information;
turn on the desired digit;
All you need to do is to run that routine periodically (for example, insert it into a timer handler).
Your HC595 comes into in two areas:
- You can serially load the 8 segment information.
- You can serially load the digit pin information.
- or the combination of the two.
But the basic execution flow remains the same.