⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reader.c

📁 很强的射频卡reader源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			des_offset[1]=cmd_buffer[5];
			des_offset[2]=cmd_buffer[6];
			des_read_len=cmd_buffer[7];
			deskey_address=key_buffer+cmd_buffer[8]*32;
			read_Flash(deskey_address,select_key,17);
//			des_key_no=select_key[16];
			//des_key_index=u_ram.host.RxBuffer[15];

			
		
//=======================================================================
	read_Flash(S_WIEGAND_MODE,&u_ram.host.RxBuffer[0],10);	
	if (u_ram.host.RxBuffer[4] != 0x55 ||u_ram.host.RxBuffer[5] != 0xAA)
	{
		Initialwiegand();	//初始化wiegand 配置
	}
	else	
	{
			wiegand_mode	=	u_ram.host.RxBuffer[0];	//WIEGAND输出格式
			wiegand_block	=	u_ram.host.RxBuffer[1];	//读MIFARE块号
	   		wiegand_requst	=	u_ram.host.RxBuffer[2];	//请求模式
			weigandFlag  	=	u_ram.host.RxBuffer[3];	//IO 输出模式
								//u_ram.host.RxBuffer[4];		//0x55
								//u_ram.host.RxBuffer[5];		//0xaa
			key_outmode  	=	u_ram.host.RxBuffer[6];		//key mode
			csn_outmode  	=	u_ram.host.RxBuffer[7];		//csn mode	
			iso15693block	=	u_ram.host.RxBuffer[8];
	}
//=======================================================================
 
  	Wei_D0=HIGH; 
	Wei_D1=HIGH;
	CP	  =HIGH;
//	WDTD=0x87; WDTC=0x1F;		//set watchdog timer,3s	
	DecodeFlag=0;
	DlyforWiegand = 0;


	while(1)
	{
  
//	for(i=0;i<8;i++)
//		card_buffer[i]=i;
	 

	
			   

//		WDTD=0x87;
//		WDTC=0x1F;	//Reset watchdog timer
 		if(DecodeFlag)
     	{
		    SEQ=u_ram.host.RxBuffer[0];
			if ((SlaveADR==u_ram.host.RxBuffer[1])||(u_ram.host.RxBuffer[1]==0))   //设备地址判断
				funtions();				
				DecodeFlag=0;
		}		/*end of check DecodeFlag*/

		if(weigandFlag & 0x10)
		{	

			weigand();
			key_bcdweigand();
		}
		else	KeyBuffer_Manage();	

	}			/*forever loop */
} // End Main BLock

//  键盘缓冲区管理
void KeyBuffer_Manage(void)
{
	unsigned char temp,i;
	temp=getkey();
	if (temp!=0)
	{	
//		for (i=0;i<35;i++)
		for (i=0;i<10;i++)
		KeyBuffer[i]=KeyBuffer[i+1];
//		KeyBuffer[34]=temp;
		KeyBuffer[9]=temp;

		LCD_PWR=ON;

		Buzzer = ON;
		delay_1ms(200);		
		Buzzer = OFF;

	}
	delay_1ms(3);
}
/*
void KeyBuffer_Manage(void)
{	
	unsigned char i;
	key_temp=getkey();
	if(key_temp!=0)
	{
		SecondCNT_t1=0;
		LCD_PWR=ON;
		if(key_temp=='*') 
			{
				for (i=0;i<35;i++)
					KeyBuffer[i]=0;
				key_i=0;
			}
		else if(key_temp=='#')
		{
			if(key_i>0)
			{
				SendNumber(key_i,KeyBuffer);
				for (i=0;i<35;i++)
					KeyBuffer[i]=0;
				key_i=0;
			}
		}
		else
		{
			KeyBuffer[key_i]=key_temp;
			key_i++;
			if(key_i>35)
				key_i=0;	
		}
		//Display_Flag=1;	
		
		if(csn_outmode&0x04)
		{
			Buzzer = ON;
			delay_1ms(200);		
			Buzzer = OFF;
		}	

	}
	delay_1ms(3);
}
*/



void getkeys(void)
{
	unsigned char i,l;
//		for (i=0;i<35;i++)
		for (i=0;i<10;i++)
		{
	 		if (KeyBuffer[i]!=0) break;
		}
//		l=35-i;	
		l=10-i;	
		TxOut(l,0,&KeyBuffer[i]);	


//		for (i=0;i<35;i++)
		for (i=0;i<10;i++)
 		KeyBuffer[i]=0;
}

