📄 emreader.c
字号:
#include "common.h"
extern void SerialInit();
extern void SerialSend(BYTE SendCode);
extern BOOL SerialRece(BYTE *SBuf);
//extern void delay(unsigned int iDelay);
extern void delay_100us();
extern void delay_48us();
extern void delay_36us();
extern void TimerInit();
extern unsigned int GetTimerCount();
extern unsigned char rlc(unsigned char rc_Byte);
unsigned char GetOneBitNum(unsigned char buf,unsigned char from,unsigned char end);
sbit InPin = P3^7;
sbit ModePin = P1^7;
sbit Dat1 = P3^0;
sbit Dat2 = P3^1;
main()
{
BYTE row,col,buffer;
BYTE bitFlag[5];
BYTE bitCount[4];
BYTE ID[5];
BOOL bBuf;
BOOL bErrFlag = FALSE;
BOOL bHeaderFlag = FALSE;
BOOL bFirstBit,bEndBit;
SerialInit();
TimerInit();
EA = 1;
while(1)
{
//get the header
bErrFlag = FALSE;
if(bHeaderFlag == FALSE)
{
while(InPin == 0);
GetTimerCount();
TR0 = 1;
while(InPin == 1);
if(GetTimerCount() < 150) continue; //300us
}
while(InPin == 0); // header 1 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 2 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 3 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 4 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 5 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 6 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 7 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
while(InPin == 0); // header 8 end
if(GetTimerCount() > 150)
{
bHeaderFlag = FALSE;
continue;
}
while(InPin == 1);
if(GetTimerCount() > 150)
{
bHeaderFlag = TRUE;
continue; //300us
}
// while(InPin == 0); // header 9 end
bHeaderFlag = FALSE;
TR0 = 0;
delay_100us();
delay_100us();
//data
bitCount[0] = 0;
bitCount[1] = 0;
bitCount[2] = 0;
bitCount[3] = 0;
for(row = 0; row < 11; row++)
{
buffer = 0;
for(col = 0; col < 5; col++)
{
delay_100us();
bBuf = InPin;
TL0 = 0;
TH0 = 0;
TR0 = 1;
while(bBuf == InPin); //100us
if(GetTimerCount() > 100)
{
bErrFlag = TRUE;
break;
}
if(col < 4) delay_100us();
if(bBuf)
{
buffer++;
bitFlag[col] = 1;
}
else bitFlag[col] = 0;
if(col < 4)
{
if(bitFlag[col]) bitCount[col]++;
}
else if((col == 4) && ((buffer%2) != 0))
{
if(row != 10) bErrFlag = TRUE;
break;
}
}//for col end
if(bErrFlag) break;
if(row == 10) break;
if((row%2) == 0)
{
if(bitFlag[0]) ID[row/2] |= 0x80;
else ID[row/2] &= 0x7f;
if(bitFlag[1]) ID[row/2] |= 0x40;
else ID[row/2] &= 0xbf;
if(bitFlag[2]) ID[row/2] |= 0x20;
else ID[row/2] &= 0xdf;
if(bitFlag[3]) ID[row/2] |= 0x10;
else ID[row/2] &= 0xef;
}
else
{
if(bitFlag[0]) ID[row/2] |= 0x08;
else ID[row/2] &= 0xf7;
if(bitFlag[1]) ID[row/2] |= 0x04;
else ID[row/2] &= 0xfb;
if(bitFlag[2]) ID[row/2] |= 0x02;
else ID[row/2] &= 0xfd;
if(bitFlag[3]) ID[row/2] |= 0x01;
else ID[row/2] &= 0xfe;
}
}//for row end
if(bErrFlag) continue;
if((bitCount[0]%2) != 0) continue;
if((bitCount[1]%2) != 0) continue;
if((bitCount[2]%2) != 0) continue;
if((bitCount[3]%2) != 0) continue;
// Get ID OK
if(ModePin)
{
buffer = GetOneBitNum(ID[2],0,7);
buffer += GetOneBitNum(ID[3],0,3);
if((buffer%2) == 0) bFirstBit = 0;
else bFirstBit = 1;
buffer = GetOneBitNum(ID[3],4,7);
buffer += GetOneBitNum(ID[4],0,7);
if((buffer%2) == 0) bEndBit = 1;
else bEndBit = 0;
if(bFirstBit)
{
Dat2 = 0;
delay_48us();
Dat2 = 1;
}
else
{
Dat1 = 0;
delay_48us();
Dat1 = 1;
_nop_();
_nop_();
}
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_48us();
delay_36us();
for(row = 0; row < 3; row++)
{
buffer = ID[row+2];
for(col = 0; col <8; col++)
{
buffer = rlc(buffer);
if(CY)
{
Dat2 = 0;
delay_48us();
Dat2 = 1;
}
else
{
Dat1 = 0;
delay_48us();
Dat1 = 1;
_nop_();
_nop_();
}
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_48us();
if(col == 7)
{
_nop_();
_nop_();
_nop_();
}
else delay_36us();
}
}
delay_36us();
if(bEndBit)
{
Dat2 = 0;
delay_48us();
Dat2 = 1;
}
else
{
Dat1 = 0;
delay_48us();
Dat1 = 1;
_nop_();
_nop_();
}
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
}
else
{
SerialSend(ID[0]);
SerialSend(ID[1]);
SerialSend(ID[2]);
SerialSend(ID[3]);
SerialSend(ID[4]);
}
}
}
unsigned char GetOneBitNum(unsigned char buf,unsigned char from,unsigned char end)
{
unsigned char i;
unsigned char result = 0;
i = from;
while(i--)
{
buf = rlc(buf);
}
for(i = from; i < end+1; i++)
{
buf = rlc(buf);
if(CY) result++;
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -