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

📄 main.c

📁 SIM卡双卡通C源码,支持C8051F304芯片Keil环境
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------------
// - Pinout:
//    P0.0 -> SDA (SMBus)  						CEX0    IO
//    P0.1 -> SCL (SMBus)								CLK
//    P0.2 -> unused									IO1
//    P0.3 -> SW2										IO2
//    P0.4 -> unused									RST2
//    P0.5 -> unused									RST1
//    P0.6 -> unused									RST
//    P0.7 -> C2D (debug interface)
//

//------------------------------------------------------------------------------------
// Includes
//------------------------------------------------------------------------------------
#define NONE 0   /* no data */
#define IN   1   /* to card */
#define OUT  2   /* to decoder */

#include "dsim.h"
#include "SoftUart300.h"
void SelectFile(void);
void SendCount(void);
void HookResp(void);
void TransmitCommand(void);
void AnswerNoData(void);
void SaveData(void);
void EraseFlash(unsigned char xdata * codePtr);
void WriteCode(unsigned char xdata * codePtr,unsigned char byte);


//-----------------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------------
/*
code unsigned char RESET_ANSWER[] = 
{
	 0x3B,0x3F,0x11,0x00,0x41,0x97,0x58,0x48,0x4C,0x20,0x20,0x20,0x20,0x4D,0x61,0x00,0x00,0x12
//     TS   T0  TA1  TB1   T1  T2   T3   T4   T5   T6   T7   T8   T9   T10  T11  T12  T13  T14    T15
//                         A         X    H    L                        M    a    
//T=0 TCK不发送       
};
*/

code unsigned char RESET_ANSWER[] = 
{
	 0x3B,0x17,0x11,0xAA,0x01,0x01,0x01,0x01,0xFD,0xEB
//     TS   T0  TA1   T1  T2   T3   T4   T5   T6   T7 
//T=0 TCK不发送       
};

code unsigned char SIMServerRESPONSE[] =
{
//	0xC0,0x00,0x00,0x00,0x0A,0x6F,0x38,0x04,0x00,0x14,0xFF,0x44,0x01,0x02,0x00,0x00
	0xC0,0x00,0x00,0x00,0x08,0x6F,0x38,0x04,0x00,0x14,0xFF,0x44,0x01,0x01,0x00,0x00 //5

};

code unsigned char SIMServerTable[] = 
{
//	0xB0,0xCF,0x3C,0xC3,0x0F,0x00,0x00,0x30,0x03,0x00,0x00
	0xB0,0xFF,0x3F,0xFF,0x0F,0x03,0x00,0x30,0x03									//5
};

code unsigned char PhaseID[] = 
{
	0xB0,0x03	//支持STK
};    
//TLV
//Tag  -- ToolKit标志  0xD0
//Length  -- 长度小于127则为一个字节 0-0x7f   128-255为两个字节  0x81,0x80--0xff
//M/O   强制/可选


//设备编码 01-键盘  02-显示 03-听筒 0x10-0x17:读卡器 0x21-0x27:通道 0x81-SIM 0x82-ME 0x83-网络
//命令细节    0x81(Tag) 0x3(length) 命令计数 命令类型 命令限定
//命令限定:
//- REFRESH;
//'00' =SIM Initialization and Full File Change Notification;
//'01' = File Change Notification;
//'02' = SIM Initialization and File Change Notification;
//'03' = SIM Initialization;
//'04' = SIM Reset;
//'05' to 'FF' = reserved values.

//- SELECT ITEM.
//bit 1: 0 = presentation type is not specified
//		 1 = presentation type is specified in bit 2
//bit 2: 0 = presentation as a choice of data values if bit 1 = '1'
//		 1 = presentation as a choice of navigation options if bit 1 is '1'
//bit 3: 0 = no selection preference
//		 1 = selection using soft key preferred
//bits 4 to 7: = RFU(Reserve Future Use)
//bit 8: 0 = no help information available
//		 1 = help information available
//- SET UP MENU.
//bit 1: 0 = no selection preference
//		 1 = selection using soft key preferred
//bits 2 to 7: = RFU
//bit 8: 0 = no help information available
//		 1 = help information available

//设备识别符  0x82(Tag) 0x2(length) 源设备编码 目的设备编码
//
code unsigned char TABLE_RESET[] = {0xD0,0x09,0x81,0x03};
code unsigned char TABLE_RESET1[] = {0x01,0x04,0x82,0x02,0x81,0x82};

//命令解释
//   0xD0  								0x09     0x81  			0x03     0xxx    0x01     0x04       0x82        0x02    0x81  0x82
//BER-TLV tags in SIM TO ME direction	length	 命令细节tag	length		   refresh 	SIM Reset  设备识别符	length	  SIM   ME
//


code unsigned char TABLE_SETPOLLT[] = {0xD0,0x0D,0x81,0x03};
code unsigned char TABLE_SETPOLLT1[] = {0x03,0x00,0x82,0x02,0x81,0x82,0x84,0x02,0x01,0x0A};

//命令解释
//   0xD0  								0x0D     0x81  			0x03     0xxx    0x03         0x00       0x82        0x02    0x81   0x82   0x84      0x02    0x01      						0x0A
//BER-TLV tags in SIM TO ME direction	length	 命令细节tag	length		   POLL INTERVAL	        设备识别符	length	  SIM   ME	时间间隔tag	 length	 时间单位(0-分 1-秒 2-0.1秒) 	poll 时间10秒
//

//菜单部分

#define DSML1	5
#define DSML2	17
#define DS1	16
#define DS2	16
#define DS3	16
#define DS4	14
#define DS5	14
#define DS6	14
#define DS7	14
#define MENULENGTH	DSML1+DSML2+DS1+DS2+DS3+DS4+DS5+DS6+DS7


code unsigned char EDSimMenu1[] = 
{
	0x12,0xD0,MENULENGTH-2,0x01,0x03
};
code unsigned char EDSimMenu2[] = 
{	0x25,0x00,0x02,0x02,0x81,0x82,0x05,DSML2-8,0x44,0x75,0x61,0x6C,0x20,0x53,0x49,0x4D,0x20 };
//											D	 u	  a		l 		 S	  I    M 
code unsigned char EDsim1[] = 
{	0x0F,DS1-2,0x01,0x53,0x49,0x4D,0x20,0x43,0x61,0x72,0x64,0x20,0x2D,0x31,0x20,0x20};
//				        	S	 i	  m			C	 a	  r	   d		 -	   1
code unsigned char EDsim2[] = 
{	0x0F,DS2-2,0x02,0x53,0x49,0x4D,0x20,0x43,0x61,0x72,0x64,0x20,0x2D,0x32,0x20,0x20};
//				            S	 i	  m			C	 a	  r	   d		-	      2
code unsigned char EDsim3[] = 
{	0x0F,DS3-2,0x03,0x42,0x6F,0x74,0x68,0x20,0x4F,0x6E,0x2D,0x6C,0x69,0x6e,0x65,0x20 };
//					        B	o	 t	  h 		O	 n	  -	   l	i	 n	  e
code unsigned char EDsim4[] = 
{	0x0F,DS4-2,0x04,0x20,0x20,0x45,0x78,0x70,0x72,0x65,0x73,0x73,0x20,0x20};
//					         E    x    p    r    e    s    s
code unsigned char EDsim5[] = 
{	0x0F,DS5-2,0x05,0x20,0x20,0x4E,0x6F,0x72,0x6D,0x61,0x6C,0x20,0x20,0x20};
//					         N    o    r    m    a    l
code unsigned char EDsim6[] = 
{	0x0F,DS6-2,0x06,0x20,0x20,0x53,0x6C,0x6F,0x77,0x20,0x20,0x20,0x20,0x20};
//					         S    l    o    w
code unsigned char EDsim7[] = 
{	0x0F,DS7-2,0x07,0x54,0x6f,0x20,0x43,0x68,0x69,0x6e,0x65,0x73,0x65,0x20};
//                     T   o        C     h    i    n    e   s    e


