void KeySet ( void )
{
extern union usart_msg Rx_MSG, Tx_MSG;
unsigned int data0,data1,dtemp0,dtemp1;
unsigned long dlong0;
unsigned char pass;
Tx_MSG._xMsgClASS = Rx_MSG._xMsgClASS;
Tx_MSG._xMsgCODE = Rx_MSG._xMsgCODE;
Tx_MSG._xMsgID = Rx_MSG._xMsgID;
data0 = Rx_MSG._data[0];
data1 = Rx_MSG._data[1];
switch ( Rx_MSG._xMsgCODE)
{
case '1' ://写编号
{
dtemp0 = E2promRD_word( ADDR_DEF_KeyID);
if (dtemp0==0)
{
E2promWR_word( ADDR_DEF_KeyID ,data0);
srand(data0);
dtemp0 = rand();
E2promWR_word( ADDR_DEF_KeyWords ,dtemp0);
}
data1 = 0;
break;
}
case '2' ://读编号
{
data0 = E2promRD_word( ADDR_DEF_KeyID);
data1 = 0;
break;
}
case '3' ://读KEY原码
{
data0 = E2promRD_word( ADDR_DEF_KeyWords);
data1 = 0;
break;
}
case '4' ://
{
pass = 0;
dtemp0 = E2promRD_word( ADDR_DEF_KeyErro);
dtemp1 = E2promRD_word( ADDR_DEF_KeyID);
if((dtemp0<=10)&&(dtemp1!=0))
{
dtemp1 = E2promRD_word( ADDR_DEF_KeyWords);
if (data0 == dtemp1+7)
{
AddOutSpare (2);
pass = 1;
}
if(pass==0)
{
dtemp0 = KeyWords1(dtemp1)+1217;
if (data0 == dtemp0)
{
AddOutSpare (5000);
pass = 1;
}
}
if(pass==0)
{
dtemp0 = KeyWords2(dtemp1)+1217;
if (data0 == dtemp0)
{
AddOutSpare (20000);
pass = 1;
}
}
if(pass==0)
{
dtemp0 = KeyWords3(dtemp1)+1217;
if (data0 == dtemp0)
{
AddOutSpare (50000);
pass = 1;
}
}
if(pass)
{
dtemp0 = E2promRD_word( ADDR_DEF_KeyWords);
dtemp1 = E2promRD_word( ADDR_DEF_KeySum);
dtemp0 += dtemp1;
srand(dtemp0 );
dtemp1 = rand();
E2promWR_word( ADDR_DEF_KeyWords ,dtemp1);
E2promWR_word( ADDR_DEF_KeyErro ,0);
}
else
{
dtemp0 = E2promRD_word( ADDR_DEF_KeyErro);
E2promWR_word( ADDR_DEF_KeyErro ,dtemp0+1);
}
}
else
{
data0 = 0;
data1 = 0;
}
break;
}
case '5' ://读
{
data0 = E2promRD_word(ADDR_DEF_KeySum);
data1 = E2promRD_word(ADDR_DEF_KeySum+2);
break;
}
case '6' ://读
{
data0 = E2promRD_word(ADDR_DEF_KeySpare);
data1 = E2promRD_word(ADDR_DEF_KeySpare+2);
break;
}
case '7' ://读
{
data0 = E2promRD_word(ADDR_DEF_KeyErro);
data1 = 0;
break;
}
}
Tx_MSG._data[0] = (unsigned int )data0;
Tx_MSG._data[1] = (unsigned int )data1;
}
void KeyInitial(void)
{
unsigned int dtemp0 ,dtemp1;
dtemp0 = E2promRD_word( ADDR_DEF_KeyID);
if (dtemp0==0xFFFF)
{
E2promWR_word( ADDR_DEF_KeyID ,0);
E2promWR_word(ADDR_DEF_KeySum ,0);
E2promWR_word(ADDR_DEF_KeySum+2 ,0);
E2promWR_word(ADDR_DEF_KeySpare ,65000);
E2promWR_word(ADDR_DEF_KeySpare+2 ,0);
E2promWR_word(ADDR_DEF_KeyErro ,0);
E2promWR_word(ADDR_DEF_KeyWords ,0);
}
}
//成功输出1次后输出1,否则输出0
unsigned int OutState;
unsigned char OutMonitor(void)
{
unsigned int dtemp0 ;
if (SG_org == 1) //原点
OutState = 0;
else
{
dtemp0 = SpiRead(ADDR_OutState);
if ((dtemp0 == 0x0002)&&(OutState == 0))
OutState = 1;
else if ((dtemp0 == 0x0001)&&(OutState == 1))
OutState = 2;
else if ((dtemp0 == 0x0002)&&(OutState == 2))
OutState = 3;
else if ((dtemp0 == 0x0002)&&(OutState == 3))
OutState = 0;
}
if (OutState==3)
return(1);
else
return(0);
}
//将输出总数加data
void AddOutSum(unsigned char data)
{
unsigned int dtempR0 ,dtempR1 ;
unsigned int dtempW0 ,dtempW1 ;
unsigned long dtemp0=0;
dtempR0 = E2promRD_word(ADDR_DEF_KeySum);
dtempR1 = E2promRD_word(ADDR_DEF_KeySum+2);
dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;
dtemp0 += (unsigned long)data;
dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;
E2promWR_word(ADDR_DEF_KeySum ,dtempW0);
if (dtempW1!=dtempR1)
E2promWR_word(ADDR_DEF_KeySum+2 ,dtempW1);
}
//将余数输出总数减去data
//余数等于0时,输出0,否则输出1;
unsigned char DecOutSpare(unsigned int data)
{
unsigned long dtempR0 ,dtempR1;
unsigned long dtempW0 ,dtempW1;
unsigned long dtemp0=0;
dtempR0 = E2promRD_word(ADDR_DEF_KeySpare);
dtempR1 = E2promRD_word(ADDR_DEF_KeySpare+2);
dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;
if(dtemp0>=data)
dtemp0 -= (unsigned long)data;
else
dtemp0 = 0;
dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;
E2promWR_word(ADDR_DEF_KeySpare ,dtempW0);
if (dtempW1!=dtempR1)
E2promWR_word(ADDR_DEF_KeySpare+2 ,dtempW1);
if(dtemp0==0)
return(0);
else
return(1);
}
//将余数输出总数加上data
//余数等于0时,输出0,否则输出1;
void AddOutSpare(unsigned int data)
{
unsigned int dtempR0 ,dtempR1;
unsigned int dtempW0 ,dtempW1;
unsigned long dtemp0=0;
dtempR0 = E2promRD_word(ADDR_DEF_KeySpare);
dtempR1 = E2promRD_word(ADDR_DEF_KeySpare+2);
dtemp0 += dtempR1;
dtemp0 <<= 16;
dtemp0 += dtempR0;
if(dtemp0>=0xFFFFFFFF)
dtemp0 = 0xFFFFFFFF;
else
dtemp0 += (unsigned long)data;
dtempW0 = dtemp0;
dtempW1 = dtemp0>>16;
E2promWR_word(ADDR_DEF_KeySpare ,dtempW0);
if (dtempW1!=dtempR1)
E2promWR_word(ADDR_DEF_KeySpare+2 ,dtempW1);
}
unsigned int RightMoveR(unsigned int data,unsigned int n)
{
unsigned long dtemp0 ;
unsigned char i;
dtemp0 = data;
for(i=0;i<n;i++)
{
if (dtemp0&0x01)
dtemp0 |= 0x10000;
dtemp0 = dtemp0 >> 1;
}
return(dtemp0);
}
unsigned int LeftMoveR(unsigned int data,unsigned int n)
{
unsigned long dtemp0;
unsigned char i;
dtemp0 = data;
for(i=0;i<n;i++)
{
dtemp0 = dtemp0 << 1;
if (dtemp0&0x10000)
dtemp0 |= 0x01;
}
return(dtemp0);
}
unsigned int KeyWords1(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=1;
unsigned char i;
dtemp0 = RightMoveR(data,1);
dtemp1 = LeftMoveR(data,1);
dtemp1 += dtemp0;
dtemp0 = 0;
for(i=0;i<16;i++)
{
if(data&b)
dtemp0++;
b <<= 1;
}
dtemp1 += dtemp0;
return(dtemp1);
}
unsigned int KeyWords2(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=2;
unsigned char i;
dtemp0 = RightMoveR(data,2);
dtemp1 = LeftMoveR(data,2);
dtemp1 += dtemp0;
dtemp0 = 0;
for(i=0;i<16;i++)
{
if(data&b)
dtemp0++;
b <<= 1;
}
dtemp1 += dtemp0;
return(dtemp1);
}
unsigned int KeyWords3(unsigned int data)
{
unsigned int dtemp0 ,dtemp1;
unsigned int b=3;
unsigned char i;
dtemp0 = RightMoveR(data,3);
dtemp1 = LeftMoveR(data,3);
dtemp1 += dtemp0;
dtemp0 = 0;
for(i=0;i<16;i++)
{
if(data&b)
dtemp0++;
b <<= 1;
}
dtemp1 += dtemp0;
return(dtemp1);
}