Hola antes que nada, todo depende del PIC que estes utilizando.
¿como puedo configurar los puertos A,B,etc como salida o entrada, en conjunto o individualmente por patillas? tengo una leve idea de que es "jugando" con los registros TRISA,TRISB... y los bancos de memoria (RP0,RP1) pero me gustaria que alguien me lo explicara mejor
Lo de los puertos:
Ejemplo de configuracion del puertoA:
BCF STATUS,RP1
BSF STATUS,RP0 ;banco 1: en este banco se configuran los puertos como I/O
MOVLW b'10101101' ;muevo el valor binario 10101101 al acumulador(W).
MOVWF TRISA ;Copio el valor de W para setear los pines del puertoA. Entonces: los pines 7,5,3,2 y 0 son entradas, mientras que los pines 6,4 y 1 son salidas.
;el resto de los puertos se puede configurar aqui.
Luego vuelves al banco 0 del pic haciendo:
BCF STATUS,RP0
.¿y si tengo que ir cambiando a lo largo del programa el que una patilla sea de entrada o salida?
Pues simplemente vuelves a reconfigurar los puertos como quieras,basandote en el codigo que te puse arriba
tabla movf contador, w
addwf pc,pc
0 retlw 0x3F
1 retlw 0x07
Lo correcto es:
tabla movf contador, w
addwf PCL,1
retlw 0x3F
retlw 0x07
Las tablas dentro de sub-rutinas requieren de ciertas precauciones.No te quiero marear, pero si en el futuro tienes problemas, ya lo sabes

.
por otro lado, ¿como se trabaja con los timer? en concreto con el timer0. por ejemplo si quiero periodos de 20ms y otros de 0.5sg ¿cómo manejo T0CS en el option register, o el TOIF o el prescale?
Timer0: lo primero que debes hacer es configurarlo(descarga la hoja de datos(datasheet) del pic que pensas utilizar y fijate alli que se explica como configurarlo).
Luego, en la configuracion tienes la opcion de hacer que el TImer cuando se desborda genere una interr, o no.
Revisa en el foro o haz una busqueda, seguro encontraras toda la info y mucho mas de lo que andas buscando
Exitos!