📄 em4100.c
字号:
// em4100.c
// for mp-198
// code size 188 word
// 135 lines
// 2005.09.24 代码优化
//===============================
void Read_em4100(void)//读em4100卡
{
if (emsign_in==hight)
{
if (emflag.oldlevel==hight) return; //信号无变化,结束处理
else emflag.bitdata=0;//上升沿信号
}
else
{
if (emflag.oldlevel==low) return; //信号无变化,结束处理
else emflag.bitdata=1;//下降沿信号
}
emflag.oldlevel ^= 1; //信号线电平记忆
// 信号宽度判别
{
if ((TMR0<pw_min)||(TMR0>pw_max))
{
TMR0=0;
em_error();
return ;//信号太窄或太宽,错误!结束处理
}
else
{ //emflag.bitover=false;
if (TMR0<pw_mid)
{
return ;//信号宽度不足一个bit的宽度,退出,等待下个脉冲一起处理
}
else
{
TMR0=0;//定时器重新计数
}
}
}
//
// tmr20ms_over=false;
switch (em_step)
{
case 0:
{
receive_em_bits();
if ((em_bits>=9)&&((emdata._int&0x3ff)==0x1ff))
{
em_bits=0;
em_step=1;
em_parity.me=0;
em_cunt=0;
emdata._byte=0;
em_parity.me=0;
}
break;
}
case 1:
{
receive_em_bits();
if (em_bits==4)
{
em_bits=0;
em_parity.me ^= (emdata._byte&0x0f);
em_cunt++;
em_step=2;
}
break;
}
case 2:
{
if (((emflag.bitdata)&&(em_parity.b._7))||((!emflag.bitdata)&&(!em_parity.b._7)))
{
em_parity.b._7=0;
if (em_cunt<10)
{
em_step=1;
}
else
{
em_step=3;
}
}
else
{
em_error();
}
break;
}
case 3:
{
em_parity.me <<= 1;
em_parity.b._0 |= emflag.bitdata;
em_bits++;
if (em_bits==4)
{
asm ("swapf _em_parity,w");
asm ("xorwf _em_parity,f");
if (ZERO)
{
tmr_card=0;
if (((emdata.me!=card_temp)||(emflag.beoff)))
{
b_readcard_ok=true;
}
ndata.me=emdata.me;
card_temp=ndata.me;
b_data_type=1;
emflag.beoff=false;
}
em_bits=0;
em_step=0;
emdata._byte=0;
}
break;
}
}
}
//================================================================
void receive_em_bits()
{
emdata.me <<=1;
if (emflag.bitdata)
{
emdata._byte |=1;
em_parity.b._7 ^= 1;
}
em_bits++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -