Interrupts and timing applications
Instead of using a main loop delay to compute the time, which gets disrupted by the hardware counter, use the hardware counter itself to provide the timing.

Set the timer0 to interrupt (say) every 1mS. This becomes your system's tick, or heartbeat. Use the interrupt routine to increment the mS counter, and to refresh the displays.

In the main loop, use the mS counter as your 'wall clock', wait until it has advanced 300,000 ticks, and you have waited 5 minutes within a non-cumulative accuracy of 1mS.

This answer is intentionally incomplete, there are some more technical details that may be necessary depending on the length of your time check routine, but it would overload the answer to present a treatise now. Once you start getting into the details, you'll find that getting clean communication between the main loop and ISRs involves a bit of care, declaring variables volatile, taking snapshots, disabling interrupts for critical periods, but it is all documented and it's the way everybody else does it.