void Initial(void)
{ 
	unsigned char i;
	AUXR =	0x01;	 
	P1    = 0xFF;  
	Buzzer= ON;	
	LED_R = OFF;
	LED_G = ON;
//	P4=P4&0xF7;
	P4=P4|0x08;
	IE    = 0 ;	
	IP    = 0x11;
	IE    = 0x9A;

//	TH0	= 0x3c;
//	TL0	= 0x60;		//20ms
	TH0	= 0x28;
	TL0	= 0x00;		//20ms

//	IT0	= 1;			/*Falling edge active */
//	IT1	= 1;        /*Falling edge active */	
	TR0	= 1;
	TL1=0;
	TH1=1;
	TR1=1;
	TxFlag1 = 0;
//	for (i=0;i<35;i++)
	for (i=0;i<10;i++)
		KeyBuffer[i]=0;
	XICON=0x50;
	PX3=1;
}

//-------------------------------------------------------------------------------------------------------
// This function for setting baud rate generate
// Parameter 9600bps=96  19200bps=192 38400bps=384 57600bps=576 115200bps=1152
//-------------------------------------------------------------------------------------------------------
void InitialUART(unsigned char baudRate)
{
	int BaudRate;
	switch(baudRate)
	{
	   	case 1:BaudRate=96;
     	break;
     	case 2:BaudRate=192;
     	break;
     	case 3:BaudRate=384;
     	break;
     	case 4:BaudRate=576;
     	break;
     	default:BaudRate=1152;
	}
	SCON = 0X50;        /*Serial mode : 8 data 1 start bit & 1 stop bit */
	TMOD = 0X01;        /* Timer 0 set  to 16 bits timer */
	RCAP2H=0xFF;
	RCAP2L=256-(6912/BaudRate*6/2);      //22.1184 MHz/32=691200  for 12 clock              
	T2CON=0x34;	                    //Set baud rate generate auto reload from timer 2  
	RS485=0;
}

void Initialwiegand (void)
{
	u_ram.host.RxBuffer[0]	=	s_weigand_26;
	wiegand_mode		=	s_weigand_26;
	u_ram.host.RxBuffer[1]	=	0;
	wiegand_block		=	0;

	u_ram.host.RxBuffer[2]	=	R_idle;
	wiegand_requst		=	R_idle;
	u_ram.host.RxBuffer[3]	=	0X13;
	weigandFlag			=	0X13;

	u_ram.host.RxBuffer[4]	=	0x55;
	u_ram.host.RxBuffer[5]	=	0xaa;

	u_ram.host.RxBuffer[6]	=	0;		//key out format
	key_outmode			=	1;
	u_ram.host.RxBuffer[7]	=	0X06;		//csn direct
	csn_outmode			=	0X06;
	u_ram.host.RxBuffer[8]	=	0XFF;	//r
	iso15693block		=	0XFF;
	u_ram.host.RxBuffer[9]	=	0;		//r
	
	write_Flash(S_WIEGAND_MODE,&u_ram.host.RxBuffer[0],10);
}

