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

📄 main.c

📁 SIM卡双卡通C源码,支持C8051F304芯片Keil环境
💻 C
📖 第 1 页 / 共 2 页
字号:
					TransmitCommand();
					break;
				case 0xC0:		  	//GetResponse
					if (Flag6F38 == 1) //	截获6F38,
					{
						SendSCommStr0(SIMServerRESPONSE,Header[4]+1,ME);
						HookResp();
						break;
					}
					TransmitCommand();
					break;
				case 0xB0:			//ReadBinary
					if (Flag6F38 == 1) //	截获6F38,
					{
						SendSCommStr0(SIMServerTable,Header[4]+1,ME);
						SendSCommChar0(0x91,ME);
						SendSCommChar0(MENULENGTH/*0x40*/,ME);
						
						break;
					}
					if (Flag6FAE == 1) //	截获6FAE,发送自己的 支持STK
					{
						SendSCommStr0(PhaseID,2,ME);//PhaseID
						AnswerNoData();
						break;					
					}
					TransmitCommand();
					break;
				case 0xB2:			//ReadRecord
					TransmitCommand();
					break;
	//OUT
				case 0xA4: 			//Select file
					SelectFile();
					break;
	 			case 0xC2:			//MenuENVELOPE
					{
						SendSCommChar0(Header[1],ME);
						for (i=0; i<Header[4]; i++) 			//Header[4] - length
						{
							ch = GetSCommChar0(ME,0);
						}
						FetchMenuFlag = 1;
						switch (ch)
						{
							case 1:	   				//选择sim1
								FlagToReset = 1;
								SwitchFlag = 0;
								SelectSimCard = SIM1;
								break;
							case 2:			   		//选择sim2
								FlagToReset = 1;
								SwitchFlag = 0;
								SelectSimCard = SIM2;
								break;
							case 3:				   //选择sim1与sim2切换
								FlagToReset = 1;
								SwitchFlag = 1;
								break;
							case 4:				   //快速切换
								SwitchSpeed = EXPRESS;
								HOOKFlag = 1;
								break;
							case 5:				   //正常切换
								SwitchSpeed = NORMAL;
								HOOKFlag = 1;
								break;
							case 6:				   //慢速切换
								SwitchSpeed = SLOW;
								HOOKFlag = 1;
								break;
							case 7:				   //切换菜单语言
								if (MenuType == 1) 
									MenuType = 0;
								else
									MenuType = 1;
								FlagToReset = 1;
								break;
							default:
								break;
						}
						SaveData();
						HookResp();
					break;

					}
				case 0x10:			//TerminalProfile
						SendSCommChar0(Header[1],ME);
						for (i=0; i<Header[4]; i++) 			//Header[4] - length
						{
							ch = GetSCommChar0(ME,0);
						}
						HOOKFlag = 1;
						HookResp();
						break;
				case 0x14:			//Terminal Response
						SendSCommChar0(Header[1],ME);
						for (i=0; i<Header[4]; i++) 			//Header[4] - length
						{
							ch = GetSCommChar0(ME,0);
						}
						FetchMenuFlag = 0;
/*						if (FlagToReset == 0x55)
						{
						  	if (Header[4] != 0xc)
						  	{
								if (BeginSwitchFlag == 0x2)		//??? !=
								{
									if (ch != 0x0)
									{
										if (SelectSimCard == SIM1)
										{
								  			SelectSimCard = SIM2;
										}
										else
										{
								  			SelectSimCard = SIM1;
										}
										SaveData();
									}	
								}
								else
								{
								  	FlagToReset = 0x1;
								}
	
						  	}
						}
*/						AnswerNoData();					
						break;

				case 0x44:			//Invalidate	
				case 0xFA:			//Invalidate
				case 0x04:			//Invalidate
				
				case 0xD6: 
				case 0xDC: 
				case 0xA2: 
				case 0x32: 
				case 0x20:
				case 0x24:
				case 0x26:
				case 0x28:
				case 0x2C:
				case 0x88:

					if (SimType == 0xaa) //反向协议
					{

					 	SendSCommStr0V(Header,5,SelectSimCard);

						i = GetSCommChar0(SelectSimCard,0);
						SendSCommChar0V(i,ME);					//i = GetSCommChar0(SelectSimCard,ME);	//应答指令

						FlagVFrist = 1;			//反向传输时第一个字节标志,第一个字节不转发
						for (i=0; i<Header[4]; i++) 			//Header[4] - length
						{
							GetChar = GetSCommChar0V(ME,SelectSimCard);
							FlagVFrist = 0;
						}
						SendSCommChar0V(GetChar,SelectSimCard);	//发送错后的字节

						for (;;) 
						{
							GetChar = GetSCommChar0(SelectSimCard,0);	//应答1
						  	if (GetChar == 0xF9)			//0x60的倒序
								SendSCommChar0V(i,ME);
							else 
								break;
						}
						FlagVFrist = 0;
						GetChar = GetSCommChar0V(SelectSimCard,ME);
						SendSCommChar0V(GetChar,ME);	//发送错后的字节						 
					}
					else
					{
					 	SendSCommStr0(Header,5,SelectSimCard);
						i = GetSCommChar0(SelectSimCard,ME);	//应答指令
						for (i=0; i<Header[4]; i++) 			//Header[4] - length
						{
							GetSCommChar0(ME,SelectSimCard);
						}
						do 
						{
							i = GetSCommChar0(SelectSimCard,ME);	//应答1
						} while (i == 0x60);
						GetSCommChar0(SelectSimCard,ME);	//应答2
					}
					break;

				default:
						SendSCommChar0(0x6d,ME);
						SendSCommChar0(Header[1],ME);
					break;
	     
			}
		}
	}

}

