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

📄 reader.c

📁 磁条卡解码芯片M220的底层驱动汇编程序
💻 C
字号:
#include "nucleus.h"
#include "uart_defs.h"
#include "Reader.h"
#include "Key.h"

#define HISR_STACK_SIZE    4096

//extern VOID ERC_System_Error(INT error_code);
NU_TIMER	track2_show;
NU_TIMER	track3_show;

extern NU_MEMORY_POOL  System_Memory;
extern NU_TIMER        Rekey_interval;
NU_HISR        TRA2_HISR;
NU_HISR        TRA3_HISR;
CHAR Track_2[60];
CHAR Track_3[120];
CHAR Track_2_Back[60];
CHAR Track_3_Back[120];
CHAR Show_Track2[40];
CHAR Show_Track3[120];
//INT Track2_Count=0;
//INT Track3_Count=0;
//INT Track2_Back_Count=0;
//INT Track3_Back_Count=0;

int a=0;                   //轨2buffer的计数器
int b=0;                   //轨3buffer的计数器


NU_EVENT_GROUP 		Event_Group_ReadCard;
NU_EVENT_GROUP		Event_Group_KeyDown;


CHAR * ADD2, *ADD3,*track2,*track3,*KEYOUT;

INT LR_Track2=1;
INT LR_Track3=1;

VOID Demo_CardRead(VOID)
{
INT i=0;
CHAR temp1=0,temp2=0,temp3=0,temp4=0,flag_track2=0,flag_track3=0;
VOID *pointer;
STATUS status;
unsigned readcard_flags;
CHAR data1[20];
CHAR data2[20];

	status =NU_Create_Timer(&track2_show,"show_track2",ShowTrack2,0,2000,2000,NU_DISABLE_TIMER);
	status =NU_Create_Timer(&track3_show,"show_track3",ShowTrack3,0,2000,2000,NU_DISABLE_TIMER);
	
	for(i=0;i<20;i++)
	{
		data1[i] = 0x00;
		data2[i] = 0x00;
	}
	for(i=0;i<40;i++)
	{
		Show_Track2[i] = 0x00;
	}
	
	for(i=0;i<120;i++)
	{
		Show_Track3[i] = 0x00;
	}

	NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
	track2 = (CHAR*)pointer;
	NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
	track3 = (CHAR*)pointer;
	memset(track2,0,2048);
	memset(track3,0,2048);
	
	CardReader_Int();
	
	for(i=0;i<70000;i++);
	
	NU_Retrieve_Events(&Event_Group_ReadCard, 0x11, NU_OR_CONSUME, &readcard_flags, NU_SUSPEND);     
	while(!( *(RP)PORTC_DATA & ( CP_low ) ) );
	
	for(i=0;i<70000;i++);
	
	temp1 = BACKTRACK2(track2,a);
    temp2 = BACKTRACK3(track3,b);
	temp3 = FORWARDTRACK2(track2,a);
	temp4 = FORWARDTRACK3(track3,b);
	
	if((temp1!=ERROR)||(temp3!=ERROR))
		flag_track2 = Track2();
	else
		flag_track2 = ERROR;
	
	if((temp2!=ERROR)||(temp4!=ERROR))
		flag_track3 = Track3();
	else
		flag_track3 = ERROR;	
	
	LcdClear();
	switch(flag_track2)
	{
		case TRACK2FORWARD:
			
			LcdTextString(0,0,"track2数据正确!");
			ChangeTrack2(Track_2);
			memcpy(data1,Show_Track2,20);
			LcdTextString(0,13,data1);
			NU_Control_Timer(&track2_show,NU_ENABLE_TIMER);
			break;
		
		case TRACK2BACK:
			
			LcdTextString(0,0,"track2数据正确!");
			ChangeTrack2(Track_2_Back);
			memcpy(data1,Show_Track2,20);
			LcdTextString(0,13,data1);
			NU_Control_Timer(&track2_show,NU_ENABLE_TIMER);
			break;
		
		case ERROR:
			
			LcdTextString(0,0,"track2数据错误!");
			break;
			
		default:
			break;
	}
	switch(flag_track3)
	{
		case TRACK3FORWARD:
			
			LcdTextString(0,26,"track3数据正确!");
			ChangeTrack3(Track_3);
			memcpy(data2,Show_Track3,20);
			LcdTextString(0,39,data2);
			NU_Control_Timer(&track3_show,NU_ENABLE_TIMER);
			break;
		
		case TRACK3BACK:
			
			LcdTextString(0,26,"track3数据正确!");
			ChangeTrack3(Track_3_Back);
			memcpy(data2,Show_Track3,20);
			LcdTextString(0,39,data2);
			NU_Control_Timer(&track3_show,NU_ENABLE_TIMER);
			break;
		
		case ERROR:
			
			LcdTextString(0,26,"track3数据错误!");
			break;
		
		default:
			break;
	}
	
	status = NU_Deallocate_Memory(track2);	
	status = NU_Deallocate_Memory(track3);
}



