www.pudn.com > EMReader.rar > 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; 
}