code unsigned char DSimMenu1[]  = 
{	0x12,0xD0,MENULENGTH-2,0x81,0x03};
code unsigned char DSimMenu2[] = 
{	0x25,0x00,0x82,0x02,0x81,0x82,0x85,DSML2-8,0x80,	0x53,0xcc,	0x53,0x61,	0x90,0x1a,	0x00,0x20};
//													                双			卡			通
code unsigned char Dsim1[] = 
{	0x8F,DS1-2,0x01,0x80,0x00,0x53,	0x00,0x49,	0x00,0x4D,	0x00,0x31,	0x00,0x20,	0x00,0x20};
//						S			i			m			1
code unsigned char Dsim2[] = 
{	0x8F,DS2-2,0x02,0x80,0x00,0x53,	0x00,0x49,	0x00,0x4D,	0x00,0x32,	0x00,0x20,	0x00,0x20};
//						S			i			m			2
code unsigned char Dsim3[] = 
{	0x8F,DS3-2,0x03,0x80,0x53,0xcc,	0x53,0xf7,	0x5f,0x85,	0x67,0x3a,	0x00,0x20,	0x00,0x20 };
//						         双			号			待			机
code unsigned char Dsim4[] = 
{	0x8F,DS4-2,0x04,0x80,0x00,0x20,0x5F,0xEB,0x90,0x1F,0x00,0x20,0x00,0x20};
//								  快        速
code unsigned char Dsim5[] = 
{	0x8F,DS5-2,0x05,0x80,0x00,0x20,0x6B,0x63,0x5E,0x38,0x00,0x20,0x00,0x20};
//								  正        常
code unsigned char Dsim6[] = 
{	0x8F,DS6-2,0x06,0x80,0x00,0x20,0x61,0x62,0x90,0x1F,0x00,0x20,0x00,0x20};
//								  慢        速
code unsigned char Dsim7[] = 
{	0x8F,DS7-2,0x07,0x54,0x6f,0x20,0x45,0x6e,0x67,0x6c,0x69,0x73,0x68,0x20};
//                     T   o        E     n    g    l    i   s    h


unsigned char Header[5];
unsigned char StatusWord[2];
unsigned char DataBuffer[32];

unsigned char GetChar; 
unsigned char SwitchSpeed;
unsigned char SelectSimCard,FlagCommandStatus;
unsigned char Sim1Type,Sim2Type,SimType,MenuType;
unsigned char SwitchFlag,SwitchCount,F2Count;

unsigned int Test_Count;

bit BootFlag,Flag6F38,Flag6FAE,HOOKFlag,FetchMenuFlag,FlagVFrist;

char FlagToReset,BeginSwitchFlag,ResetFailFlag;
unsigned char SCount,ReadyToSendDataLength;