CHAR ChangeData(CHAR data)
{
	data &= (~0x10);
	data = data + 0x30;
	return data;
}

VOID ChangeTrack2(CHAR *track)
{
INT i=0;
CHAR data=0x00;

	for(i=0;i<40;i++)
	{
		data =  ChangeData(*(track+i));
		Show_Track2[i] = data;
		data = 0x00;
	}
} 	

VOID ChangeTrack3(CHAR *track)
{
INT i=0;
CHAR data=0x00;

	for(i=0;i<120;i++)
	{
		data =  ChangeData(*(track+i));
		Show_Track3[i] = data;
		data = 0x00;
	}
}



VOID ShowTrack2()
{
CHAR data[20];
//INT i=0;
	
	if(LR_Track2==2)
		LR_Track2 = 0;
	memcpy(data,Show_Track2+LR_Track2*20,20);
	LcdAreaClear(0,13,130,13);
	LcdTextString(0,13,data);
	LR_Track2 ++;
}		
	
VOID ShowTrack3()
{
CHAR data[20];
//INT i=0;

	if(LR_Track3==4)
		LR_Track3 = 0;
	memcpy(data,Show_Track3+LR_Track3*20,20);
	LcdAreaClear(0,39,130,13);
	LcdTextString(0,39,data);
	LR_Track3 ++;
}




VOID CardReader_Int( VOID )
{
VOID 		   (*old_lisr)(INT);
VOID           *pointer;
STATUS         status;
//unsigned 	   readcard_flags;		 
//CHAR	p=0,q=0;
INT     i=0;
//CHAR 	m=0,n=0;


	//mask_all_irq();
	//*(RP)T1CR |= 0X04;
	//*(RP)T1CR &= (~0X01);
	
	NU_Create_Event_Group(&Event_Group_ReadCard,"BRUSH_CARD");
	
	for(i=0;i<60;i++)
	{
		Track_2[i] = 0x00;
	}
	
	for(i=0;i<120;i++)
	{
		Track_3[i] = 0x00;
	}
	
	for(i=0;i<60;i++)
	{
		Track_2_Back[i] = 0x00;
	}
	
	for(i=0;i<120;i++)
	{
		Track_3_Back[i] = 0x00;
	}
	
	
	*(RP)PORTC_SEL |= 0X0E;
	*(RP)PORTC_DIR |= 0X0E;
	//*(RP)PORTC_DATA |= 0X00;                 
	
	
	*(RP)PORTE_SEL |= 0x0060 ; //0x00F0 ;       
	*(RP)PORTE_DIR |= 0x0060 ;	     //1 stands for in	
	*(RP)PORTE_INTRCTL |= 0x3c000;   //中断类型为低电平解发  
	*(RP)PORTE_INCTL |= 0x0060;      //中断输入方式
	*(RP)PORTE_INTRCLR |= 0x0060;
	*(RP)PORTE_INTRCLR = 0x0000;     //清除中断
	
	
	
	
	mask_irq( Track2_irq );
	mask_irq( Track3_irq );
	
	status=NU_Register_LISR(Track3_irq, Track3_int, &old_lisr);
	status=NU_Register_LISR(Track2_irq, Track2_int, &old_lisr);
	
	NU_Allocate_Memory(&System_Memory, &pointer,HISR_STACK_SIZE, NU_NO_SUSPEND);
	status = NU_Create_HISR(&TRA2_HISR,"HISR_TRA2",TRA2_HISR_ENTRY,2,pointer,400);
	if (status != NU_SUCCESS)
    {
        ERC_System_Error(status);
    }
   
	NU_Allocate_Memory(&System_Memory, &pointer,HISR_STACK_SIZE, NU_NO_SUSPEND);
	status = NU_Create_HISR(&TRA3_HISR,"HISR_TRA3",TRA3_HISR_ENTRY,2,pointer,400);
	if (status != NU_SUCCESS)
    {
        ERC_System_Error(status);
    }
    
	//NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
	//track2 = (CHAR*)pointer;
	//NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
	//track3 = (CHAR*)pointer;
	//memset(track2,0,2048);
	//memset(track3,0,2048);
	
	ADD2 = track2;
	ADD3 = track3;
	
	irq_enable( Track2_irq );
	irq_enable( Track3_irq );
	unmask_irq( Track2_irq );
	unmask_irq( Track3_irq );
	
	for(i=0;i<70000;i++);
	
}