//--------------------------------------------------------------------------------------------------------
//22.1184MHz delay 20ms TH0= x70 TL0=00  1sec= 50 interrups
void Timer0(void) interrupt 1 using 1
{    
	TH0=0X28;
	delay_times++;
	if (delay_times==2)
	{
		delay_times=0;
	}
	else return;




//weigand 超时处理
	if (wtimeoutw)   			
	{
		wtimeoutw--;
		TW_flag=0;	

	}
	else 
	{
		
		TW_flag=1;
		int0bitptr=0;

	}

//------------------Start of check receiver time out 
	if(!DecodeFlag)
	{
		if(Rec_Status)  //The Rec_Status != 0 in received mode then check byte time out
		{
			Regetrc500EEPROMTimeOut--;
			if(Regetrc500EEPROMTimeOut==0)Rec_Status=0; //if time out error then reset Rec_Status to re_synchronous
		}
	}
//------------------End of check receiver time out 
	if(TxFlag)
	{
		Regetrc500EEPROMTimeOut--;
     	if(Regetrc500EEPROMTimeOut==0)
		{
	   		ETX_Pointer=0;
	    	STX_Pointer=0; 
  		}
	}

	if (DlyforWiegand)	DlyforWiegand--;

	SecondCNT++;
  	switch(SecondCNT)//***********************Start SecondCNT switch decode
	{
	  	case 50 : 
			SecondCNT=0;		//	One second 
// 			CheckTimeOutIO(); //	Now to check I/O ports time out
            
			if(RedLED_Flag)	//**************Start red LED routine
			{
				LED_R=ON; //ON Red LED
 				if(NumPeriodLED_R != 0xFF)
				{
            			if(NumPeriodLED_R == 0)
					{
				 		RedLED_Flag=0;
				  		LED_R=OFF;	//OFF red LED 
					}
				    	NumPeriodLED_R--; 			  
			 	}
			}						//**************************End of red LED routine

			if(GreenLED_Flag)	//**************Start green LED routine
			{
				LED_G=ON; //ON green LED
			  	if(NumPeriodLED_G != 0xFF)
 		      	{
                	if(NumPeriodLED_G == 0)
			 	{
			  		GreenLED_Flag=0;
				  		LED_G=OFF;	//OFF green LED 
			 	}
			   	NumPeriodLED_G--; 
			    }
			}	//**************************End of green LED routine

		case 5	:	case 10 :     
		case 15	: 	case 20 :
		case 25	:	case 30 :  
		case 35	:	case 40 :  
		case 45 :   
    		if(BuzFlag)
     	{
   			Buz_CNT++;
   			switch(Buz_Step)
    			{
	     		case 0:
      			if(Buz_CNT >=Buz_T1)
       			{
        				Buzzer=OFF;Buz_Step=1;		//OFF
        				Buz_CNT=0x00;
       			}
      			else Buzzer=ON;	//ON 
     			 break;
	     
	     		case 1://OFF Status
      			if(Buz_CNT >=Buz_T2)
       			{
        				Buz_CNT=0xFF;Buz_Step=2;        				
        				if(Buz_T3)Buzzer=ON; //ON 
       			}
     			break;
	     
	     		case 2://ON  status
      			if(Buz_CNT >=Buz_T3)
       			{
        				Buzzer=OFF;	Buz_Step=3;	//OFF
        				Buz_CNT=0xFF;        				
       			}
      			else Buzzer=ON;	//ON 
     			break;
	     
	     		case 3:
      			if(Buz_CNT >=Buz_T4)
       			{
        				Buzzer=OFF;	Buz_Step=0;	//OFF
        				Buz_CNT=0xFF;        				
        				Buz_Period--;
        				if(Buz_Period == 0x00)	BuzFlag=0;
       			}
        
	       	}	//end of switch Buz_Step
		}		//end of if BuzFlag
	}			//*************************End of SecondCNT switch decode
	if(RedLED_Flag && (SecondCNT == DutyTimeLED_R))LED_R=OFF;    //OFF LED
	if(GreenLED_Flag && (SecondCNT == DutyTimeLED_G))LED_G=OFF; //OFF LED
}

//22.1184MHz delay 25ms (19456)TH1= x70 TL0=00  1sec= 50 interrups
void Timer1(void) interrupt 3 using 2
{
//	WDTD=0x87;
//	WDTC=0x1F;	//Reset watchdog timer
//	TMOD = 0x11;
//	IE=0x98;
	TH1=00;
	TL1=00;

	SecondCNT_t1++;
	C_ext_CNT--;

	if(C_ext_CNT==0)
	{
		if(C_ExtFlag==1)
		{
//			P4=P4&0xF7;
			P4=P4|0x08;

		}

	}
		
	if(SecondCNT_t1>2000)
	{
		LCD_PWR=OFF;
		if (Display_Flag)
		{		
			DisplayLcd(cls,16,0x00);	
			DisplayLcd(display1,16,0x00);	
			DisplayLcd(cls,16,0x40);
			DisplayLcd(display4,16,0x40);
			Display_Flag=0;
		}
	}
} 	

void int0(void) interrupt 0 //外部中断
{
}

void int1(void) interrupt 2
{
}
//---------------------------------------------------------------------------------------------------------
// The serial interrupt function provide receiver and transmiter cases
// Receiver case perform received host package data. 
// When received ETX code and BCC is sucss then set DecodFlag.
// Transmiter case handle data transmitted. To transmit data before will send STX to SBUF and set TxFlag. 
// And then call CheckControlCode rountin to fill data to TxBuffer. 
// Transmitted at last data will auto reload ETX code to SBUF.
//---------------------------------------------------------------------------------------------------------
void CommPC(void) interrupt 4 using 3
{
	
	Regetrc500EEPROMTimeOut=C_UART_TimeOut;        //set byte time out value. The time count down at timer 0 

  	if (RI == 1)
	
	 //---------------------------start received 
  	{
		if (RD2IDLEFlag) {RD2IDLEFlag=0;}	
	  	RI = 0;
   		if(!DecodeFlag) //DecodeFlag used for protect RxBuffer data. 
   		{ 
        	switch(Rec_Status)
		{
     		case 0: 
				if(SBUF == STX) //check the starting code of a package
          		{
           			ReceivCNT = 0;
           			CheckSum=0;
           			Rec_Status=1; 				  
				}
    			break;   

    			case 1: 
	         		if(ReceivCNT >= u_ram.host.RxBuffer[3] + 5 ) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -