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

📄 tools.c

📁 手持机读写GSM标准的CPU卡代码,包括手持机的液晶显示
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include <ExEH0218.h>
#include <mifare530.h>
#include <memcard.h>
#include "Health.h"

void delay_n_ms(short i)
{
	for(;i>0;i--)
		delay_1ms();
}

void  dump_memory(unsigned char * buf,short int cnt,short line) 
{
      unsigned short cntr;
      unsigned char stmp[100];
      for (cntr = 0; cntr < cnt; cntr ++) {
		sprintf( stmp+2*cntr,"%02X", buf[cntr]);
	      }
      stmp[cnt*2] = 0;
      ClearLine(line,DISP_5x7);	 
      DispStr_E(0,line,stmp,DISP_POSITION|DISP_5x7);
}
/**************************************************************
函数名称:Alarm
功能描述:蜂鸣器报警
函数说明:蜂鸣器鸣响三次
调用函数:无
全局变量:无
输入:	  无
返回:    无
修改:
*************************************************************/
void Alarm()
{
	int count;
		
	for(count=0;count<3;count++)
	{	
		BEEPER_sound(0xBF0B);
		SPT_set(16);
		while(SPT_read());
		BEEPER_sound(0x7F0B);
		delay_n_ms(100);
	}	
	
}

/**************************************************************
函数名称:BCDToASC
功能描述:将BCD码转换为ASCII码
函数说明:
调用函数:无
全局变量:无
输入:	  unsigned char *source:BCD码 , unsigned char length:BCD码的长度
输出:    unsigned char *dest:  ASCII码
返回:    无
修改:
*************************************************************/
void BCDToASC(unsigned char *source,unsigned char *dest,unsigned char length)
{
        unsigned char i, j;

        for(i=0;i<length;i++)
        {
                j=(source[i]>>4)&0x0f;
                if(j>9)
                        dest[2*i]=j+'A'-10;
                else
                        dest[2*i]=j+'0';
                j=source[i]&0x0f;
                if(j>9)
                        dest[2*i+1]=j+'A'-10;
                else
                        dest[2*i+1]=j+'0';
        }
}


/**************************************************************
函数名称:LongToAsc
功能描述:将长整形整数转换为ASCII码
函数说明:
调用函数:无
全局变量:无
输入:	  long a:长整形整数 
输出:    unsigned char *buffer:  ASCII码
返回:    无
修改:
*************************************************************/
void LongToAsc(long a, unsigned char *buffer)
{
	
	int	i,j;
	long 	z,b;  	

	memset(buffer, 0, sizeof(buffer));

	b = a;
	j = 19;

	for(i = 0; i < 20; i++)
		buffer[i] = 0x30;
	buffer[20] = 0;

	if(b == 0)
	{
		buffer[0] = 0;
		return;
	}

	while(b > 0)
 	{
   		z = b % 10;
    	buffer[j--] = (unsigned char)z + 0x30;
   		b = b / 10;
 	}

	for(i=0; i<21; i++)
		if (buffer[i] != 0x30)
			break;

	for(j=i; j<21; j++)
		buffer[j-i] = buffer[j];

	return;
 
}


/**************************************************************
函数名称:ASCToBCD
功能描述:将ASCII码转换为BCD码
函数说明:
调用函数:无
全局变量:无
输入:	  unsigned char *source:ASCII码 , unsigned char length:ASCII码的长度
输出:    unsigned char *dest:  BCD码
返回:    无
修改:
*************************************************************/
void ASCToBCD(unsigned char *source, unsigned char *dest, unsigned char length)
{
        unsigned char i, j, k;

        for(i=0;i<length;i++)
        {
         	if((source[i]>='0') && (source[i]<='9'))
                        j=source[i]-'0';
                else if((source[i]>='a') && (source[i]<='z'))
                        j=source[i]-'a'+0x0a;
                else
                        j=source[i]-'A'+0x0a;
                i++;
                if((source[i]>='0') && (source[i]<='9'))
                        k=source[i]-'0';
                else if((source[i]>='a') && (source[i]<='z'))
                        k=source[i]-'a'+0x0a;
                else
                        k=source[i]-'A'+0x0a;
                dest[i/2]=(j<<4)|k;
        }
} 



