#include <p18f252.h>
#include <adc.h>
#include <usart.h>
#include <stdlib.h>
#include <timers.h>
#include <delays.h>
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config DEBUG = OFF
unsigned char ACTIVA, DESACTIVA;
unsigned char dato, LeeDIR, LeeTP;
int Dir, Tp, N_Dir;
volatile int estado;
volatile int minutos=0;
volatile int segundos=0;
void ConfiguraUSART(void);
void ProcesarUSART(unsigned char);
void ProcesarPulsador(int);
void SET_DIR(void);
void SET_TP(void);
void ISRTimer0(void);
#pragma code Interrupcion = 0x08
void VectorInterrupcion(void){
_asm goto ISRTimer0 _endasm
}
#pragma code
#pragma interruptlow ISRAltaPrioridad
void ISRAltaPrioridad(void){}
#pragma interrupt ISRTimer0
void ISRTimer0(void){
if(INTCONbits.TMR0IF==1){
WriteTimer0(26473); // 1000,012 ms a 16bit, 1:64
INTCONbits.TMR0IF=0;
segundos++;
if (segundos==60){
minutos++;
segundos = 0;
}
if (minutos==2 && estado==1){
estado = 0;
minutos = 0;
segundos = 0;
}
}
}
void main(void){
TRISA = 0xFF; // Puerto A como entrada
TRISB = 0x08; // Puerto B Salidas menos RB3(Pulsador)
TRISC = 0x8F;
PORTB = 0x00;
PORTC = 0x00;
RCONbits.IPEN=0; // Deshabilitamos prioridades.
INTCONbits.PEIE=1; // Habilitamos interrupcion de perifericos.
INTCONbits.GIE=1; // Habilitamos interrupcion global.
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_64);
SET_DIR();
SET_TP();
ConfiguraUSART();
while(1){
if(DataRdyUSART()){
while(BusyUSART());
dato = ReadUSART();
ProcesarUSART(dato);
}
ProcesarPulsador(Tp);
}
CloseUSART();
}
void ProcesarUSART(unsigned char dato){
if(dato == ACTIVA){
WriteTimer0(26473); // 1000.012 ms
estado = 1;
minutos = 0;
segundos = 0;
}
else if(dato == DESACTIVA){
estado = 0;
}
}
void ProcesarPulsador(int Tp){
if(estado==0){
PORTBbits.RB0 = 0;
}
else if(estado==1){
PORTBbits.RB0 = 1;
if(PORTBbits.RB3==1){
estado = 0;
PORTBbits.RB0 = 0; // Apaga Led
switch(Tp){
case 0:
PORTBbits.RB1 = 1; // Activa Rele
Delay10KTCYx(125);
break;//500 ms
case 1:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
break;//1 segundo
case 2:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 3:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 4:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 5:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 6:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 7:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 8:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 9:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 10 :
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 11:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 12:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 13:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 14:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
case 15:
PORTBbits.RB1 = 1;
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
Delay10KTCYx(250);
break;
}
// PORTBbits.RB1 = 0; //RELE
// estado=0;
}
}
}
void SET_DIR(void){
OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_0ANA_0REF, ADC_INT_OFF);
LeeDIR = PORTA;
switch(LeeDIR){
case 0b00000001: Dir = 0x01; ACTIVA = 0x65; DESACTIVA = 0x01; N_Dir = 1; break;
case 0b00000010: Dir = 0x02; ACTIVA = 0x66; DESACTIVA = 0x02; N_Dir = 2; break;
case 0b00000011: Dir = 0x03; ACTIVA = 0x67; DESACTIVA = 0x03; N_Dir = 3; break;
case 0b00000100: Dir = 0x04; ACTIVA = 0x68; DESACTIVA = 0x04; N_Dir = 4; break;
case 0b00000101: Dir = 0x05; ACTIVA = 0x69; DESACTIVA = 0x05; N_Dir = 5; break;
case 0b00000110: Dir = 0x06; ACTIVA = 0x6A; DESACTIVA = 0x06; N_Dir = 6; break;
case 0b00000111: Dir = 0x07; ACTIVA = 0x6B; DESACTIVA = 0x07; N_Dir = 7; break;
case 0b00001000: Dir = 0x08; ACTIVA = 0x6C; DESACTIVA = 0x08; N_Dir = 8; break;
case 0b00001001: Dir = 0x09; ACTIVA = 0x6D; DESACTIVA = 0x09; N_Dir = 9; break;
case 0b00001010: Dir = 0x0A; ACTIVA = 0x6E; DESACTIVA = 0x0A; N_Dir = 10; break;
case 0b00001011: Dir = 0x0B; ACTIVA = 0x6F; DESACTIVA = 0x0B; N_Dir = 11; break;
case 0b00001100: Dir = 0x0C; ACTIVA = 0x70; DESACTIVA = 0x0C; N_Dir = 12; break;
case 0b00001101: Dir = 0x0D; ACTIVA = 0x71; DESACTIVA = 0x0D; N_Dir = 13; break;
case 0b00001110: Dir = 0x0E; ACTIVA = 0x72; DESACTIVA = 0x0E; N_Dir = 14; break;
case 0b00001111: Dir = 0x0F; ACTIVA = 0x73; DESACTIVA = 0x0F; N_Dir = 15; break;
case 0b00010000: Dir = 0x10; ACTIVA = 0x74; DESACTIVA = 0x10; N_Dir = 16; break;
case 0b00010001: Dir = 0x11; ACTIVA = 0x75; DESACTIVA = 0x11; N_Dir = 17; break;
case 0b00010010: Dir = 0x12; ACTIVA = 0x76; DESACTIVA = 0x12; N_Dir = 18; break;
case 0b00010011: Dir = 0x13; ACTIVA = 0x77; DESACTIVA = 0x13; N_Dir = 19; break;
case 0b00010100: Dir = 0x14; ACTIVA = 0x78; DESACTIVA = 0x14; N_Dir = 20; break;
case 0b00010101: Dir = 0x15; ACTIVA = 0x79; DESACTIVA = 0x15; N_Dir = 21; break;
case 0b00010110: Dir = 0x16; ACTIVA = 0x7A; DESACTIVA = 0x16; N_Dir = 22; break;
case 0b00010111: Dir = 0x17; ACTIVA = 0x7B; DESACTIVA = 0x17; N_Dir = 23; break;
case 0b00011000: Dir = 0x18; ACTIVA = 0x7C; DESACTIVA = 0x18; N_Dir = 24; break;
case 0b00011001: Dir = 0x19; ACTIVA = 0x7D; DESACTIVA = 0x19; N_Dir = 25; break;
case 0b00011010: Dir = 0x1A; ACTIVA = 0x7E; DESACTIVA = 0x1A; N_Dir = 26; break;
case 0b00011011: Dir = 0x1B; ACTIVA = 0x7F; DESACTIVA = 0x1B; N_Dir = 27; break;
case 0b00011100: Dir = 0x1C; ACTIVA = 0x80; DESACTIVA = 0x1C; N_Dir = 28; break;
case 0b00011101: Dir = 0x1D; ACTIVA = 0x81; DESACTIVA = 0x1D; N_Dir = 29; break;
case 0b00011110: Dir = 0x1E; ACTIVA = 0x82; DESACTIVA = 0x1E; N_Dir = 30; break;
case 0b00011111: Dir = 0x1F; ACTIVA = 0x83; DESACTIVA = 0x1F; N_Dir = 31; break;
}
}
void SET_TP(void){
if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 0;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 1;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 2;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 3;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 4;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 5;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 6;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 7;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 8;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 9;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 10;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 11;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 12;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 13;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 14;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 15;}
}
void ConfiguraUSART(void){
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 64);
}