VOID TRA2_HISR_ENTRY ( VOID )
{

	if(!( *(RP)PORTC_DATA & ( CP_low ) ) )
	{
		*ADD2=(CHAR)(*(RP)PORTC_DATA & 0x02 );
		ADD2++;
		a++;
		NU_Set_Events(&Event_Group_ReadCard, 0x01, NU_OR );
	}
}

VOID TRA3_HISR_ENTRY ( VOID )
{

	if(!( *(RP)PORTC_DATA & ( CP_low ) ) )
	{
		*ADD3=(CHAR)(*(RP)PORTC_DATA & 0x04) ;
		ADD3++;
		b++;
		NU_Set_Events(&Event_Group_ReadCard, 0x01, NU_OR );
	}
}

VOID Track3_int ( INT Vector )
{	

	NU_Activate_HISR(&TRA3_HISR);
	*(RP)PORTE_INTRCLR |= 0x0040;
	*(RP)PORTE_INTRCLR = 0x0000;
}


VOID Track2_int ( INT Vector )
{
	NU_Activate_HISR(&TRA2_HISR);
	*(RP)PORTE_INTRCLR |= 0x0020;
	*(RP)PORTE_INTRCLR = 0x0000;

}

CHAR Track2(VOID)
{
CHAR temp=0x00;
	
	temp = Check_Track2_Forward();
	if(temp!=ERROR)
		return TRACK2FORWARD;
	else
	{
		temp = Check_Track2_Back();
		if(temp!=ERROR)
			return TRACK2BACK;
	}
	if(temp==ERROR)
		return ERROR;
}

CHAR Track3(VOID)
{
CHAR temp=0x00;
	
	temp = Check_Track3_Forward();
	if(temp!=ERROR)
		return TRACK3FORWARD;
	else
	{
		temp = Check_Track3_Back();
		if(temp!=ERROR)
			return TRACK3BACK;
	}
	if(temp==ERROR)
		return ERROR;
}



CHAR Check_Track2_Forward(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
	
	if(Track_2[0]==0x0b)
	{
		for(i=1;i<40;i++)
		{
			check = CHECK(Track_2[i]);
			if(check==ERROR)
				return ERROR;
			//if((Track_2[i]==0x0b)&&(num1==0))
				//return ERROR;
			if(Track_2[i]!=0x00)
				num ++;
			if(Track_2[i]==0x1f)
			{
				num1 ++;
				break;
			}
		}
		if(num<23)
			return ERROR;
		if(num1<1)
			return ERROR;
	}
	else
		return ERROR;
	return OK;
}

