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

📄 t5557.c

📁 hs4905非接触卡读卡机芯片读t5557 的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    	    	
				if(t2_max < a.W/*)&&(a.W < t2_max)*/)//1P 
    	    	{
    	            b.W>>=2;//先左移再赋值
    	            b.B.L+=0xc0;    	            
    	            i++;
    	        }
    	    	else if(t1_min < a.B.L/*)&&(a.B.L < t1_max)*/)//0.5p
    	    	{
    	    	    b.W>>=1;
    	    	    b.B.L+=0x80;    	    	   
    	    	}
    	    	else {TR0=0;TH0=TL0=0;goto read_error;}
    	   		i++;
    	   	 	while(!p_U2270B_OutPut);//上升    	  
    	    	TR0=0;a.B.H=TH0;a.B.L=TL0;TH0=TL0=0;TR0=1;    	    	
    	    	if(t2_min < a.W/*)&&(a.W < t2_max)*/)//1P 
    	    	{
    	        	b.W>>=2;
    	        	
    	        	i++;
    	    	}
    	    	else if(t1_min < a.B.L/*a.W)&&(a.B.L < t1_max)*/)//0.5P
				//else if(!(a.W==0))
    	    	{
    	    		b.W>>=1;
    	    		//temp+=0x00;
    	    		//led_light1=0;led_light=1;delay_2(40000);
    	    	}
    	    	else {TR0=0;TH0=TL0=0;goto read_error;}
    	    	i++;
    	    }
    	//取出奇位
		DATA=b.B.L;
		BIT13=BIT7;BIT12=BIT5;BIT11=BIT3;BIT10=BIT1;
		DATA=b.B.H;
		BIT17=BIT7;BIT16=BIT5;BIT15=BIT3;BIT14=BIT1;
        bankdata[j]=DATA1;
        }        
    read_ok=1;EA=ES=1;//读卡完成了
    read_error:_nop_();
    }	
}
/***************************************************/

void f_writecard(uchar x)//写卡
{
    p_U2270B_CFE=1;
	delay_2(232);  //>2.5ms       
	//psw=0 standard write
    if (x==write_command0)//写密码:初始化密码
    {
    	uchar i;
		uchar data *data p;
		p=cominceptbuff;
		p_U2270B_CFE=0;delay_2(31);//start gap>330us
    	write_bit(1);//写操作码1:10
    	write_bit(0);//写操作码0
    	write_bit(0);//写锁定位0
		for(i=0;i<35;i++)
		{
    	write_bit(1);//写数据位1
		}
		p_U2270B_CFE=1;
        led_light1=0;led_light=1;delay_2(40000);//测试使用



      	//write_block(cominceptbuff[4],p);
		p_U2270B_CFE=1;
		bankdata[20]=cominceptbuff[0];//密码存入
		bankdata[21]=cominceptbuff[1];
		bankdata[22]=cominceptbuff[2];
		bankdata[23]=cominceptbuff[3];
    }
    else if (x==write_command1)//配置卡参数:初始化
    {
    	uchar data *data p;
		p=cominceptbuff;
    	write_bit(1);//写操作码1:10
    	write_bit(0);//写操作码0
    	write_bit(0);//写锁定位0    	
      	write_block(cominceptbuff[4],p);
      	p_U2270B_CFE=1;
    }
    //psw=1  pssword mode
    else if(x==write_command2)//
    {
    	uchar data*data p;
		p=bankdata[24];
		write_bit(1);//写操作码1:10
    	write_bit(0);//写操作码0
    	write_password(p);//发口令
    	write_bit(0);//写锁定位0
    	p=cominceptbuff;
      	write_block(cominceptbuff[4],p);//写数据		
    }
    else if(x==write_command3)//aor
    {
        //cominceptbuff[1]操作码10 X xxxxxB
		uchar data *data p;
		p=cominceptbuff;
		write_bit(1);//10
        write_bit(0);    	
      	write_password(p);//密码
      	p_U2270B_CFE=1;//此时数据不停的循环传出
    }
    else //停止操作码
    {
    	write_bit(1);//11
        write_bit(1);    	
    	p_U2270B_CFE=1;    	
    }
	p_U2270B_CFE=1;
    delay_2(560);//5.6ms
}

/************************************/
void f_clearpassword()//清除密码
{
		uchar data *data p;
		uchar i,x;		
    	p=&bankdata[24];//原密码
        p_U2270B_CFE=0;delay_2(18);//start gap>150us
    	//操作码10:10xxxxxxB
    	write_bit(1);
		write_bit(0);    	   
        for(x=0;x<4;x++)//发原密码
    	{      	
            DATA=*(p++);
      	    for(i=0;i<8;i++)
    	    {
    	        write_bit(BIT0);
    	    	DATA>>=1;
      	    }
        }
        write_bit(0);//锁定位0:0
        p=&cominceptbuff[0];
        write_block(0x00,p);//写新配置参数:pwd=0        
    	//密码无效:即清除密码
    	DATA=0x00;//停止操作码00000000B
    	for(i=0;i<2;i++)
    	{
    	    write_bit(BIT7);
    	    DATA<<=1;
      	}
    	p_U2270B_CFE=1;   
        delay_2(560);//5.6ms
}
/********************************
*/
void f_changepassword()//修改密码	  	
{	
	    uchar data *data p;
		uchar i,x,addr;
    	addr=0x07;//block7
    	p=&Nkey_a[0];//原密码
    	DATA=0x80;//操作码10:10xxxxxxB
    	for(i=0;i<2;i++)
    	{
    	    write_bit(BIT7);
    	    DATA<<=1;
      	}
        for(x=0;x<4;x++)//发原密码
    	{      	
            DATA=*(p++);
      	    for(i=0;i<8;i++)
    	    {
    	        write_bit(BIT7);
    	    	DATA>>=1;
      	    }
        }
        write_bit(0);//锁定位0:0
        p=&cominceptbuff[0];
        write_block(0x07,p);//写新密码
        p_U2270B_CFE=1;
		bankdata[24]=cominceptbuff[0];//密码存入
		bankdata[25]=cominceptbuff[1];
		bankdata[26]=cominceptbuff[2];
		bankdata[27]=cominceptbuff[3];
		//
    	DATA=0x00;//停止操作码00000000B
    	for(i=0;i<2;i++)
    	{
    	    write_bit(BIT7);
    	    DATA<<=1;
      	}
    	p_U2270B_CFE=1;   
        delay_2(560);//5.6ms
}
/************T0***************/

/***************************子函数**********************************
*/
void write_bit(bit x)//写一位
{
    if(x)
    {
    	p_U2270B_CFE=1;delay_2(32);//448*11.0592/120=42延时448us
    	p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写1
    }
    else
    {
    	p_U2270B_CFE=1;delay_2(92);//192*11.0592/120=18
    	p_U2270B_CFE=0;delay_2(28);//280*11.0592/120=26写0
    }
}
/*******************写一个block*******************/
void write_block(uchar addr,uchar data *data p)
{
    uchar i,j;    
	for(i=0;i<4;i++)//block0数据
    {      	
        DATA=*(p++);
      	for(j=0;j<8;j++)
    	{
    	    write_bit(BIT0);
    	    DATA>>=1;
      	}
    }
    DATA=addr<<=5;//0地址
    for(i=0;i<3;i++)
    {
    	write_bit(BIT7);
    	DATA<<=1;
    }          	    
}
/************************************************
*/
void write_password(uchar data *data p)
{
    uchar i,j;    
	for(i=0;i<4;i++)//
    {      	
        DATA=*(p++);
      	for(j=0;j<8;j++)
    	{
    	    write_bit(BIT0);
    	    DATA>>=1;
      	}
    }    
}
/*************************中断函数**********************************
*/
void com (void) interrupt 4 using 1//串口中断,才用中断方式通讯向量地址 0x23h
{
    uchar buff;
    if (TI)
    {
		TI=0;              //发送中断标志位        
        //sendjishu++;
		if (++sendjishu==9)//使用sendjishu之前改变sendjishu
		{
	    	sendjishu=0;  //
	    	REN=1;//允许接收    
		}
		else
		{	    
	    	SBUF=comsendbuff[sendjishu];        
		}
    }
    else if(RI)
    {
		buff=SBUF;
		RI=0;	
		switch (jieshoujishu)
		{
	    	case 0: if (buff!=0xff) jieshoujishu=0;
		        else jieshoujishu=1;break;				
	    	case 1: if (buff!=0xff) jieshoujishu=0;
	            else jieshoujishu=2;break;	   
	    	case 2: if (buff==0xff) jieshoujishu=0;
	            else jieshoujishu=3;command=buff;break;	   	    	    
			case 3: if (buff==0xff) jieshoujishu=0;
	            else jieshoujishu=4;command1=buff;break;	   	    	    
	    	default: if(jieshoujishu<10)
	 	     	{
		         	cominceptbuff[jieshoujishu-4]=buff;
                 	jieshoujishu++;
					if(jieshoujishu==10) goto com;                                   
		     	}   
		     	else
		     	{   
		       com:  	com_ov=1;
			 	 	jieshoujishu=0;					
			 	 	REN=0;//不允许收,发使能		
				}break;		
		}
    }
    RI=TI=0;    
    EA=1;          //kai zhongduan
}

/*外中断0******************************************************/
void int0()  interrupt 0 using 1
{
}
/*外中断1-----------------------------------------------------*/
void int1()  interrupt 2 using 1
{
}
/*定时器0----------25ms---------------------------------------*/
void time0() interrupt 1 using 1
{
	
}
/*定时器1----------波特率-------------------------------------*/
void time1() interrupt 3 using 1
{
}
/*******************end***********************************************/

⌨️ 快捷键说明

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