/**************************************************************
函数名称:AscAdd
功能描述:把两个用ascii码表示的整数相加
函数说明:
调用函数:无
全局变量:无
输入:	  unsigned char *add1:ascii码的加数1 , unsigned char *add2:ASCII码的加数2
输出:    unsigned char *result: 结果
返回:    无 
修改:
*************************************************************/
void AscAdd(unsigned char *add1,unsigned char *add2,unsigned char *result)
{
	unsigned char temp[20];	
	unsigned char length;
	unsigned char carry;
	unsigned char j;
	int i;
	unsigned char length1,length2;

		memset(result,0,sizeof(result));
		length1 = strlen(add1);

		length2 = strlen(add2);
		length = length1;
		if ( length1 < length2 )
                {
			memset(temp,0,20);
			if (length1 == 1)
				temp[0] = add1[0];
			else	memcpy(temp,add1,length1);
			memset(add1,0,20);
			for ( j = 0 ; j < length2-length1; j ++ )
				add1[j] = 0x30;
			if (length1 == 1)
				add1[length2-length1] = temp[0];
			else	memcpy(add1 + length2 - length1 , temp ,length1);
			length = length2;
		}				
		if ( length2 < length1 )
                {
			memset(temp,0,20);
			if ( length2 == 1)
				temp[0] = add2[0];
			else	memcpy(temp,add2,length2);
			memset(add2,0,20);
			for ( j = 0 ; j < length1-length2; j ++ )
				add2[j] = 0x30;
			if ( length2 == 1 )
				add2[length2 - length1] = temp[0];
			else	memcpy(add2 + length1 - length2 , temp ,length2);
			length = length1;
		}			
		carry = 0;
		for ( i = length-1 ; i >= 0 ;  i-- )
		{
			result[i] = add1[i] + add2[i] - 0x30 + carry;

			if ( ( add1[i] + add2[i] - 0x09 + carry) >= 'a')			
				result[i] = add1[i] + add2[i] + carry - 0x3a;
			if ( ( add1[i] + add2[i] - 0x09 + carry ) >= 'a')			
				carry = 1;
			else carry = 0;
                };        
                if ( carry == 1 )
		{
			memset(temp,0,20);
			memcpy(temp,result,length);      
			memset(result,0,20);
			result[0] = '1';
			memcpy(result + 1, temp, length);
		}
}	
/**************************************************************
函数名称:LongToBcd
功能描述:把长整形数转换为bcd码
函数说明:
调用函数:无
全局变量:无  
输入:	  long LongData 长整形数 , unsigned char *BcdStr:转换后的BCD码
输出:    int BcdStrLen :转换后的bcd码长度
返回:    无  
修改:
*************************************************************/
void LongToBcd(long LongData,unsigned char *BcdStr,int BcdStrLen)
{
	unsigned char ascstr[30];
	unsigned char temp[16];
	
		sprintf(ascstr,"%012ld",LongData);
		memcpy(temp,ascstr+12-BcdStrLen*2,BcdStrLen*2);
		temp[BcdStrLen*2] = 0;
		ASCToBCD(temp,BcdStr,BcdStrLen*2);
		
}


/**************************************************************
函数名称:BcdToLong
功能描述:把bcd码转换为长整形数
函数说明:
调用函数:无
全局变量:无  
输入:	  unsigned char *BcdStr:BCD码,int BcdStrLen :bcd码长度
输出:    
返回:    转换后的长整形数  
修改:
*************************************************************/
long BcdToLong(unsigned char *BcdStr,int BcdStrLen)
{
	unsigned char ascstr[500];

		BCDToASC(BcdStr,ascstr,BcdStrLen);
		ascstr[BcdStrLen*2] = 0;
		return(atol(ascstr));
}

void selectcode(char *Card_Read_Buff,char *Buff,int j)
{
	int i,k,m,n;  //
	char temstr[500];
	 memset(temstr,0,500);
	 memcpy(temstr,Card_Read_Buff,500);
	  //DispStr_E(0,0,temstr,DISP_CENTER|DISP_CLRSCR);
	    //  delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
	
	/*if (j==1)
	{
			for(i=0;i<1000;i++)
			{
				if (temstr[i]=='|')
				{
					if (i == 1)
					{
						memcpy(Buff,"null",4);
				  	break;
					}					
					
					memcpy(Buff,temstr,i-1);	
				}
				else continue;
			} 		
	}*/

	m = 1;

	for(i=0;i<500;i++)
	{
		//if (*(Card_Read_Buff+i)=="|")
		if (temstr[i]=='|')
		{
			m = m + 1;
			if ((j == 1)&&(m == 2))
			{
				break;
			}
			if (m == j)
			{
				/*memcpy(tmp,temstr+i,10);        
		      DispStr_E(0,0,tmp,DISP_CENTER);
		      DispStr_E(0,2,p,DISP_CENTER);
	      delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );*/
				break;				
			}
		}
		else continue;
	}

	if (j == 1)
	{
		memcpy(Buff,temstr,i);
	}else
	{
		for (n=i+1;n<i+100;n++)
		{
			if (temstr[n]=='|')
			{
				if (n==(i+1))
				{
					memcpy(Buff," ",1);
					break;
				}    else		memcpy(Buff,temstr+i+1,n-i-1);
				break;
			}	
			continue;
		}
	}
		        
		//memcpy(tmp,Buff,10);        
		//        DispStr_E(0,4,tmp,DISP_CENTER|DISP_CLRSCR);
	  //    delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );

	return;
}