CHAR Check_Track2_Back(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
	
	if(Track_2_Back[0]==0x0b)
	{
		for(i=1;i<40;i++)
		{
			check = CHECK(Track_2_Back[i]);
			if(check==ERROR)
				return ERROR;
			//if((Track_2_Back[i]==0x0b)&&(num1==0))
				//return ERROR;
			if(Track_2_Back[i]!=0x00)
				num ++;
			if(Track_2_Back[i]==0x1f)
			{	
				num1 ++;
				break;
			}
		}
		if(num<23)
			return ERROR;
		if(num1<1)
			return ERROR;
	}
	else
		return ERROR;
	return OK;
}

CHAR Check_Track3_Forward(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
	
	if(Track_3[0]==0x0b)
	{
		for(i=1;i<107;i++)
		{
			check = CHECK(Track_3[i]);
			if(check==ERROR)
				return ERROR;
			//if((Track_3[i]==0x0b)&&(num1==0))
				//return ERROR;
			if(Track_3[i]!=0x00)
				num ++;
			if(Track_3[i]==0x1f)
			{
				num1 ++;
				break;
			}
		}
		if(num<66)
			return ERROR;
		if(num1<1)
			return ERROR;
	}
	else
		return ERROR;
	return OK;
}

CHAR Check_Track3_Back(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
	
	if(Track_3_Back[0]==0x0b)
	{
		for(i=1;i<107;i++)
		{
			check = CHECK(Track_3_Back[i]);
			if(check==ERROR)
				return ERROR;
			//if((Track_3_Back[i]==0x0b)&&(num1==0))
				//return ERROR;
			if(Track_3_Back[i]!=0x00)
				num ++;
			if(Track_3_Back[i]==0x1f)
			{
				num1 ++;
				break;
			}
		}
		if(num<66)
			return ERROR;
		if(num1<1)
			return ERROR;
	}
	else
		return ERROR;
	return OK;
}
			
	
	
					
				
				
CHAR CHECK(CHAR data)
{
INT num=0,i=0;
	
	for(i=0;i<8;i++)
	{
		if(data&(0x01<<i))
			num ++;
	}
	if(num%2)
		return OK;
	else
		return ERROR;
}	
	
	
	
CHAR BACKTRACK2(CHAR *data,INT len)
{
INT i=0,bitnum=0,num=0,tack2_back_num=0;
CHAR *temp;
CHAR check=0x00;
	
	bitnum = len-1;
	temp = data+bitnum;
	while(1)
	{
		if(*(temp)&0x02)
		{
			temp --;
			num++;
			if(num>len)
				return ERROR;
		}
		else
		{
			for(i=0;i<5;i++)
			{
				if((*temp)&0x02)
					check |= (0x00<<i);
				else
					check |= (0x01<<i);
				temp --;
				num ++;
				if(num>len)
					return ERROR;
			}
			if(check==0x0b)
			{
				Track_2_Back[tack2_back_num] = check;
				tack2_back_num ++;
				i = 0;
				check = 0x00;
				while(1)
				{
					for(i=0;i<5;i++)
					{
						if((*temp)&0x02)
							check |= (0x00<<i);
						else
							check |= (0x01<<i);
						temp --;
						num ++;
						//if(num>len)
							//return ERROR;
					}
					Track_2_Back[tack2_back_num] = check;
					tack2_back_num ++;
					i = 0;
					check = 0x00;
					if(num>len)
					{
						//Track2_Back_Count = tack2_back_num;
						tack2_back_num = 0;
						return OK;
					}
				}
			}
			else
			{
				tack2_back_num = 0; 
				return ERROR;
			}
		}
	}
}

