#include <16f628a.h>
#fuses XT,NOPROTECT,NOCPD,NOBROWNOUT,NOPUT,NOWDT,NOLVP
#use delay(clock=4000000, internal)
#use rs232(baud=600, xmit=pin_B2, rcv=pin_B1,ERRORS)
char c,a,i,dec,dec1,dec2,enc,pattern,son;
char nib[6]; //
char x;
#define data PIN_A0
#define clock PIN_A1
#define Strobe PIN_A2
#include <lcd4094.c>
void gotit()
{
output_high(pin_b5);
delay_ms(100);
output_low(pin_b5);
delay_ms(100);
output_high(pin_b5);
delay_ms(100);
output_low(pin_b5);
delay_ms(100);
output_high(pin_b5);
delay_ms(100);
output_low(pin_b5);
}
BYTE DECODE_DATA() //decode function for machester encoded data. This code is working fine. I checked it.
{
for (i=0; i<7; i++)
{
nib[i] = c;
}
enc = nib[0];
//printf(lcd_putc,"%X",c);
printf(lcd_putc,"%X",nib[0]);
if (enc == 0xF0) // start/end condition encountered
return 0xF0;
enc = nib[0];
dec = 0;
for (i=0; i<4; i++) {
dec >>=1;
pattern = enc & 0b11;
if (pattern == 0b01) // 1
bit_set(dec,3);
else if (pattern == 0b10)
bit_clear(dec,3); // 0
else
return 0xff; // illegal code
enc >>=2;
dec1=dec;
}
enc = nib[1];
dec = 0;
for (i=0; i<4; i++) {
dec >>=1;
pattern = enc & 0b11;
if (pattern == 0b01) // 1
bit_set(dec,3);
else if (pattern == 0b10)
bit_clear(dec,3); // 0
else
return 0xff; // illegal code
enc >>=2;
dec2=dec;
}
enc = nib[0];
if (enc == 0xF0) // start/end condition encountered
return 0xF0;
dec2<<=4;
son=dec1|dec2;
x=0;
dec=0;
dec1=0;
dec2=0;
gotit();
return (son);
}
#int_rda
void komut_al() //interrupt for receiving manchester coded data
{
x=1;
disable_interrupts(int_rda);
c=getc();
}
void main()
{
x=0;
nib[0]=0;
nib[1]=0;
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
lcd_init();
while(true)
{
if (x==1)
{
x=0;
a=DECODE_DATA();
//printf(lcd_putc,"%X",a);
//delay_ms(500);
//lcd_putc('\f');
if (a==0x41)
{
output_high(pin_b4);
}
if (a==0x53)
{
output_low(pin_b4);
}
enable_interrupts(int_rda);
}
//delay_ms(1000);
//lcd_putc('\f');
}
}
/*
*/