void TransmitCommand(void) 
{
	unsigned char i,ch;

	if (SimType == 0xaa) //反向协议
	{
				SendSCommChar0(0x60,ME);	// 令手机延时等待
				SendSCommStr0V(Header,5,SelectSimCard);

				FlagVFrist = 1;
retry0:			GetChar = GetSCommChar0V(SelectSimCard,ME);		//应答指令
				FlagVFrist = 0;
				if (GetChar == Reverse(Header[1]))
				{
					for (i=0; i<Header[4]; i++) 			//Header[4] - length
					{
							GetChar = GetSCommChar0V(SelectSimCard,ME);
					}	
					do
					{
						GetChar = GetSCommChar0V(SelectSimCard,ME);
					} while ( GetChar == 0xF9);				//0x60的倒序
	                HookResp();	
					return;
				}
				if (GetChar == 0xF9)  goto retry0;				

				GetChar = GetSCommChar0V(SelectSimCard,ME);
				SendSCommChar0V(GetChar,ME);	//发送错后的字节						 					

	}
	else
	{

				SendSCommChar0(0x60,ME);	// 令手机延时等待
				SendSCommStr0(Header,5,SelectSimCard);
retry:			DataBuffer[0] = GetSCommChar0(SelectSimCard,ME);	//应答指令
				if (DataBuffer[0] == Header[1])
				{
				
					for (i=0; i<Header[4]; i++) 			//Header[4] - length
					{
						if ( i> 31 )
						{
							GetSCommChar0(SelectSimCard,ME);
						}
						else
						{
							DataBuffer[i+1]=GetSCommChar0(SelectSimCard,ME);
						}
					}	
					while (GetSCommChar0(SelectSimCard,0) == 0x60);
	                HookResp();	
					return;
				}
				if (DataBuffer[0] == 0x60) goto retry;
				ch = GetSCommChar0(SelectSimCard,ME);
	}
}

void HookResp(void)
{
	if (FetchMenuFlag)
	{
		if (ReadyToSendDataLength)
		{
				SendSCommChar0(0x91,ME);
				SendSCommChar0(ReadyToSendDataLength,ME);
		}
		else
		{
			if (HOOKFlag == 0x1)
			{
				ReadyToSendDataLength = MENULENGTH;//0x40;
				SendSCommChar0(0x91,ME);
				SendSCommChar0(ReadyToSendDataLength,ME);
			}
			else
			{
				if (FlagToReset == 0x1)
				{
//					if (ResetFailFlag >= 1) return; //临时复位办法
					ResetFailFlag ++;
					ReadyToSendDataLength = 0x0b;  	//菜单选择复位
					SendSCommChar0(0x91,ME);
					SendSCommChar0(ReadyToSendDataLength,ME);

				}
				else
				{
					if (FlagCommandStatus <= 0x2)  		//刚刚设置菜单
					{
						FlagCommandStatus++;
						ReadyToSendDataLength = 0x0f;	//有设置Poll间隔要发送
						SendSCommChar0(0x91,ME);
						SendSCommChar0(ReadyToSendDataLength,ME);
						
					}
					else
					{
						if (BeginSwitchFlag == 0x1)				 //切换时间到
						{
							ReadyToSendDataLength = 0x0b; //SIM复位 
							SendSCommChar0(0x91,ME);
							SendSCommChar0(ReadyToSendDataLength,ME);
						}
						else
						{
							AnswerNoData();			//不应答可强制复位
						}
					}
				}
					
			}

		}
	}
	else
	{
		AnswerNoData();
	}
}


