Buenas Pablo
He echado un vistazo a tu código y veo algunas cosillas que pueden o de hecho te dan problemas. Por ejemplo, activas la interrupción del Timer1 pero no la usas nunca. Esto no debería ser un problema, sin embargo en la función principal haces un uso exagerado de los delay. Ten en cuenta que cada vez que usas un delay el código principal se paraliza, esperando a que este delay termine para proseguir. Lo único que podría funcionar mientras un delay se produce es precisamente una interrupción. En tu caso, podrías usar la interrupción para chequear el estado de los botones (la estructura de selección switch), o mejor aún, activar una salida de forma alternativa cada cierto tiempo, que creo es lo que haces con los delay, a modo de testigo de funcionamiento. A su vez podrías usar otro Timer para mantener activos los relés el tiempo que necesites, contanto overflows. Por ejemplo, si configuras el timer0 así: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); a 4 Mhz conseguirás un overflow cada 65,536ms (256us x 8 bits). Si quieres que tu relé permanezca encendido 15 minutos, serían: 15min=900seg=900000ms, 900000/65,536=13732,9 overflows, que si no necesitas gran precisión puedes redondear a 13733.
Y por último, en la función activacuartel() declaras variables que nunca usas para nada, como "guardia", "salamaquinas" o "exterior", solo les das valores. ¿Para qué te sirve eso?
Espero haberte ayudado en algo. Un saludo.