Here is some code I use in an 18F8720 using a 20Mhz Xtal, You can modify the technique to run on nearly any other part. It works best when you you need accuracy over a long period, but don't need to time over very small intervals.

'---------------------------------------------------------------------
T0CON =$87 ' Set up TMR0 prescaler with 256 divisor


LOOP:

IF INTCON.2 = 1 THEN
INTCON.2 = 0
TMR0H = $69
TMR0L = $7A
GOSUB CountTime
EndIF

'Your code goes here'

GOTO LOOP

CountTime:

Seconds = Seconds + 2
IF Seconds = 60 THEN
Seconds = 0
Minutes = Minutes + 1
.
.
.
RETURN




'-------------------------------------------------------------------------

Explanation of what is going on above:

Hardware Timer0 is set up with a 256 (/8) divisor
INTCON.2 gets set whenever the timer rolls over.
When the timer rolls over, the timer gets loaded with a value
that insures it will time out again in 2 seconds.

Your program executes normally, but exactly every two seconds
the CountTime sub is executed.

The only caveat: Your program MUST complete at least one loop every
2 seconds!

I have used a similar technique with the 16F series, but since the timers are "shorter", sometimes the maximum timeout is only 65 ms. Still, the procedure can be very useful.