//************************************************//
#include<p18f452.h>
#include<delays.h>
#pragma config OSC=HS,WDT=OFF,LVP=OFF
#define DI PORTBbits.RB0
//*************************//
unsigned int TL,TH,TT,CNT=0,FLG_RF=0,FLG_RF_OK=0,C1=0,C0=0;
unsigned long int DATA=0,DATA_OLD=0;
int LENGTH=0; //Determines The Length Of The Char Array
char CHAR[] = "RF 315MHz";
//**************************************//
typedef struct
{ // bit field definition
//unsigned b0 : 1;
unsigned b1 : 1;
unsigned b2 : 1;
unsigned b3 : 1;
unsigned b4 : 1;
unsigned b5 : 1;
unsigned b6 : 1;
unsigned b7 : 1;
unsigned b8 : 1;
unsigned b9 : 1;
unsigned b10 : 1;
unsigned b11 : 1;
unsigned b12 : 1;
unsigned b13 : 1;
unsigned b14 : 1;
unsigned b15 : 1;
unsigned b16 : 1;
unsigned b17 : 1;
unsigned b18 : 1;
unsigned b19 : 1;
unsigned b20 : 1;
unsigned b21 : 1;
unsigned b22 : 1;
unsigned b23 : 1;
unsigned b24 : 1;
unsigned b25 : 1;
unsigned b26 : 1;
}bits;
bits bs;
//**************************************//
void Serial()
{
TXSTA=0b00100100; //BRGH = 1;
RCSTA=0b10000000;
SPBRG=103; //9600bps
}
//**************************************//
void Serial();
void TX_TEXTs(char CHAR[]);
void TX_Byte(long int);
void init(void);
void External_0();
void main()
{
init();
while(1)
{
if(FLG_RF_OK==1)
{
INTCONbits.GIE=0;
if(DATA_OLD==207)
{
PORTDbits.RD7=1;
}
if(DATA_OLD==252)
{
PORTDbits.RD6=1;
}
if(DATA_OLD==243)
{
PORTDbits.RD5=1;
}
if(DATA_OLD==63)
{
PORTDbits.RD4=1;
}
Delay10KTCYx(1);
FLG_RF_OK=0;
CNT=0;
INTCONbits.GIE=1;
}
} //while
}//main
//**************************************//
void init()
{
INTCONbits.GIE = 1; //Global Interrupt Enable
INTCONbits.PEIE = 1; //Peripheral Interrupt Enable
INTCONbits.INT0IE = 1; //External Interrupt 0 Enable
INTCONbits.INT0IF = 0; //External Interrupt Flag 0
INTCON2bits.INTEDG0=0; //Interrupt on Rising Edge
T0CON = 0b0000000;
INTCONbits.TMR0IF = 0; //Timer0 interrupt Flag
PORTBbits.RB0=0;
TRISBbits.TRISB0=1;
PORTCbits.RC6=0;
TRISCbits.TRISC6=0;
TRISC=0;
PORTC=0;
TRISD=0;
PORTD=0;
TMR0L=0;
TMR0H=0;
}
//**************************************//
//**************************************//
#pragma code HIGH_INTERRUPT_VECTOR = 0x08
void high_ISR (void)
{
_asm
goto External_0
_endasm
}
#pragma code
#pragma interrupt External_0
//**************************************//
void External_0()
{
INTCONbits.GIE=0;
T0CONbits.TMR0ON=1;
PORTCbits.RC0=1;
while(DI==0);
PORTCbits.RC0=0;
T0CONbits.TMR0ON=0;
TL = TMR0L;
TH = TMR0H;
TT = TMR0H*255 + TMR0L;
if(CNT==0)
{
if(TT>27500&&TT<32000)
{
FLG_RF=1;
CNT++;
}
}
if(FLG_RF==1&&CNT>0)
{
CNT--;
if(TT>700&&TT<1100)
{
switch(CNT)
{
case 17:bs.b17=0;break;
case 18:bs.b18=0;break;
case 19:bs.b19=0;break;
case 20:bs.b20=0;break;
case 21:bs.b21=0;break;
case 22:bs.b22=0;break;
case 23:bs.b23=0;break;
case 24:bs.b24=0;break;
C0++;
}
}
if(TT>2200&&TT<2900)
{
switch(CNT) //Because We Need Last 8 Bits Others Are Same
{
case 17:bs.b17=1;break;
case 18:bs.b18=1;break;
case 19:bs.b19=1;break;
case 20:bs.b20=1;break;
case 21:bs.b21=1;break;
case 22:bs.b22=1;break;
case 23:bs.b23=1;break;
case 24:bs.b24=1;break;
C1++;
}
}
if(CNT>24)
{
FLG_RF=0;
FLG_RF_OK=1;
DATA=DATA|bs.b24;
DATA=DATA<<1;
DATA=DATA|bs.b23;
DATA=DATA<<1;
DATA=DATA|bs.b22;
DATA=DATA<<1;
DATA=DATA|bs.b21;
DATA=DATA<<1;
DATA=DATA|bs.b20;
DATA=DATA<<1;
DATA=DATA|bs.b19;
DATA=DATA<<1;
DATA=DATA|bs.b18;
DATA=DATA<<1;
DATA=DATA|bs.b17;
DATA=DATA<<1;
DATA=DATA>>1; //Dropping Last Bit
DATA_OLD=DATA;
DATA=0;
}
CNT=CNT+2;
}
TMR0H=0;
TMR0L=0;
TL=0;
TH=0;
INTCONbits.INT0IF=0;
INTCONbits.GIE=1;
}
//**************************************//
void TX_TEXTs(char CHAR[])
{
LENGTH=0;
while(CHAR[LENGTH]!='\0')
{
TXREG = CHAR[LENGTH];
while(PIR1bits.TXIF!=1);
LENGTH++;
PIR1bits.TXIF=0;
Delay1KTCYx(20);
}
}
//**********************//
void TX_Byte(long int res)
{
int x1,x2,x3,x4,x5;
x1=res%10 +(48);
res=res/10;
while(PIR1bits.TXIF!=1);
PIR1bits.TXIF!=0;
Delay1KTCYx(50);
TXREG=13;
while(PIR1bits.TXIF!=1);
PIR1bits.TXIF=0;
}
//************************************************//