#include <xc.
h>
#pragma config PLLSEL = PLL4X, CFGPLLEN = OFF, CPUDIV = CLKDIV3, LS48MHZ = SYS48X8
#pragma config FOSC = INTOSCIO, PCLKEN = ON, FCMEN = OFF, IESO = OFF
#pragma config nPWRTEN = OFF, nLPBOR = OFF
#pragma config WDTEN = OFF
#pragma config PBADEN = OFF, MCLRE = ON
#pragma config STVREN = ON, LVP = ON, ICPRT = OFF, XINST = OFF
#define _XTAL_FREQ 16000000 //16MHz.
void main(void) {
//Configuración del oscilador.
OSCCON = 0x70;
//Configuración de puertos.
ANSELA = 0x00;//Puerto A como digital.
ANSELB = 0x00;//Puerto B como digital.
TRISA = 0x00; //Puerto A como salida.
LATA = 0x00; //Limpiar el puerto A.
TRISBbits.RB0 = 1; //RB0 como entrada (botón 1).
TRISBbits.RB1 = 1; //RB1 como entrada (botón 2).
TRISBbits.RB2 = 1; //RB2 como entrada (botón 3).
INTCON2bits.RBPU = 0; //Habilito Pull Up del puerto B.
TMR0 = 65223; //Valor del timer.
T0CON = 0x87; // Configuración del timer.
INTCONbits.GIE = 1; //Habilitar interrupciones globales.
INTCONbits.TMR0IE = 1; //Habilitar el timer 0.
INTCONbits.TMR0IF = 0; //Limpiar bandera del timer 0.
INTCONbits.PEIE = 1; //Habilitar interrupciones periféricas.
while (1) {
//Instrucciones a ejecutar.
}
return;
}
//Interrupciones.
void __interrupt() servo(){
if (INTCONbits.TMR0IF){ //Si se activó la interrupción.
if (PORTBbits.RB0 == 0){ //Si se pulsa el botón 1.
LATAbits.LATA0 = 1; //Activo RA0.
__delay_us(1500); //Retardo de 2500 us.
LATAbits.LATA0 = 0;
TMR0 = 65262; //Valor del timer.
INTCONbits.TMR0IF = 0; //Limpiar bandera del timer.
}
else if (PORTBbits.RB1 == 0){
LATAbits.LATA1 = 1; //Activo RA1.
__delay_us(2500); //Retardo de 1500 us.
LATAbits.LATA1 = 0; //Desactivo RA1.
TMR0 = 65262; //Valor del timer.
INTCONbits.TMR0IF = 0; //Limpiar bandera del timer.
}
else if (PORTBbits.RB2 == 0){ //Si se pulsa el botón 2.
LATAbits.LATA2 = 1; //Activo RA1.
__delay_us(2500); //Retardo de 1500 us.
LATAbits.LATA2 = 0; //Desactivo RA1.
TMR0 = 65262; //Valor del timer.
INTCONbits.TMR0IF = 0; //Limpiar bandera del timer.
}
}
}