📄 receiver.c
字号:
/*######################################################################*/
#define __DEFINE_REGISTERS_STVD7_INCLUDE__
#include "ST72324BLK2.h"
#include "Head.h"
#include "Variables.h"
#include "Subroutine.h"
#undef __DEFINE_REGISTERS_STVD7_INCLUDE__
/*-----------------------------------------------------------------------*/
extern enum outputmode OutputMode;
@interrupt void ReceiverInt (void)
{
unsigned char Temp;
TempBuff0=(TBCR>>6); // /64
if(TempBuff0>135) //2.2ms
{
CodeLength=32;
goto Next1;
}
if(!(PCDR&BIT2))
goto Next1;
else if(TempBuff0<7 )
goto Next1;/*if <120us*/
else
Receive();
Next1:
Temp=TBCSR;
TBACLR=0; //reset TB counter
Temp=TBIC1LR;
Temp=TBIC2LR;
}
void Receive(void)
{
if (TempBuff0<25) //<400us
{
ReceiveBuff=((ReceiveBuff<<1)+1);
if(!(--CodeLength))
{
ReceivedCode=1;
CodeLength=32;
ReceiveBuff0=ReceiveBuff;
}
}
else if (TempBuff0<45) //<720us
{
ReceiveBuff=(ReceiveBuff<<1);
if(!(--CodeLength))
{
ReceivedCode=1;
CodeLength=32;
ReceiveBuff0=ReceiveBuff;
}
}
else
{
ReceivedCode=0;
CodeLength=32;
} /*error exit*/
}
/*------------------------------------------------------------------------
// after received a code handle
------------------------------------------------------------------------*/
void ReceiptDataHandle(void)
{
static unsigned int TempSyncroCode1;
static unsigned char SameSyncroCode;
unsigned int long TempIntLong0;
unsigned char *p0,i,j=0,k,l=0,n;
enum commandtype{Useless,LockDoor=7,UnlockDoor=9,SearchMyCar=0x03,SearchKey=0xc,ReturnIDCode=0x0a}CommandType;
if(Port_Learn_AT && !Flag_Learn0)
{
TempIntLong0=(unsigned int long)ReturnIDCode;
TempIntLong0=Encryption(ReceiveBuff0,TempIntLong0,UnEncrypt);
if((unsigned char)(TempIntLong0>>24)==0x12)
{
IDCode1=TempIntLong0;
TempSyncroCode1++; //change TempSyncroCode1
Flag_Learned=1;
}
return;
}
TempIntLong0=Encryption(ReceiveBuff0,IDCode0,UnEncrypt);
p0=(unsigned char*)&TempIntLong0;
CommandType=*(p0)&0x0f;
j=*p0+*(p0+1)+*(p0+2)+*(p0+3);
j&=0x0f;
k=(*(p0)>>4);
if(j==k)
{
if((unsigned char)(TempIntLong0>>16)&BIT7)
j=1;
else
j=0;
TempIntLong0&=0X007FFFFF;
if(TempIntLong0-SyncroCode0>100)
{
if((unsigned int)TempIntLong0-TempSyncroCode1<5 && (unsigned int)TempIntLong0!=TempSyncroCode1 )
{
++RecoverySyncode;
if((signed)(TempIntLong0-SyncroCode0)>0)
goto Recoery0;
else if(RecoverySyncode>=3) //must <= 7
{
Recoery0:
RecoverySyncode=0;
SyncroCode0=TempIntLong0;
if(IDCode1==IDCode0)
SyncroCode1=TempIntLong0;
}
return;
}
else
{
TempSyncroCode1=TempIntLong0;
return;
}
}
else
{
Port_Test_Toggle;
if(Flag_Position)
AutoLockTimer=(4*4+1);
else
AutoLockTimer=(4*4+1);
Flag_FaseCheck=0;
Flag_WaitingACK=0;
Flag_FirstLossKey=0;
TxLFClk=0;
RecoverySyncode=0;
if(j)
Flag_Key_Battery_Low=1;
if( (CommandType==LockDoor)
|| (CommandType==UnlockDoor)
|| (CommandType==SearchMyCar)
)
Status&=~WhichKey;
if(SyncroCode0!=TempIntLong0)
Flag_Store_SyncroCode0=1;
if(TempIntLong0==SyncroCode0)
Flag_SameSyncroCode=1;
else
Flag_SameSyncroCode=0;
SyncroCode0=TempIntLong0;
}
}
else
{
TempIntLong0=Encryption(ReceiveBuff0,IDCode1,UnEncrypt);
p0=(unsigned char*)&TempIntLong0;
CommandType=*(p0)&0x0f;
j=*p0+*(p0+1)+*(p0+2)+*(p0+3);
j&=0x0f;
k=(*(p0)>>4);
if(j==k)
{
if((unsigned char)(TempIntLong0>>16)&BIT7)
j=1; // battery low flag set
else
j=0;
TempIntLong0&=0X007FFFFF;
if(TempIntLong0-SyncroCode1>100)
{
if((unsigned int)TempIntLong0-TempSyncroCode1<5 && (unsigned int)TempIntLong0!=TempSyncroCode1)
{
++RecoverySyncode;
if((signed)(TempIntLong0-SyncroCode1)>0)
goto Recovery1;
else if(RecoverySyncode>=6) //must <= 7
{
Recovery1:
RecoverySyncode=0;
SyncroCode1=TempIntLong0;
if(IDCode1==IDCode0)
SyncroCode0=TempIntLong0;
}
return;
}
else
{
TempSyncroCode1=TempIntLong0;
return;
}
}
else
{
if(Flag_Position)
AutoLockTimer=(4*4+1);
else
AutoLockTimer=(4*4+1);
Flag_FaseCheck=0;
Flag_WaitingACK=0;
Flag_FirstLossKey=0;
TxLFClk=0;
RecoverySyncode=0;
if(j)
Flag_Key_Battery_Low=1;
if( (CommandType==LockDoor)
|| (CommandType==UnlockDoor)
|| (CommandType==SearchMyCar)
)
Status|=WhichKey;
if(SyncroCode1!=TempIntLong0)
Flag_Store_SyncroCode1=1;
if(TempIntLong0==SyncroCode1)
Flag_SameSyncroCode=1;
else
Flag_SameSyncroCode=0;
SyncroCode1=TempIntLong0;
}
}
else
return;
}
if(OutputMode==Alarm) //如果报警中,停止
{
Port_Horn_0;
Port_Lamp_0;
OutputMode=IDLE;
Flag_Door_Alarmed=0;
Flag_ACC_Alarmed=0;
}
if(CommandType==SearchKey)
{
if(OutputMode==SearchCar)
{
OutputCtrl(IDLE,0);
}
else if(Status&InGuard && SystemTimer>=4 &&!(Status&(ShutOffPKE+DisablePKE)))
{
if(!Flag_SameSyncroCode)
{
Status&=~InGuard;
SystemTimer=0;
OutputCtrl(LockOff,4);
}
}
return;
}
else // 如果相同的同步码,遥控器相同的按键常按,退出
{
if(SameSyncroCode==(unsigned char)TempIntLong0)
return;
else
SameSyncroCode=(unsigned char)TempIntLong0;
}
TxLFClk=0;
//关闭PKE功能
if(Flag_DisablePKESetting)
{
if(CommandType==LockDoor)
{
OutputCtrl(SwitchPKE,4);
Status|=ShutOffPKE;
}
else if(CommandType==UnlockDoor)
{
OutputCtrl(SwitchPKE,2);
Status&=~ShutOffPKE;
}
DiablePKETimer=0;
return;
}
AlarmTimes=0;
if(CommandType==LockDoor)
{
if(Port_ACC_Trig && !(Status&InGuard))
{
if(OutputMode!=ACCLockOn)
OutputCtrl(ACCLockOn,2);
}
else if(OutputMode!=LockOn)
{
Status|=InGuard;
SystemTimer=0;
OutputCtrl(LockOn,2);
Status|=DisablePKE;
if(Flag_RollWindow_Allow)
{
EnableRollUpWindow=1;
Flag_RollWindow_Allow=0;
}
}
}
else if(CommandType==UnlockDoor)
{
if(Port_ACC_Trig && !(Status&InGuard))
{
if(OutputMode!=ACCLockOff)
OutputCtrl(ACCLockOff,2);
}
else if(OutputMode!=LockOff )
{
if(Status&ShutOffPKE && Status&InGuard) // Guard mode and PKEOFF,if within 20s no trigger will return guard mode
{
Flag_WrongUnlockCHecking=1;
WrongUnlockCHeckingTimer=0;
Flag_WrongUnlockTrig=0;
}
Status&=~InGuard;
SystemTimer=0;
OutputCtrl(LockOff,8);
}
}
else if(CommandType==SearchMyCar)
{
if(OutputMode!=SearchCar && !Port_ACC_Trig)
OutputCtrl(SearchCar,16);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -