Yo no soy el adecuado para guiarte como configurar los pines con CCS por que no uso CCS, uso XC8. Y tiene formas distintas de configurar las entradas/salidas.
Lo que te puedo decir es que vas mejor encaminado. Y solo me voy a limitar a hablar del programa, es decir lo que esta dentro del while(1).
Para comenzar deberias de realizar una simulacion al menos con pulsadores, en el que algunas entradas esten a 1 y otras a 0 sin presionar el pulsador, algo simple de hacer.
Ahora vamos a suponer que al detectarse algo procede a activar la alarma. Para esto voy a hacer un "programa" como para que lo entiendas, obviamente no vas a poder copiar y pegarlo. Es basicamente lo que tenes vos y estas haciendo, pero te dejo ademas algo mas claro
while(1)
{
if( ¿ Boton encendido presionado ? ) // Este boton va a cambiar el estado de la alarma
{ // El estado de la alarma pueden ser 2: Activado y Desactivado
delay_ms(10);
while(input(E_ON_OF)==0);
output_toggle(Estado de alarma); // Led que indica el estado de la alarma, uso esta salida tambien para saber cuando esta activa o no
}
if(Estado Alarma == Activado )
{
if(Sensor1 == 1 o Sensor2 == 1 o Sensor3 == 0 o Sensor4 == 0)
{ // Si se detecta algun cambio en los sensores de los valores
output_high(Sirena); // por defecto, que active la alarma
} // Sensor1 tendria por defecto un 0, y cuando recibe datos del sensor pasa a 1
} // Sensor3 podrias pensarlo como una llave que es Normal cerrado a 5V por lo que tiene un 1 siempre y cuando
else // alguien abre la puerta se pone a 0. Si se detecta algun cambio en los sensores que active la sirena
{
output_low(Sirena); // En caso que se desactive la alarma desactivamos la sirena tambien.
}
}
Si vos tenes activada la alarma y se detecta algo que se active la Sirena, pero no significa que cuando el sensor vuelva a su estado "normal" se corte la sirena, pensalo como si abris la puerta comienza a sonar la sirena, la cerras y se para. No tiene sentido como alarma. Entonces la unica forma de desactivarla es que se presione el mismo boton que lo activo.
Por supuesto esto es MUY simple y hay muchos mas cosas a agregar, por ejemplo cuando la activas deseas que pase un tiempo hasta que la alarma se "arme" de esa forma tenes tiempo de salir de la casa. Y esto es podria ser algo simple de realizar haciendo esto:
while(1)
{
if( ¿ Boton encendido presionado ? ) // Este boton va a cambiar el estado de la alarma
{ // El estado de la alarma pueden ser 2: Activado y Desactivado
delay_ms(10);
while(input(E_ON_OF)==0);
if(Estado Alarma == Desactivado )
{
delay_ms(5000);
}
output_toggle(Estado de alarma);
}
if(Estado Alarma == Activado )
{
if(Sensor1 == 1 o Sensor2 == 1 o Sensor3 == 0 o Sensor4 == 0)
{ // Si se detecta algun cambio en los sensores de los valores
output_high(Sirena); // por defecto, que active la alarma
} // Sensor1 tendria por defecto un 0, y cuando recibe datos del sensor pasa a 1
} // Sensor3 podrias pensarlo como una llave que es Normal cerrado a 5V y cuando
else // alguien abre la puerta se pone a 0
{
output_low(Sirena);
}
}
Ahora le estoy diciendo que si cuando presiono el boton de "activar/desactivar" y justamente pasa a activarse la alarma, espere 5 segundos antes de comienze a tomar los sensores ( que entre al otro if que pregunta por los sensores)
Y genial ahora tenemos nuestra demora. Pero... sigue simple y se agregan muchas mas complicaciones en el proceso. Si quisieras desactivar la alarma cuando la activaste y estas en esos 5 segundos de espera, no lo vas a poder hacer!, vamos a analizarlo paso a paso, la presion de un boton supongamos como maximo es de 0.5s diria mas 0.1 a 0.25s.
Siguiendo la linea del programa presionas primero el boton de "activar/desactivar", eso va a hacer que entre al primer if, cuando lo sueltes va a entrar a delay de 5s, paso 1 segundo y te diste cuenta que te olvidaste algo asi que tenes que desactivarla, si presionas de nuevo no es que va a entrar de nuevo en el if, sino que todavia esta atrapado dentro del delay y faltan 4 segundos para que salga, entonces te quedan 2 opciones, o tenes presionado el boton por 4 segundos mas y seguro que se va a disparar la alarma por que va a detectar los sensores y hasta que no sueltes no se va a apagar o simplemente esperas que se dispare y luego presionas el boton.
De esta forma tenes que realizar algo para que esto no ocurra. Los delays son muy lindos pero tienen ese problema, perdes la respuesta antes cambios, Asi que deberias diseñar algo para que te permita hacer eso. Ahora en mi ejemplo tome en cuenta como si lo activaras desde adentro, dije 5 segundos , pero 5 segundos es poco. Y normalmente serian algo asi de 30segundos. No creo que sea nada lindo esperar 30 segundos que se dispare la alarma o tener presionado el boton los 30 segundos. Por eso es que debe responder el PIC. Lo mejor para esto es en ves de usar un delay, es usar un timer. Y esto no es unicamente para eso sino tambien para los sensores en el que por ahi quisieras que no detecte un pequeño pulso que puede llegar por un error del sensor sino que esperas por ejemplo que este 1segundo activo el mismo. Otros momentos que necesitas del timer es que espere un tiempo para disparar la alarma, asi podes entrar y "desactivarla" sin que suene, tambien si pensas hacer lo de las luces vas a necesitar contar el tiempo.
Si esto lo haces con delays va a ser un desastre como alarma.
Como el timer es todo un tema aparte, lo mejor que se me ocurre es que realizes un programa aparte y nuevo con un ejemplo de un timer + un led, que el timer sea el encargado de encender el led.
Una cosa mas.
Si leiste estuve hablando de pulsadores conectados al PIC, y las salidas pueden ser simples leds para poder probarlo y simularlo. De esa forma tenes que el programa es correcto y podes probarlo incluso en un protoboard, me refiero a que esos pulsadores van a simular ser los sensores, y los leds las cargas como leds/sirenas/luces/etc. Luego una ves que tengas el programa mas avanzado podemos ir complicandolo un poco mas, por ejemplo que la forma de activacion pueda ser tanto por IR / RF o desde adentro con un boton.
PD: Hasta ahora no usamos mas que if y un while, nada mas. Y con lo que hay para hacer no se necesita mas que ifs en su mayoria