You can use the BlinkWithoutDelay example to toggle a variable between 1 and 0 every 'n' milliseconds without using the delay() function. That can be used to do the blinking, assuming the blinking LED's all blink at the same rate.
You can wire the LED's in any order you like. Let's say the steady Hour lights are 0-11, the blinking ones are 12-23, the steady 1/4 Hour ones are 24-27 and the blinking ones are 28-32. You can figure out which of the four shift registers each bit is in by dividing by 8. The result will be 0-3. The remainder when dividing by 8 (% 8) is the index within the register.
I would keep an array of four bytes to hold the flags representing each light. Start by setting them all to 0 (== LOW).
Then get the current time (Hour and Minute). Divide the Minute by 15 to get QuarterHour. Set the bit for (Hour-1) {assuming hours are 1-12} HIGH and bit for 11+Hour (or 12+Hour-1) to the current blink value (0 or 1). Set the bit for 24+QuarterHour to HIGH and the bit for 27+QuarterHour to the current blink value.
Use shiftOut() to send the four bytes to the four shift registers.
Repeat. ![]()