Te respondo las preguntas, pero codigo no vas a obtener, Solo si presentas tu codigo y veo que estas tratando de aprender vas a recibir ayuda de mi parte y tal ves un poco de codigo tambien.
Primero es necesario definir un lenguaje en el cual vas a programar:
¿ASM o C?
Respecto a las preguntas:
¿Que habría que hacer para programar un reloj?
Lo mas basico basico pero basico y que no posee ninguna precision, es decir podriamos estar errandole en 1 o 2 segundos por minuto ( que a la hora es mucho), seria con delays, es decir solo tocarias los modulos del puerto ( entrada, salida, ponerlo en 1 o en 0 )
Si queres un poquito mas de precision Usas un timers. Yo no usaria el PIC16F84A es caro y no posee nada. Aunque sea usaria el PIC16F88 que es una version mas actual y mas barata.
¿Tendria que usar multiplexado para los supuestos displays?
Depende de como sea tu reloj o como lo quieras hacer, Supongamos 6 display 7 segmentos, lo mas simple seria una multiplexacion, por que necesitarias 7 pines para cada segmento + 6 pines para los comunes, lo cual vas a necesitar bastantes pines y que el PIC16F84A no posee, tal ves si son 4 displays sea mas simple.
¿Hacen falta interrupciones?
Depende como quieras programarlo, si usas el timer para llevar los segundos estaria bueno usarlas, y dejar el programa principal para solo el multilpexado.
¿Como harían para que el micro se de cuenta que un segundo es un segundo?
Cada instruccion ejecutada ocupa un tiempo especifico, ej lenguajes como C es muy dificil saber la cantidad de instrucciones, pero si en ASM. Lo que se hace es usar un timer, ese timer es un contador de pulsos, esos pulsos provienen del reloj que tiene el timer o del reloj que se alimenta el PIC. Si conoces la frecuencia del oscilador, podes saber cuanto tarda en sumar 1 ese timer, Si por ejemplo cargas 200 en el timer, tenes que cuando llegue a 256 se produce el overflow y activa la interrupcion, entonces conoces que pasaron 56 pulsos.
¿Con un contador?¿Donde se guarda ese dato?
Si usas el timer con el reloj principal que normalmente va a ser de 4Mhz lo mas seguro, el timer va a producir un overflow de muy poco tiempo, entonces la idea es generar una interrupcion de un valor concreto, supongamos esto, configuras el timer para que se produzca una interrupcion cada 0.01s ( 10ms ) , entonces para saber cuanto es 1 segundo, creas una variable (en C) o usas un registro ( en ASM ) para contar la cantidad de veces que entra, al llegar a 100 ( 100 * 10ms = 1s) sabes que paso 1 segundo.
¿Como sabe que 60 segundos se convierten en un minuto?
El micro no sabe nada, el que sabe eso sos vos, entonces suponente que creas una variable que se llame segundos, y ahora cada ves que pasa un segundo lo incrementas en 1, vos sos el encargado de revisar que si incrementas no exceda los 60 segundos. Ejemplo ( esto es pseudocodigo para que entiendas )
Segundos + 1
Si Segundos es igual a 60
Entonces Hago:
Segundos igual a 0
Minutos + 1
Hasta ahi simple, pero si observas tambien sume 1 a minutos, y tambien tengo que asegurarme que si minutos es 60 entonces ponerlo a 0 y sumarle uno a hora, y lo mismo con horas, la cosa termina asi:
Segundos + 1
Si Segundos es igual a 60 Entonces:
Segundos igual a 0
Minutos + 1
Si Minutos es igual a 60 Entonces:
Minutos igual a 0
Horas + 1
Si Horas es igual a 24 Entonces:
Horas igual a 0