define IC PINB.0 // вход с компаратора
unsigned long Card; // номер карты
unsigned char Group;// групповой код
unsigned char r_buffer[12];
char getbit(void)
{
char tmp_inp;
char b;
tmp_inp=IC;
while (tmp_inp==IC) delay_us(1);
b=IC;
delay_us(354);// 0.75 T 384
if (b==1) b=0;
else b=1;
return (b);
}
unsigned int get_rfid1(void)
{
unsigned char parity=0;
unsigned char in=0;
unsigned char r_n=0;
unsigned char i=0;
unsigned char cnt_rx=0;
unsigned char data=0;
unsigned char state=1;
for (;;)
{
if (state) // здесь ловим преамбулу 9 единиц
{
if(getbit()) cnt_rx++;
else cnt_rx=0;
if (cnt_rx ==9 )
{
cnt_rx =0;
state=0;
}
}
else // принимаем пакет
{
in= getbit(); // примем бит
cnt_rx++;
if (cnt_rx==55) // принят последний бит
{
if (in) return 2; // если не STOP бит - ошибка
data = data >>1;
// здесь проверяем паритет столбцов
r_n=1; // mask
parity=0;
for(in=0;in<4;in++)
{
for(i=0;i<10;i++) parity^= (r_buffer[i]&r_n); // columns
parity^=(data & r_n);
if (parity) return 2;// ошибка паритета column[in]
r_n=r_n<<1;
}
Group=r_buffer[0]; // групповой код
Group=Group <<4;
Group=Group + r_buffer[1];
for(i=2;i<10;i++) // считаем номер карты в перемменную типа UNSIGNED LONG
{
Card=Card <<4;
Card=Card + r_buffer[i];
}
return 1; //OK
}
parity^=in; // вычисляем паритет row[i]
if (r_n==4) // пятый бит
{
if (parity) return 2;// ошибка паритета row[i]
data = data >>1;
r_buffer[i]= data;
i++;
r_n=0; //
data=0;
}
else
{
data=data | in; // принятый бит в младший разряд
data=data << 1; // сдвигаем в старшие разряды
r_n++;
}
}
if (fl_esc != 0) return(0);
}
}
unsigned int get_card(void)
{
while (get_rfid1()==2);
if (fl_esc != 0) return(0);
return(1);
}