Vaya, te doy las gracias por tu ayuda, la verdad es que me ha servido, utilizando while ((PORTC & 0x0f)!=0x05);
Me ha funcionado, pero si utilizo la directiva fast_io no funciona, por lo que he dejado la directiva standard_io.
Si no te importa podrías explicarme como funciona while((PORTC & 0x0f)!=0x05);
Entiendo parte de la sentencia pero no se qué pasa al poner el AND (&).
Voy a colgar el proyecto que he hecho para que le echen un vistazo a ver si se puede mejorar y de qué manera.
de la forma que lo he hecho me funciona, lo que hay un pequeño detalle que no he conseguido arreglar, resulta que cuando está en el bucle de armado, el display parpadea una vez cada 30 o 40 segundos, he estado intentado corregirlo pero no he podido.
Sean comprensivos, es el primer proyecto que hago por mi cuenta
/*
A0 = 1º zona de control
A1 = 2º Zona de control
C0 = Interruptor para código
C1 = Interruptor para código
C2 = Interruptor para código
C3 = Interruptor para código
C5 = led verde
C6 = led rojo
C7 = zumbador, salida PWM
*/
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock = 4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
//----------------------------------Rutina de alarma-----------------------------
void alarma(){
lcd_gotoxy(1,1); //esta es la posición para que el mensaje
printf(lcd_putc, " ALARMA"); //funcione en el LCD correctamente
do{ //Haz las siguientes rutinas
output_high(PIN_C6); //Apagamos el led rojo
output_high(PIN_C7); //empieza la rutina de la señal PWM
delay_ms(10);
output_low(PIN_C7);
delay_ms(10); //Finaliza la rutina de la señal PWM
}
while((PORTC & 0x0f)!=0b00001000); // sigue con el bucle mientras PORTC no sea igual a 0b00001000
}
//-------------------------------Rutina de desactivación-----------------------------------
void desarmado(){
lcd_gotoxy(1,1); //Seleccionamos la posición del mensaje
printf(lcd_putc, " DESARMADO"); //Mensaje a desplegar en el LCD
do{ //Haz la siguiente rutina
output_high(PIN_C5); //Enciende el led verde
output_low(PIN_C6); //Apaga el led Rojo
output_low(PIN_C7); //Desactiva el zumbador
}
while((PORTC & 0x0f)!=0b00000110); //sigue con el bucle Mientras PORTC no sea = a 0x06
}
//-----------------------------Programa principal-------------------------------
void main(){
lcd_init(); //Funcion necesaria para que funcione el LCD
while(TRUE){ //Mientras sea verdad
lcd_gotoxy(1,1); //Seleccionamos la posición del mensaje
printf(lcd_putc, "\f ARMADO"); //Mensaje a desplegar en el LCD
output_low(PIN_C5); //apaga el led verde (si estubiera encendido)
output_low(PIN_C7); //apaga el led amarillo (si estuviera encendido)
if (input(PIN_A0)||input(PIN_A1)==1) // Si A0 o A1 se pone a 1
alarma(); //Se salta la alarma
if ((PORTC & 0x0f)==0b00000111) //si por el nible mas bajo de puerto C, se activa el código 0x07
desarmado(); //Se desactiva el sistema
else output_low(PIN_C6); //Rutina de parpadeo del led rojo
delay_ms(600);
output_high(PIN_C6);
delay_ms(70); //termina la rutina del led rojo
}
}