📄 caralarm.c
字号:
#include "ht48r30a-1.h"
#define Arm 0x02
#define Disarm 0x01
#define Mute 0x04
#define Find 0x08
#define Arm_Disarm 0x03
#define AccInput _pc4//_pd0//_pc4
#define SCL_C _15_7//5//7
#define SDA_C _15_4
#define SCL _pb7//5//_pb7
#define SDA _pb4
#define RF _pb3
#define VibInput _pb2
#define TrunkInput _pb1
#define LearnKey _pb0
#define GateInput _pa7
#define LED _pa6
#define OpenLock _pa4
#define CloseLock _pa5
#define PowerOff _pa3
#define Bugle _pa2
#define Light _pa1
#define Sta _pa0
#define OpenTrunk Sta
#define _ton _0e_4
#define _24c_StartAddr 0x10
/*================================
System Program Register Bit
===============================*/
#define MuteModeF _28_0
#define DoorErrorNotWarningF _28_1
#define CenterTimeBit1 _28_2
#define CenterTimeBit0 _28_3
#define PassiveON_F _28_4
#define AutoCenterLockOFF _28_5
#define TrunkSetBit1 _28_6
#define TrunkSetBit0 _28_7
#define Jacking_ON _29_0
#define Guard_F _29_1
unsigned char SysValue1 @0x28;
unsigned char SysValue2 @0x29;
//================================
unsigned char data1 @0x2a;
unsigned char data2 @0x2b;
unsigned char data3 @0x2c;
unsigned char Rdata1 @0x2d;
unsigned char Rdata2 @0x2e;
unsigned char Rdata3 @0x2f;
//unsigned char RxBuff;
unsigned char AT24c_Addr;
unsigned char MCU_Addr;
unsigned char AddrBuf;
unsigned char WriteCnt;
unsigned char LedTime;
unsigned char LedTimeBackup;
unsigned char FlashTimes; //,FlashTimesBackup;
unsigned char FlashTimesBackup;
unsigned char LockTime;
unsigned char LightTime;
unsigned long KeyInputTime;
unsigned char KeyInputCnt;
unsigned char LearnKeyCnt;
unsigned char KeyDownTime;
unsigned char AutoLockTime;
unsigned char OnceTime;
unsigned char TwoTimes;
unsigned char GuardTime;
unsigned char TrunkTime;
unsigned char CheckVibDelay;
unsigned char LightON_OffTime;
unsigned long RepairTime;
unsigned char RepairCnt;
unsigned long AlarmTime;
unsigned long RobTime;
bit LightFlash_F;
bit VoletStatus_F;
bit ProgramSetMode_F;
bit Exit_ModeF;
bit AutoLock_F;
bit AutoUnlock_F;
bit DisBugleExit_F;
bit TimeOutF;
bit Program1_F;
bit Program2_F;
bit Program3_F;
bit WaitRemoteF;
bit Wait10s_F;
bit KeyDown2s_F;
bit KeyDownTimeF;
bit KeyOnceF;
bit DoKey1F;
bit DoKey2F;
bit DoKey3F;
bit VibrationF;
bit EnablePassiveF;
bit PassiveF;
bit ErrorPressRemoteF;
bit DoorWarningF;
bit DoubleUnlockF;
bit EnableVibF;
bit MuteF;
bit Rob0F;
bit Rob1F;
bit RobStatusF;
bit Trigger_F;//??
bit LedFlash_F;
bit LedAutoF;
bit RepairOperationF;
bit OpenTrunk_F;
bit CheckVibF;
bit FindF;
bit SysFlag;
bit AccON_F;
bit Flag0;
bit Flag1;
bit Flag2;
bit Flag3;
bit Flag4;
bit Free_F;
bit Lock_F;
bit UnLock_F;
bit Fast_F;
//bit Guard_F;
bit RFbit;
bit ReceiveRight_F;
/*//===================
bit MuteModeF;//bit ChirpsON_F;
bit DoorErrorNotWarningF;
bit CenterTimeBit1;
bit CenterTimeBit0;
bit PassiveON_F;
bit AutoCenterLockOFF;
bit TrunkSetBit1;
bit TrunkSetBit0;
bit Jacking_ON;
//===================*/
void CheckLearnKey(void); //宣告函数
void ReadMemory(unsigned char addr);
void WriteMemory(unsigned char *i,unsigned char k);
void BugleON(unsigned char i,unsigned char j);
void LightON();
void Delayms(unsigned char k);
void BiBugle(unsigned char z);
void Init()
{
_pa=0;
_pac=0b10000000;
_pb=0xff;
_pbc=0x0f;
_pc=0;
_pcc=0b00010000;
//_pd=0;
//_pdc=0xff;
Sta=0;VibInput=1;VibrationF=0;
// LightFlash_F=0;
// RepairOperationF=0;
CheckVibF=1;EnableVibF=1;
//-------------ProgramSetMode init ------//系统编程设置初始化
/*MuteModeF=0;//ChirpsON_F=0;
DoorErrorNotWarningF=0;
CenterTimeBit1=0;CenterTimeBit0=1;
AutoCenterLockOFF=0;
PassiveON_F=0;
TrunkSetBit1=0;TrunkSetBit0=1;
Jacking_ON=0;
Rob0F=0;Rob1F=0;
RobStatusF=0;*/
//---------------------------------------
}
void Receive(void)
{
unsigned char i;
unsigned char k;
if(RF)
{
i=0;
do
{_clrwdt();
_delay(50);
i++;
if(RF==0)
goto CountLow;
}while(i<10); //注意分号
goto Error;
}
else
{
CountLow:
i=0;
do
{_clrwdt();
_delay(100);
i++;
if(RF)
{k=24;
if(i>50)
goto RightStartBit;
}
}while(i<130);
goto Error;
}
RightStartBit:
i=0;
do
{
_clrwdt();
_delay(50);
i++;
if(RF==0) goto NextCount;
}while(i<26);
goto Error;
NextCount:
if(i<4) goto Error; //不到200us丢掉
if(i<10) {_c=0;RFbit=0;}
else {_c=1;RFbit=1;}
_rlc(&data3);
_rlc(&data2);
_rlc(&data1);
if(--k) goto WaitHigh;
//_nop(); //加本机遥控码比较
//_nop(); //0x10 //SysValue1 学习时恢复原厂默认设置,退出时保存WriteSys();
if(WaitRemoteF) {WriteMemory(&data1,AddrBuf);BiBugle(2);SysValue1=0x88;SysValue2=0;KeyInputTime=950;AccON_F=1;WriteCnt--;if(WriteCnt==0) {WaitRemoteF=0;KeyInputTime=0;}goto Error;}
i=4; //四个遥控
AddrBuf=_24c_StartAddr;//AddrBuf=0x10;
NextCode:
ReadMemory(AddrBuf);//(0x10);
if((data3&0xf0)==(Rdata3&0xf0))
{
if(data2==Rdata2)
if(data1==Rdata1)
{ _clrwdt();
ReceiveRight_F=1;
return;//return(ReceiveRight_F);
}
}
i--;
if(i) goto NextCode;
goto Error;
WaitHigh:
if(RFbit)
{
i=0;
do
{_clrwdt();
_delay(50);
i++;
if(RF) goto RightStartBit;
}while(i<10);
goto Error;
}
else
{
i=0;
do
{_clrwdt();
_delay(50);
i++;
if(RF) goto RightStartBit;
}while(i<26);
goto Error;
}
Error:
ReceiveRight_F=0;
return;//return(ReceiveRight_F);
}
/*****************************************
EEPROM
****************************************/
void Start()
{
WaitFree:
// SDA_C=1;
// SCL_C=1;
// if(SDA==1&SCL==1) goto free;
// else goto WaitFree;
//free:
SDA_C=0;
SCL_C=0; //Output
SDA=1;
_nop();
SCL=1;
_clrwdt();
_nop();
SDA=0;
_nop();
_nop();
SCL=0;
}
void Stop()
{
SDA_C=0;
SCL_C=0;
SDA=0;
_nop();
SCL=1;
_clrwdt();
_nop();
SDA=1;
}
char I2C_RX()
{
unsigned char i=8;
unsigned char RxBuff=0;
//RxBuff=0;
SDA_C=1;
SCL_C=0;
_nop();
//SDA=1;
_nop();
_nop();
do
{
SCL=1;
_nop();
_nop();
//SCL=0;
if(SDA) _c=1;
else _c=0;
_rlc(&RxBuff);
SCL=0;
_clrwdt();
_nop();
}while(--i); //注意i--,就循环9次了
//data1=RxBuff;
return(RxBuff);//(data1);
}
void I2C_TX( unsigned char TxBuff)
{
unsigned char i=8;
//unsigned char j;
//j=TxBuff;
SCL_C=0;
SDA_C=0;
do
{
_rlc(&TxBuff);
if(_c) SDA=1;
else SDA=0;
SCL=1;
_nop();
_nop();
SCL=0;
_nop();
_clrwdt();
_nop();
}while(--i); //注意i--,就循环9次了
//check ACK
SDA=1;
SDA_C=1;
//SCL_C=0;
//9th clock
_nop();
_nop();
_nop();
SCL=1;
_nop();
//SCL=0;////????不能加,SCL=0后,就没应答信号
_nop();
i=0xff;
while(i--)
{
_nop();
_clrwdt();
if(SDA==0)
goto ACK_OUT;
}
ACK_OUT:
_nop();
SCL=0;
}
void ReadMemory(unsigned char addr)
{
unsigned char *k,i;
k=&Rdata1;
for(i=0;i<3;i++) //读三个字节数据
{
AT24c_Addr=addr++;AddrBuf++;
//*k=ReadByte();k++;addr++;
Start();
I2C_TX(0b10100000);
I2C_TX(AT24c_Addr);
Start();
I2C_TX(0b10100001);
_clrwdt();
//_nop();
*k++=I2C_RX();//RxBuff=I2C_RX();
Stop();
//*k++=RxBuff;
}
}
void WriteMemory(unsigned char *i,unsigned char k)
{
unsigned char j;
for(j=0;j<3;j++) //写三个字节数据
{
MCU_Addr=*i++;
AT24c_Addr=k++;AddrBuf++;
//WriteByte();
Start();
I2C_TX(0b10100000);
I2C_TX(AT24c_Addr);
I2C_TX(MCU_Addr);
Stop();
Delayms(8);//12ms ;_delay(5000);
//i++;k++;
}
}
void ReadSys()
{ReadMemory(0);
SysValue1=Rdata1;SysValue2=Rdata2;
}
void WriteSys()
{data1=SysValue1;data2=SysValue2;data3=0;
WriteMemory(&data1,0);//AddrBuf);
}
/*********************************
********************************/
#pragma vector timer0 @0x08;
void timer0(void)
{
_tmr=0;
if(LedTime) LedTime--;
if(LockTime) LockTime--;
if(LightTime) LightTime--;
if(AccON_F)
{
if(KeyInputTime) KeyInputTime--;
else {AccON_F=0;LED=0;
if(AccInput) TimeOutF=1;//超时关钥匙中控自动化
if(DisBugleExit_F) //On/OFF 3 次,转为10s等待Volet按下
{if(Wait10s_F) {KeyInputTime=650;AccON_F=1;Wait10s_F=0;}
}//else LearnKeyCnt=0;KeyInputCnt=0;}
else //超时退出,无声提示必须DisBugleExit_F=1,有声必须DisBugleExit_F=0;
{Exit_ModeF=1;LearnKeyCnt=0;KeyInputCnt=0;}//DisBugleExit_F=1;}
}
}
if(KeyDownTimeF) {
if(KeyDownTime) KeyDownTime--;
else {KeyDownTimeF=0;KeyDown2s_F=1;}}
if(AutoLockTime) AutoLockTime--;
if(AlarmTime) AlarmTime--;
if(RobTime) RobTime--;
if(GuardTime) {if(--GuardTime==0) {Guard_F=1;SysFlag=1;PowerOff=1;if(VibInput) CheckVibF=1;else {CheckVibF=0;CheckVibDelay=190;}}}
if(RepairTime) RepairTime--;//维修时间 ` //设防时有振动则等待,直到没有振动后3s才扫描振动传感器
if(TrunkTime) TrunkTime--;
if(CheckVibDelay) {CheckVibDelay--;if(!VibInput) CheckVibDelay=190;}
else CheckVibF=1; //设防时有振动则等待,直到没有振动后3s才扫描振动传感器
if(LightON_OffTime) {if(--LightON_OffTime==0) {LightFlash_F=0;Light=0;}}
}
void Delayms(unsigned char k)
{
unsigned char i,j;
for(i=0;i<k;i++)
for(j=0;j<250;j++) _clrwdt();
}
/*void Delayus()
{}*/
/*void BugleON(unsigned char i,unsigned char j) //响i声,闪j下
{
unsigned char z;
(i<j)?(z=j):(z=i);
//if(i<j) z=j;
// else z=i;
while(z--){
if(!MuteModeF){if(!MuteF) {if(i) {i--;Bugle=1;}}}
if(j) {j--;Light=1;}Delayms(28);
Bugle=0;Delayms(41);Light=0;Delayms(70);} //(111);}
}*/
void BugleON(unsigned char i,unsigned char j) //响i声,闪j下
{
unsigned char k,z;
k=28;z=111;//if(Exit_ModeF) {k=28;z=200;}///
if(FindF) {k=100;z=200;} FindF=0;
LightTime=29;
if(j) {LightFlash_F=1;Light=1;}else LightFlash_F=0;
LightON_OffTime=j;
/*if(j==1) LightON_OffTime=43; //闪1次时间
if(j==2) LightON_OffTime=102; //闪2次时间
if(j==3) LightON_OffTime=161; //闪3次时间*/
//if(j==5) LightON_OffTime=255; //闪5次时间,出错
while(i--){ LightON();
if(!MuteModeF){if(!MuteF) Bugle=1;} Delayms(k);//Delayms(28);
Bugle=0;Delayms(z);} //Delayms(111);}
}
void BiBugle(unsigned char z) //响z声,闪z下
{
while(z--){
Bugle=1;Light=1;if(Exit_ModeF) Delayms(28);else Delayms(56);//(73);
Bugle=0;Light=0;if(Exit_ModeF) Delayms(200);else Delayms(100);}//(255);}
}
void Trunk()
{
if(TrunkTime!=0&&OpenTrunk_F==1) OpenTrunk=1;
else {if(!TrunkSetBit1||!TrunkSetBit0) OpenTrunk=0;OpenTrunk_F=0;}
}
void Lock()
{
if(LockTime!=0&&Lock_F==1) CloseLock=1;
else {CloseLock=0;Lock_F=0;}
}
void Unlock(void)
{
if(LockTime!=0&&UnLock_F==1) OpenLock=1;
else {OpenLock=0;UnLock_F=0;}
}
void LightON()
{
if(LightFlash_F)
{
if(!LightTime) { Light=!Light;LightTime=29;}
//else Light=0;
}
}
void LightOFF()
{
LightFlash_F=0;Light=0;//LightTime=0;
}
void AutoLock()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -