30 pin 4 digit display

It seems to me to be a bit convoluted. Why clear the registers each time? Just have a pattern per digit, and send that pattern out. I suggest you want an array per digit, (off/on/off/off/on etc.) and for a particular digit just output the array contents.