📄 main.c
字号:
//------------------------------------------------------------------------------------
// - 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 + -