Gracias por vuestras respuestas pero esta parte del programa no la entiendo para nada y a la hora de compilarlo me aparecen errores me la podriais explicar.
#INT_TIMER0 //aqui entro en la rutina de la interrupcion
void INT_timer0() //¿?¿?¿?¿
{
c++; //¿?¿?¿?¿?
if(c==61 & a) //¿?¿?¿?¿'
{
c=0; //que es la c ¿?¿??
b^=0xFF; //que significa ^ ¿?¿?¿?¿
}
}
Gracias.
#INT_TIMER0 //Acá le indicas al compilador que va a existír una subrutina de interr. del Timer0
void INT_timer0() //Esta es la subrutina del Timer0 asociada.
{
c++; //Incremento la variable global "c", para ir contando las interrupciones del Timer0
if(c==61 & a) //Cuando c valga 61, habremos contado aproximadamente 1 segundo de tiempo transcurrido. a contiene el valor del estado del pulsador. Entonces si se cumplen AMBAS condiciones(por eso esta el "&" que es "logical AND") la condicion del IF da TRUE y se ejecuta lo siguiente:
{
c=0; //pongo a 0 la "c" para volver a contar de nuevo 61 interr. del Timer0
b^=0xFF; //la significa ^ significa XOR. La instrucción XOR, es un operador lógico, en este caso, entre un registro y un valor. Aquí la XOR se hace sobre la variable b y el valor 0xFF. Una de las utilidades de la XOR es que, mediante el valor ingresado y controlado(en esta caso 0xFF) se puede invertir el valor de los bits del registro(en este caso "b") poniendo a 1 todos los bits que se quieran invertir. Hacer b^=0xFF entonces implica que que si "b" valía 0 antes de esta instrucción XOR, luego de la XOR valdrá 0xFF. En la próxima pasada cuando "b" valga 0xFF, la XOR nuevamente invertirá los bits de "b", haciendo que valga 0. Y así susesivamente.
}
}
El ejemplo que te ha dado manex es bueno, pero tiene un par de detalles que deberías corregir.
Yo lo haría así:
#include <16F877A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use fast_io(A)
#use fast_io(B)
#byte port_b= 0x06
short c=0;
void main()
{
set_tris_a(0x00);
set_tris_b(0x01);
setup_timer_0 (RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
output_low (PIN_B1);
while(1)
{
if(input(PIN_B0)){
c=0;
output_low(PIN_B1);
}
}
}
#INT_TIMER0
void INT_timer0()
{
c++;
if(c==61 & !input(PIN_B0))
{
c=0;
port_b^=0x02; //invertir el estado del pin B1 sólamente.
}
}
Saludos!