Saludos erpindi, bienvenido al foro!
No especificas en qué lenguaje estás trabajando.
Pero lo más lógico para temporizaciones es usar el propio temporizador del micro, el PIC16F84 trae el TMR0.
Con un oscilador externo de 4MHz y si lo configuras con pre-escala de 1:256 podrías contar 65,5ms.
Para contar un tiempo largo, podrías habilitar la interrupción por tmr0, y en la rutina de interrupción, incrementar una variable de 32bits, o int32.
Eso te permitiría contar más de un año!

Lo que tienes que hacer es evaluar la variable que estás incrementando.
Si por ejemplo, quieres contar 12horas, la variable tendría que contar hasta 659.180.
Entonces sería así:
- Configuras tmr0 y habilitas interrupción.
- En la rutina de interrupción: evaluas la variable para saber si llegó a 659.180, luego la incrementas.
si llega a 659.180, colocas a 1 una bandera.
vuelves a cargar el tmr0 con 0 y habilitas la interrupción (si es necesario).
- En el lazo infinito principal del programa: evaluas la bandera, si está en 0, no hace nada, si está en 1 va a la rutina de lo que hay que hacer...
Bueno esto es a groso modo, porque no sé con qué lenguaje estás programando, así que no puedo darte un ejemplo.
Espero que esto te sirva para guiarte un poco.
Revisa el datasheet para que sepas cómo configurar correctamente el tmr0.
Un cordial saludo, nos leemos!