void SelectFile(void)
{
unsigned char ch;
SendSCommChar0(0x60,ME);	// 令手机延时等待
if (BootFlag)
{
	for (ch =0;ch<40;ch++)
	{
	    Test_Count = TESTCOUNTVALUE*20;
		GetSCommChar0_Test(SelectSimCard,0);   //去除卡初始化未发出的数据
		if (Test_Count == 0) break;
	}
	BootFlag = 0;
}

if (SimType == 0xaa) //反向协议
{
	SendSCommStr0V(Header,5,SelectSimCard);
	FlagVFrist = 1;
	do 
	{
		GetChar = GetSCommChar0V(SelectSimCard,ME);		//应答指令
		FlagVFrist = 0;
		if ((GetChar != Reverse(Header[1]))&&(GetChar != 0xF9))
		{
			GetChar = GetSCommChar0V(SelectSimCard,ME);
			SendSCommChar0V(GetChar,ME);	//发送错后的字节
			return;
		}
	} while (GetChar == 0xF9);

	SendSCommChar0V(GetChar,ME);	//发送错后的字节

	DataBuffer[6] = GetSCommChar0(ME,0);
	DataBuffer[7] = GetSCommChar0(ME,0);
	if (DataBuffer[6] == 0x6F)
	{
		if (DataBuffer[7] == 0xAE)
		{
			Flag6FAE = 1;		//	截获6FAE,发送自己的 支持STK
		}
		else
		{
			if (DataBuffer[7] == 0x38)
				Flag6F38 = 1;
			else
			{
				Flag6F38 = 0;
				Flag6FAE = 0;
			}
		}
	}
	else
	{
		Flag6F38 = 0;
		Flag6FAE = 0;
	}
	SendSCommChar0V(DataBuffer[6],SelectSimCard);
	SendSCommChar0V(DataBuffer[7],SelectSimCard);

	FlagVFrist = 1;
	GetChar = GetSCommChar0V(SelectSimCard,ME);		
	FlagVFrist = 0;
	GetChar = GetSCommChar0V(SelectSimCard,ME);

	SendSCommChar0V(GetChar,ME);
}
else
{
	SendSCommStr0(Header,5,SelectSimCard);
	do 
	{
		DataBuffer[5] = GetSCommChar0(SelectSimCard,ME);
		if ((DataBuffer[5] != Header[1])&&(DataBuffer[5] != 0x60))
		{
			GetSCommChar0(SelectSimCard,ME);
			return;
		}
	} while (DataBuffer[5] == 0x60);
	
	DataBuffer[6] = GetSCommChar0(ME,0);
	DataBuffer[7] = GetSCommChar0(ME,0);
	if (DataBuffer[6] == 0x6F)
	{
		if (DataBuffer[7] == 0xAE)
		{
			Flag6FAE = 1;		//	截获6FAE,发送自己的 支持STK
		}
		else
		{
			if (DataBuffer[7] == 0x38)
				Flag6F38 = 1;
			else
			{
				Flag6F38 = 0;
				Flag6FAE = 0;
			}
		}
	}
	else
	{
		Flag6F38 = 0;
		Flag6FAE = 0;
	}
	SendSCommChar0(DataBuffer[6],SelectSimCard);
	SendSCommChar0(DataBuffer[7],SelectSimCard);

	DataBuffer[8] = GetSCommChar0(SelectSimCard,ME);
	DataBuffer[9] = GetSCommChar0(SelectSimCard,ME);
}
}

void SendCount(void)
{
	SCount ++;
	if (SCount == 0xff)
		SCount = 1;
	SendSCommChar0(SCount,ME);
}
void AnswerNoData(void)
{
	ReadyToSendDataLength = 0;
	SendSCommChar0(0x90,ME);
	SendSCommChar0(0x00,ME);
}

void SaveData(void)
{
	if (CBYTE[SAVEADDRESS] != SelectSimCard)
		goto Write;
	if (CBYTE[SAVEADDRESS+1] != Sim1Type)
		goto Write;
	if (CBYTE[SAVEADDRESS+2] != Sim2Type)
		goto Write;
	if (CBYTE[SAVEADDRESS+3] != SwitchFlag)
		goto Write;
	if (CBYTE[SAVEADDRESS+4] != SwitchSpeed)
		goto Write;
	if (CBYTE[SAVEADDRESS+5] != MenuType)
		{
Write:		EraseFlash(SAVEADDRESS);
			WriteCode(SAVEADDRESS,SelectSimCard);
			WriteCode(SAVEADDRESS+1,Sim1Type);
			WriteCode(SAVEADDRESS+2,Sim2Type);
			WriteCode(SAVEADDRESS+3,SwitchFlag);
			WriteCode(SAVEADDRESS+4,SwitchSpeed);
			WriteCode(SAVEADDRESS+5,MenuType);
		}
}

void WriteCode(unsigned char xdata * codePtr,unsigned char byte)
{
   bit EA_state=EA;
   EA = 0;                             // Disable interrupts
   FLKEY=0xA5;                         // Input first key code
   FLKEY=0xF1;                         // Input second key code,
                                       // FLASH is now unlocked
 
   PSCTL |= 0x01;                      // Enable FLASH Writes
   *codePtr = byte;       			

   PSCTL &= ~0x01;                     // disable FLASH Writes
   EA = EA_state;                      // Restore interrupt state
}


void EraseFlash(unsigned char xdata * codePtr)
{
	bit EA_state=EA;
	EA = 0;                             // Disable interrupts
	PSCTL |= 0x02;   	  			    //allow erase and write
	PSCTL |= 0x01;                      // Enable FLASH Writes

	FLKEY=0xA5;                         // Input first key code
	FLKEY=0xF1;                         // Input second key code,
                                       	// FLASH is now unlocked
	*codePtr = 0xff;       			

	PSCTL &= ~0x03;                     // disable FLASH Writes
	EA = EA_state;                      // Restore interrupt state
}


⌨️ 快捷键说明

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