CHAR BACKTRACK3(CHAR *data,INT len)
{
INT i=0,bitnum=0,num=0,tack3_back_num=0;
CHAR *temp;
CHAR check=0x00;
	
	bitnum = len-1;
	temp = data+bitnum;
	while(1)
	{
		if(*(temp)&0x04)
		{
			temp --;
			num++;
			if(num>len)
				return ERROR;
		}
		else
		{
			for(i=0;i<5;i++)
			{
				if((*temp)&0x04)
					check |= (0x00<<i);
				else
					check |= (0x01<<i);
				temp --;
				num ++;
				if(num>len)
					return ERROR;
			}
			if(check==0x0b)
			{
				Track_3_Back[tack3_back_num] = check;
				tack3_back_num ++;
				i = 0;
				check = 0x00;
				while(1)
				{
					for(i=0;i<5;i++)
					{
						if((*temp)&0x04)
							check |= (0x00<<i);
						else
							check |= (0x01<<i);
						temp --;
						num ++;
						//if(num>len)
							//return ERROR;
					}
					Track_3_Back[tack3_back_num] = check;
					tack3_back_num ++;
					i = 0;
					check = 0x00;
					if(num>len)
					{
						//Track3_Back_Count = tack3_back_num;
						tack3_back_num = 0;
						return OK;
					}
				}
			}
			else
			{ 
				tack3_back_num = 0;
				return ERROR;
			}
		}
	}
}			
				
				
				
CHAR FORWARDTRACK2(CHAR *data,INT len)
{
INT i=0;
INT num=0;
INT track2_forward_num=0;
CHAR *temp;
CHAR check=0x00;


	temp = data;
	while(1)
	{
		if(*temp==0x02)
		{
			temp ++;
			num ++;
			if(num>len)
				return ERROR;
		}
		else
		{
			for(i=0;i<5;i++)
			{
				if(*(temp)&0x02)
					check |= (0x00<<i);
				else
					check |= (0x01<<i);
				num ++;
				temp ++;
				if(num>len)
					return ERROR;
			}
			if(check==0x0b)             
			{
				Track_2[track2_forward_num] = check;
				track2_forward_num ++;
				i = 0;
				check = 0x00;
				while(1)
				{
					for(i=0;i<5;i++)
					{
						if(*(temp)&0x02)
							check |= (0x00<<i);
						else
							check |= (0x01<<i);
						temp ++;
						num ++;	
					}
					Track_2[track2_forward_num] = check;
					track2_forward_num ++;
					i = 0;
					check = 0x00;
					if(num>len)
					{	
						//Track2_Count = track2_forward_num;
						track2_forward_num = 0;
						return OK;
					}
				}
			}
			else
			{
				track2_forward_num = 0;
				return 	ERROR;
			}
		}
	}
}


CHAR FORWARDTRACK3(CHAR *data,INT len)
{
INT i=0;
INT num=0;
INT track3_forward_num=0;
CHAR *temp;
CHAR check=0x00;


	temp = data;
	while(1)
	{
		if(*temp==0x04)
		{
			temp ++;
			num ++;
			if(num>len)
				return ERROR;
		}
		else
		{
			for(i=0;i<5;i++)
			{
				if(*(temp)&0x04)
					check |= (0x00<<i);
				else
					check |= (0x01<<i);
				num ++;
				temp ++;
				if(num>len)
					return ERROR;
			}
			if(check==0x0b)             
			{
				Track_3[track3_forward_num] = check;
				track3_forward_num ++;
				i = 0;
				check = 0x00;
				while(1)
				{
					for(i=0;i<5;i++)
					{
						if(*(temp)&0x04)
							check |= (0x00<<i);
						else
							check |= (0x01<<i);
						temp ++;
						num ++;	
					}
					Track_3[track3_forward_num] = check;
					track3_forward_num ++;
					i = 0;
					check = 0x00;
					if(num>len)
					{	
						//Track3_Count = track3_forward_num;
						track3_forward_num = 0;
						return OK;
					}
				}
			}
			else
			{
				track3_forward_num = 0;
				return 	ERROR;
			}
		}
	}
}	
				
				

⌨️ 快捷键说明

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