#include <p30f4013.h>
#include <stdio.h>
#include <can.h>
#include <stdio.h>
#include <string.h>

#define fcy 16000000
//***********************************FUSIBLES*************************************************++

_FOSC(CSW_FSCM_OFF & XT);       //reloj externo
_FWDT(WDT_OFF);                 //Turn off the Watch-Dog Timer.
_FBORPOR(MCLR_EN & PWRT_OFF);   //Enable MCLR reset pin and turn off the
_FGS(CODE_PROT_OFF);            //Disable Code Protection
//*************************************PROTOTIPO DE FUNCIONES **************************************************
void ABAJO();                                                      //ESCRIBE EN LA LINEA INFERIOR DEL DISPLAY
void inicializa_LCD();                                           //INICIALIZA
char envia_dato(unsigned char *Rxdata);                                                 //ENVIA DATO
void retardo_ms(unsigned int ms);                                 //Prototipo funcion retardo
void retardo_us(unsigned int us);   
unsigned char Txdata[] =
{"VELOCIDAD = "};                               //Prototipo funcion retardo                               
int a=0,b,r=0,i;  
unsigned char Rxdata[];   
int main();

//*****************************PROGRAMA PRINCIPAL*************************************************************
int main()
{
ADPCFG = 0xFFFF;            //Configuro mis salidas digitales
TRISD=0x0000;                           //PUERTOS COMO SALIDAS (CONTROL)
TRISB=0x0000;                          //PUERTO COMO SALIDA (DATOS)
inicializa_LCD();                      //INICIALIZA LCD
r = strlen(Txdata);                    //CALCULA LONGITUD DE FRASE
for(a=0;a<r;a++){     
envia_dato(Txdata+a);

}

C1CTRLbits.CANCAP=0X01;         //Habilito la captura de CAN
C1CTRLbits.CSIDL=0X00;         //El modulo CAN continua en opracion cuando esta en modo idle
C1CTRLbits.CANCKS=0X01;         //Defino mi frecuencia CAN con mi FCY
C1CTRLbits.REQOP=0X00;         //Configuro como modo standart
C1CTRLbits.OPMODE=0X00; 

C1RXF0SIDbits.SID=0X01;  //0x01
C1RXF0SIDbits.EXIDE=0X00;

C1RXM0SIDbits.SID=0X01;
C1RXM0SIDbits.MIDE=0X00;

C1INTEbits.RX0IE=0X01;
C1RX0SID=0x0000;
//RX
C1RX0CONbits.RXFUL=0X00; //0x00
C1RX0CONbits.FILHIT0=0X00; //0x00

//BAUDRATE
C1CFG1=0x00;
C1CFG2=0x0290;

C1RX0CONbits.RXFUL=0X00;

C1RX0CONbits.FILHIT0=0X00;

C1INTEbits.TX0IE=0X01;//INTERRUPCION CUANDO SE ENVIA EL TRAMA
C1RX1CONbits.RXFUL=0X00;
*Rxdata=C1RX0B1;

for(b=0;b<4;b++){    
envia_dato(Rxdata+b);
}                  // SI PASA DE 15 CARACTERES PASA AL RENGLON DE ABAJ0    





return 0;  
}


   
//*********************************FUNCIONES ****************************************************
//******************************RETARDO MILISEGUNDOS**********************************************
void retardo_ms(unsigned int ms){
	              unsigned int periodo=0;	
	              T1CON =0;                                       //Asegurarse de que el timer 1 este en estado de reset
	              TMR1 =0;
	              IPC0bits.T1IP =1;                               //registro del periodo del timer 1
	              periodo = ((fcy/256)*ms)/100;
	              PR1 =periodo;
	              IFS0bits.T1IF =0;                               //Clear the timer 1 interrup status flag
	              IEC0bits.T1IE =0; 
                  T1CON = 0X8030;                                 //Cnfigura T1CON=1000000000110000
	              while(IFS0bits.T1IF==0);
	              }
//**********************************RETARDO NANOSEGUNDOS***************************************************
void retardo_us(unsigned int us){
	              unsigned int periodo=0;	
	              T1CON =0;                                       //Asegurarse de que el timer 1 este en estado de reset
	              TMR1 =0;
	              IPC0bits.T1IP =1;                               //registro del periodo del timer 1
	              periodo = (fcy*us)/1000000;
	              PR1 =periodo;
	              IFS0bits.T1IF =0;                               //Clear the timer 1 interrup status flag
	              IEC0bits.T1IE =0; 
                  T1CON = 0X8030;                                 //Cnfigura T1CON=1000000000110000
	              while(IFS0bits.T1IF==0);
	              }
//***************************INICIALIZACION DE LCD************************************************************
void inicializa_LCD(){
                 LATDbits.LATD2=0;              //RS =0 INSTRUCCION
                 for(i=0;i<=3;i++){
                 retardo_ms(20);
                   LATDbits.LATD8= 1;                             //E  = 1
                   retardo_ms(1);
                   LATB = 0X0038;                                 //FUNCION SET
                   retardo_ms(1);
                   LATDbits.LATD8=0;                              //E  = 0
 
                 }        
                  
               LATDbits.LATD8= 1;                          //E  = 1
                      retardo_us(1);
                      LATB = 0X0001;                              //DISPLAY CLEAR
                      retardo_us(2);
                      LATDbits.LATD8 = 0;                         //E  = 0

                  
                      LATDbits.LATD8 = 1;                         //E  = 1
                      LATB = 0X0002;                              //HOME
                      retardo_us(1);
                      LATDbits.LATD8 = 0;                         //E  = 0
                                 
                      
                         
						
                   retardo_us(1);
                   LATDbits.LATD8= 1;                             //E  = 1     
                   retardo_us(1);
                   LATB = 0X0006;                                 //ENTRY MODE SET
                   retardo_us(2);
                   LATDbits.LATD8 = 0;                            //E  = 0
                   
                  retardo_us(1);
                   LATDbits.LATD8= 1;                             //E  = 1
                   retardo_us(1);
                   LATB = 0X000E;                                 //DISPLAY ON
                  retardo_us(2);
                   LATDbits.LATD8 = 0;                            //E  = 0
        
                  
                   retardo_us(1);
                   LATDbits.LATD8= 1;                             //E  = 1
                  retardo_us(1);
                   LATB = 0X0014;                                 //CURSOR SHIFT
                   retardo_ms(1);
                   LATDbits.LATD8 = 0;                            //E  = 0
}                   
              
//**************************ENVIO DE DATOS **************************************************************
char envia_dato(unsigned char *Txdata){
LATDbits.LATD2=1;              //RS =1 TEXTO
retardo_us(1);    
 LATDbits.LATD8 = 1;            //E  = 1
 retardo_us(1);
LATB=*Txdata;   //A    
retardo_us(1)   ;                                  
LATDbits.LATD8 = 0;            //E  = 0
}
//********************************ABAJO****************************************************************
void ABAJO(){
LATDbits.LATD2=0;              //RS =0 INSTRUCCION
                    LATDbits.LATD8= 1;                             //E  = 1
                   retardo_ms(1);
                   LATB = 0X00C0;
                   retardo_ms(1);
                   LATDbits.LATD8=0;                              //E  = 0
}