int Getdatanum(char *Card_Read_Buff,char *buff)
{
	int i,j,k,m,n;//k is PHY# ,n is  PHY#`s number
	char str1[10],tmpstr[500];
	
	k=0;
	m=0;
	n=0;
	memcpy(str1,buff,10);
	memcpy(tmpstr,Card_Read_Buff,500);
	for (i=0;i<10;i++)
	{
			
		if (str1[i]=='#') 
		{
			k=i;
			//DispStr_E(0,1,str1+i,DISP_POSITION|DISP_CLRSCR);	
			//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
			break;
		}
	}
	
	for (i=0;i<500;i++)
	{
		m=0;
		if (tmpstr[i]==str1[0]) 
		{
			
			for (j=1;j<k+1;j++)
			{
				if (tmpstr[i+j]==str1[j])	
				{
					m++;
					//
					//memcpy(ss,tmpstr+j,12);
					//DispStr_E(0,0,ss,DISP_POSITION|DISP_CLRSCR);	
					//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
					//MH#|med 2|1/11/2006 01:00:00 AM|no|\n\nMH#|med 3|||\n\n
				}
				else
				{
					m=0;
					break;
				}
			}
			if (m == k)
			{
				n++;
				//DispStr_E(0,1,"test",DISP_CENTER|DISP_CLRSCR);	
				//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
				//break;
			}
		}
		
	}
	//str1[0]=n;
	//
	//DispStr_E(0,4,str1,DISP_CENTER|DISP_CLRSCR);	
	//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
	//

	
	return n;
}

void Getphydata(char *Card_Read_Buff,char * buff,int number)
{
	//"PHY#|lam don|sp 1|5454512121|\n\n"
	//"FFH#|china|teacher|cancer|32|True|True|True|True|True|False|False|False|False|False|False|False|False|False|False|False|False|True|True|True|\n\n
	int i,j,k=0,m=0,n=0,p=0,q=0;//k is PHY# ,n is  PHY#`s number
	char str1[10],temstr[500];
	
	memcpy(str1,buff,10);
	memcpy(temstr,Card_Read_Buff,500);
	for (i=0;i<10;i++)
	{
		if (str1[i]=='#') 
		k=i;
		//
		//DispStr_E(0,3,"find #",DISP_CENTER|DISP_CLRSCR);	
		//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
		//
		break;
	}
	
	for (i=0;i<500;i++)
	{
		if (temstr[i]==str1[0]) 
		{
			for (j=0;j<k;j++)
			{
				if (temstr[i+j+1]==str1[j+1])	
				m++;
				else
				break;
			}
			if (m == k)
			{
				n=i+k;
				break;
			}
		}
	}
	//
	//"PHY#|lam don|sp 1|5454512121|\n\n"
	//DispStr_E(0,3,temstr+n+2,DISP_CENTER|DISP_CLRSCR);	
		//delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
	//
	
	for (i=0;i<500;i++)
	{
		if (temstr[i+n]=='#')
		{
			
			p++;
			if (p==number)
			{
				for(q=0;q<100;q++)
				{
					if (temstr[n+i+q]==92)
					{
						break;
					}	
				}
				memcpy(buff,temstr+n+i+2,q);
					//DispStr_E(0,3,temstr+n+i+2,DISP_CENTER|DISP_CLRSCR);	
		      //delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
				break;	
			}		
			//q=i+n+k;
		}
		
	}
	
	
	return ;
}

void tmpGetphydata(char *temstr,char * buff,int number)
{
	int i,j,k=0,m=0,n=0,p=0,q=0;//k is PHY# ,n is  PHY#`s number
	char str1[10],temp[10];
	//char *strtmp;
	memset(str1,0,10);
	memset(temp,0,10);
	memcpy(str1,buff,10);
	//memcpy(temstr,Card_Read_Buff,2000);
	for (i=0;i<10;i++)
	{
		if (str1[i]=='#') 
		{
			k=i;
			break;
		}
		
	}
	memset(buff,0,500);
	for (i=0;i<number;i++)
	{
		if (temstr[i]==str1[0]) 
		{
			m=0;
			for (j=0;j<k;j++)
			{
				if (temstr[i+j+1]==str1[j+1])	
				m++;
				else
				break;
			}
			if (m == k)
			{
				n=i;//n=i+k; 20060615
				break;
			}
		}
	}
	
	for (i=number-k;i>=n;i--)
	{
		if (temstr[i]==str1[0]) 
		{
      m = 0;
			for (j=0;j<k;j++)
			{
				if (temstr[i+j+1]==str1[j+1])	
				m++;
				else
				break;
			}
			if (m == k)
			{
				p=i;
				if ((p-n)>400) continue ;
				else  break;
			}
		}
	}	

	if (p>=n)
	{	
		
		for(q=0;q<300;q++)
		{
			if (temstr[p+q+k+2]=='#')	break;	
		}
	}

	if ((p+q-n)>500) 
	{
		DispStr_E(0,3,"erro",DISP_POSITION|DISP_CLRSCR);
		delay_and_wait_key( 10, EXIT_KEY_ALL, 0 );
		memset(buff,0,500);
		return ;
	}
	
	
	memcpy(buff,temstr+n,p+q+k-n);//memcpy(buff,temstr+n+i+2,q);

	return ;
}

⌨️ 快捷键说明

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