extern unsigned int  PCA_TEMP0;

 
void main (void)
{
unsigned char i,ch;
unsigned char *ptr;

	PCA0MD &= ~0x40;                          	// WDTE = 0 (Disable watchdog timer)
   	OSCICN |= 0x03;                           	// Set internal oscillator to highest setting
	XBR0 = 0x01;								// No pins skipped
	XBR2 = 0x40;								// Enable crossbar and weak pull-ups
	P0MDIN = 0xFF;								// All P0 pins digital input
	P0MDOUT = 0x30;								
	P0 = 0xFF;

	Flag6F38 = 0;
	Flag6FAE = 0;
	ResetFailFlag = 0;	

	RSTSRC = 0x02;						
	PCA_INIT0();

	RST1 = 0;
	RST2 = 0;
 	SelectSimCard = CBYTE[SAVEADDRESS];
	Sim1Type = CBYTE[SAVEADDRESS+1];			//Sim卡类型 0x55 -正向 0xaa-反向 0xbb-不存在
	Sim2Type = CBYTE[SAVEADDRESS+2];			//Sim卡类型 0x55 -正向 0xaa-反向 0xbb-不存在
	
	SwitchFlag = CBYTE[SAVEADDRESS+3];		//0-不切换 1-两卡切换
	if (SwitchFlag != 1) SwitchFlag = 0;
	SwitchSpeed = CBYTE[SAVEADDRESS+4];		//切换速度


	if ((SelectSimCard != SIM1) && (SelectSimCard != SIM2)) 
		SelectSimCard = SIM1;
	if ((SwitchSpeed != EXPRESS) && (SwitchSpeed != NORMAL) && (SwitchSpeed != SLOW))
		SwitchSpeed = NORMAL;

	MenuType = CBYTE[SAVEADDRESS+5];
	if (MenuType != 1) MenuType = 0;  	// 1 中文菜单  0 英文菜单

 	PCA_TEMP0 = PCA0L;					// Read PCA counter value into
	PCA_TEMP0 |= (PCA0H << 8);
	PCA_TEMP0 +=2;
	PCA0CPL0 = PCA_TEMP0;				// Restore PCA0CPL0 and PCA0CPH0
	PCA0CPH0 = (PCA_TEMP0 >> 8);		// with the updated value
	CCF0 = 0;
	CR = 1;								// Start PCA counter.
	while (CCF0 == 0);
	CCF0 = 0;
	CR = 0;
	while (RST == 0);
	RST1 = 1;
	RST2 = 1;

	
	if (SelectSimCard == SIM1)	 //判断Sim1卡类型
	{
		RST1 = 0;
		DelayCLKCount(500);
		Sim1Type = 0xbb;
		RST1 = 1;
		Test_Count = TESTCOUNTVALUE;
		ch = GetSCommChar0_Test(SIM1,0);
		if (ch == 0x3)
			Sim1Type = 0xaa;
		if (ch == 0x3b)
			Sim1Type = 0x55;
	} 
	else
//	if ((Sim2Type != 0x55)&&(Sim2Type !=0xaa )&&(Sim2Type !=0xbb))	 //判断Sim2卡类型
	{
		RST2 = 0;
		DelayCLKCount(500);
		Sim2Type = 0xbb;
		RST2 = 1;
		Test_Count = TESTCOUNTVALUE;
		ch = GetSCommChar0_Test(SIM2,0);
		if (ch == 0x3)
			Sim2Type = 0xaa;
		if (ch == 0x3b)
			Sim2Type = 0x55;
	} 

	if (SelectSimCard == SIM1)
	{
		if ((Sim1Type == 0x55) || (Sim1Type == 0xaa))
			SimType = Sim1Type;
		else
		{
			SelectSimCard = SIM2;
			SimType = Sim2Type;
		}
	}
	else
	{
		if (SelectSimCard == SIM2)
		{
			if ((Sim2Type == 0x55) || (Sim2Type == 0xaa))
			{
				SimType = Sim2Type;
			}
			else
			{
				SelectSimCard = SIM1;
				SimType = Sim1Type;
			}
		}
	}


         	//SendATR
	SCount = 0xf0;
	SendSCommStr0(RESET_ANSWER,10,ME);

	BootFlag = 1;
	SwitchCount = 0;
	FetchMenuFlag = 1;HOOKFlag = 1;
	for (;;)
	{	
		RST =  1;
		if (RST == 0) 	RSTSRC |= 0x10;	//软件强制复位
		for (i=0; i<5; i++)
		{
			Header[i] = GetSCommChar0(ME,0);
		}
		if (Header[0] != 0xA0)
		{
			StatusWord[0] = 0x6e; StatusWord[1] = 0x00;  
		  	SendSCommStr0(StatusWord,2,ME);
		}		
		if (Header[0] == 0xA0)
		{
			switch (Header[1])
			{
		//IN
				case 0x12:			//MenuFetch
									//设置菜单
					FetchMenuFlag = 1;
					ReadyToSendDataLength = 0;
					if (Header[4] == MENULENGTH)
					{
						HOOKFlag = 0;
						if (MenuType == 1)
							ptr = DSimMenu1;
						else
							ptr = EDSimMenu1;
						SendSCommStr0(ptr,DSML1,ME);
						SendCount();

						ptr += DSML1;//DSimMenu2;

						SendSCommStr0(ptr,DSML2,ME);

						ptr += DSML2;//Dsim1;
						SendSCommStr0(ptr,DS1-1,ME);

						if (SelectSimCard == SIM1)
						{
							if (SwitchFlag == 0)
								i = 0x2a;	//'*'
							else
								i = 0x21;   //'!'
						}
						else
						{
							if (Sim1Type == 0xbb)
								i = 0x3F;  //'?'
							else
								i = 0x20;

						}
						SendSCommChar0(i,ME);

						ptr += DS1;//Dsim2;

						SendSCommStr0(ptr,DS2-1,ME);
						if (SelectSimCard == SIM2)
						{
							if (SwitchFlag == 0)
								i = 0x2a;	//'*'
							else
								i = 0x21;   //'!'
						}
						else
						{
							if (Sim2Type == 0xbb) 
								i = 0x3F;  //'?'
							else
								i = 0x20;
						}
						SendSCommChar0(i,ME);
						
						ptr += DS2;//Dsim3;
						
						SendSCommStr0(ptr,DS3-1,ME);
						if (SwitchFlag == 1)
							i = 0x2a;
						else
							i = 0x20;
						SendSCommChar0(i,ME);

						ptr += DS3;//Dsim4;
						
						SendSCommStr0(ptr,DS4-1,ME);
						if ((SwitchSpeed == EXPRESS) && (SwitchFlag == 1))
							i = 0x2a;
						else
							i = 0x20;
						SendSCommChar0(i,ME);

						ptr += DS4;//Dsim5;
						SendSCommStr0(ptr,DS5-1,ME);
						if ((SwitchSpeed == NORMAL) && (SwitchFlag == 1))
							i = 0x2a;
						else
							i = 0x20;
						SendSCommChar0(i,ME);

						ptr += DS5;//Dsim6;
						
						SendSCommStr0(ptr,DS6-1,ME);
						if ((SwitchSpeed == SLOW) && (SwitchFlag == 1)) 
							i = 0x2a;
						else
							i = 0x20;
						SendSCommChar0(i,ME);

						ptr += DS6;//Dsim7;
						SendSCommStr0(ptr,DS7,ME);
		
						AnswerNoData();
						if (FlagCommandStatus == 0) FlagCommandStatus = 1;
					}
					else
					{
						SendSCommChar0(Header[1],ME);
						if ((FlagToReset == 0x1) ||(BeginSwitchFlag == 0x1))
						{
							FlagToReset = 0x55; //???
							if ( BeginSwitchFlag == 0x1)
							{
								BeginSwitchFlag = 0x2; 			//改变完一次后在复位前不改变
								if (SelectSimCard == SIM1)
								{
								  	SelectSimCard = SIM2;
								}
								else
								{
								  	SelectSimCard = SIM1;
								}
								SaveData();
							}
						
		  					SendSCommStr0(TABLE_RESET,4,ME);	 //请求复位sim卡
							SendCount();
							SendSCommStr0(TABLE_RESET1,6,ME);
							AnswerNoData();			
						}
						else
						{
		  					SendSCommStr0(TABLE_SETPOLLT,4,ME);	//设置poll时间间隔(10s)
							SendCount();
							SendSCommStr0(TABLE_SETPOLLT1,0xa,ME);
							AnswerNoData();	
						}
	
					}
					break;
	
				case 0xF2:		  	//Status
					if (SwitchFlag == 1)   		//如果处于双号待机状态则计时
					{
						SwitchCount++;
						if (SwitchCount >= SwitchSpeed)
						{
							FetchMenuFlag = 1;	//申请复位
							FlagToReset = 0x1;
							if (ResetFailFlag == 0) BeginSwitchFlag = 1;
							else
							{
								if (SelectSimCard == SIM1)
								{
								  	SelectSimCard = SIM2;
								}
								else
								{
								  	SelectSimCard = SIM1;
								}
								SaveData();
								break;
							}
						}
						else
						{
						 	if (FlagCommandStatus <= 0x2) FetchMenuFlag = 1;
						}
					}

⌨️ 快捷键说明

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