📄 main.c
字号:
SendISD1730CmnCmd(PWR_UP_ISD);
Delay10ms();
ClrWdt();
WrApcReg(0x40, 0x04);
SendISD1730CmnCmd(WR_NVCFG);
Delay10ms();
SendISD1730CmnCmd(PWR_DOWN);
ClrWdt();
}
/*******************************************************************************
*函 数 名: void RstUsrPwd(void)
*功 能: 等待辅助CPU复位,并向辅助CPU发送是否开启继电器的信息
*输入参数: 无
*输出参数: 无
*返 回 值: 无
*其它说明: .
*修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*2006-10-30 0.0000 涂常亮 第一次编写
*******************************************************************************/
void RstUsrPwd(void)
{
#define CHECK_RST_PWD_TMS 0x8000
UInt uiTmp;
uchar ucTmp = 0;
if ((0xA6 != ReadByte(EEPROM_ADD_0xA6))
|| (0x1B != ReadByte(EEPROM_ADD_0x1B))
|| (0xAC != ReadByte(EEPROM_ADD_0xAC))
|| (0xD8 != ReadByte(EEPROM_ADD_0xD8))
|| (0xC0 != ReadByte(EEPROM_ADD_0xC0))
) ///防止EEPROM出错,加入随机值
{
/*WriteByte(OUT_GUARDING, EEPROM_ADD_ARM_STATU);
WriteByte(0, EEPROM_ADD_TEL_EXIST);
WriteByte(0x12, EEPROM_ADD_USER_ID);
WriteByte(0x34, EEPROM_ADD_USER_ID + 1);
*/
DisWdt(); //恢复出厂会开看门狗的
PageFill(0xFF, 0, 255); ///全部写了0xFF,那还怎么搞
WriteByte(0, EEPROM_ADD_TEL_EXIST);
RstAllSettings();///恢复密码时检测一下EEPROM的正确性,EEProm出问题的话,还会重新复位一下24C04
//恢复密码
WriteByte(0x12, EEPROM_ADD_USER_PWD);
WriteByte(0x34, EEPROM_ADD_USER_PWD + 1);///恢复出厂密码为1234
PageFill(0xFF, EEPROM_ADD_GUEST_PWD, NUM_GUEST_PWD * BYTE_PER_PWD); //和LHD6000一致 ///将操作密码区清1
ClrWdt();
}
else
if (!pin_RstUsePwd)
{
for (uiTmp=0; uiTmp<CHECK_RST_PWD_TMS; uiTmp++)
{
if (pin_RstUsePwd)
{
ucTmp++;
if (50 > ucTmp)
{
break;
}
}
else
{
ucTmp = 0;
}
ClrWdt();
}
if (uiTmp >= CHECK_RST_PWD_TMS)
{
//恢复密码
WriteByte(0x12, EEPROM_ADD_USER_PWD);
WriteByte(0x34, EEPROM_ADD_USER_PWD + 1);
PageFill(0xFF, EEPROM_ADD_GUEST_PWD, NUM_GUEST_PWD * BYTE_PER_PWD); //和LHD6000一致
ClrWdt(); //24C04 datasheet 说写入有可能用10ms,而 W78E54B watchdog 是35.5ms
}
//WriteByte(NO, EEPROM_ADD_LCKG_PWD); //取消不能执行需要密码类操作的限制 //2006-12-11
}
#undef CHECK_RST_PWD_TMS
}
/*******************************************************************************
*函 数 名: void InitAux(void)
*功 能: 等待辅助CPU复位,并向辅助CPU发送是否开启继电器的信息
里面涉及到命令的反复确认。
*输入参数: 无
*输出参数: 无
*返 回 值: 无
*其它说明: ///?????????
*修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*2006-10-30 0.0000 涂常亮 第一次编写
*******************************************************************************/
void InitAux(void)
{
uchar ucTimer; ///计时中间变量
pin_RstAux = !RST_AUX;///多余吧,前面已经置低了。
IE0 = 0;
EX0 = 1; ///开了外部中断0,准备接收辅助CPU发送数据过来
//等待辅助CPU开始工作//之前一定要开中断0
//while (1) // !! 不使用复位线时不能等待
//if (!FlagInitd)
{
g_ucAuxTm = 0; ///辅助CPU
ET0 = 0; ///关定时计数器0中断
ucTimer = time0_counter;
while ((((uchar)time0_counter)-ucTimer) < 100) //如果辅助CPU没复位等待1s
{
ET0 = 1; ///重新打开定时
WatchAux();///辅助CPU丢失,可能会卡在这里
if (!g_FlagAuxMsgProcessed)///有辅助CPU数据需要处理
{
g_FlagAuxMsgProcessed = 1; ///没有辅助CPU数据需要处理
if (0x24 == g_aucAuxRecvdBuff[0]) ///通知主CPU可以工作了
{
g_ucAuxTm = 0;///复位
WriteByte(g_aucAuxRecvdBuff[1], EEPROM_ADD_AUX_VER); ///把版本号保存起来
g_FlagHasAuxMsgSend = 0;///没有辅助CPU数据需要发送
while (g_FlagSendgAuxMsg);///等待辅助CPU数据发送完 ///这句可以去掉???
g_aucAuxSendgBuff[0] = AUX_CMD_RECV_OK_H; //g_aucAuxSendBuff[0] = AUX_CMD_RECV_OK_H;
g_aucAuxSendgBuff[1] = AUX_CMD_RECV_OK_L; //g_aucAuxSendBuff[1] = AUX_CMD_RECV_OK_L;
//g_FlagHasAuxMsgSend = 1;
g_aucRepeatAuxMsg[0] = TIMES_AUX_CMD_REPEAT; //g_aucRepeatAuxMsg[1] = TIMES_AUX_CMD_REPEAT;
//SetAuxMsg();
AuxSendStart();///开始发送辅助CPU数据之前的准备
while (0 != g_aucRepeatAuxMsg[0]); //等待三遍发送结束
while (g_FlagSendgAuxMsg); //等待最后一遍发送完成
break; ///发送3次后,难道就认为发送出去成功了吗???
///辅助CPU初始化成功了,就跳出1s的等待。
}
}
ET0 = 0;///关掉定时器,避免把(((uchar)time0_counter)-ucTimer) < 100计算的时间也算到1S内
}
ET0 = 1;///复位成功,打开定时器
ClrWdt();
}
g_FlagHasAuxMsgSend = 0;///没有数据需要发送给辅助CPU
if ((3 == g_ucRelayType) && (!IS_LAX_GUARDING))///???继电器输出类型3是干啥用。
{ //开启继电器/// 不在撤防状态
g_aucAuxSendgBuff[1] = 0x03;
}
else
{
g_aucAuxSendgBuff[1] = 0x04;///关继电器
}
g_aucAuxSendgBuff[0] = 0x20;
g_aucRepeatAuxMsg[0] = 1; ///发送重复次数
while (g_FlagKBIDSendg || g_FlagKBIDSendg || g_FlagTokenSending);///等键盘或令牌发送完
AuxSendStart(); ///辅助CPU开始发送
g_FlagAuxMsgProcessed = 1;///没有辅助CPU数据需要发送
g_ucWatchAuxTimer = 2; ///2秒没有收到辅助CPU数据需要发送应该复位
ucTimer = time0_counter;
while (1) //辅助CPU不在不要启动
{
if (!g_FlagAuxMsgProcessed) ///有辅助CPU数据需要处理
{
g_FlagAuxMsgProcessed = 1;///置1
if ((0x08 == g_aucAuxRecvdBuff[1]) && (0x28 == g_aucAuxRecvdBuff[0]))
{ ///命令接收正确回复
g_aucRepeatAuxMsg[0] = 0; ///重复发送次数为0
break; ///辅助CPU把命令接收成功,则跳出
}
else if (0x24 == g_aucAuxRecvdBuff[0])
{ while (g_FlagSendgAuxMsg);///等串口把辅助CPU数据发完
g_aucAuxSendgBuff[0] = AUX_CMD_RECV_OK_H; ///辅助CPU命令接收正确
g_aucAuxSendgBuff[1] = AUX_CMD_RECV_OK_L;
g_aucRepeatAuxMsg[0] = 1;
AuxSendStart();
while (0 != g_aucRepeatAuxMsg[0]); //等待三遍发送结束
while (g_FlagSendgAuxMsg); //等待最后一遍发送完成
}
if ((3 == g_ucRelayType) && (!IS_LAX_GUARDING))
{ //开启继电器
g_aucAuxSendgBuff[1] = 0x03;
}
else
{
g_aucAuxSendgBuff[1] = 0x04;
}
g_aucAuxSendgBuff[0] = 0x20;
g_aucRepeatAuxMsg[0] = 1;
AuxSendStart();
}
if (0 == g_aucRepeatAuxMsg[0])
{
g_aucRepeatAuxMsg[0] = 1;
}
if ((((uchar)time0_counter)-ucTimer) > 150)
{
EA = 0;
g_ucWatchAuxTimer = 0;
}
WatchAux(); //Delay87us();
}
g_FlagAuxOK = 1;
// !! 不使用复位线,本身复位后需向U201发送一次防区信息重发命令
g_aucAuxSendBuff[0] = 0x31; //撤防命令来重置报警相关变量
g_aucAuxSendBuff[1] = 0x01;
g_aucRepeatAuxMsg[1] = TIMES_AUX_CMD_REPEAT;
g_FlagHasAuxMsgSend = 1;
g_ucAuxTm = 0; ///g_ucAuxTm变量理解模糊
}
/*******************************************************************************
*函 数 名: void ProcessKBMsg(void)
*功 能: 处理键盘信息
*输入参数: 无
*输出参数: 无
*返 回 值: 无
*其它说明: 将g_aucKBRecvdBuff[]的值读出来,进行判断并执行。
*修改日期 版本号 修改人 修改内容
*-----------------------------------------------------------------------
*2006-10-30 0.0000 涂常亮 第一次编写
*******************************************************************************/
void ProcessKBMsg(void)
{
bit FlagKBExeOK = 1;///键盘执行OK标志
//存放本次电话号码的起始地址//修改两个密码时各借用一次
UInt uiAdd_PKBMsg; //如果修改了用户电话的存放地址,可能要将类型改为整形
///
uchar ucTmp_PKBMsg;
uchar ucZoneNum_PKBMsg;
{
//锁定密码时只接收报警
if (g_FlagLckgPwd && !((0x13 == g_aucKBRecvdBuff[2])
|| ((0x24 == g_aucKBRecvdBuff[2]) && (0x04 == g_aucKBRecvdBuff[3]))
|| ((0x12 == g_aucKBRecvdBuff[2]) && (0x03 != g_aucKBRecvdBuff[3])) ) ) //2006-10-7
{ ///密码锁定 且没有紧急报警没有从主cPU读辅助CPU版本信息没有撤防操作(有点乱)
g_aucKBRecvdBuff[2] = 0; ///???
g_aucKBRecvdBuff[3] = 0; ///???
}
switch (g_aucKBRecvdBuff[2]) ///
{
case 0x11: ///传电话号码
///***************用户地址设置
if (0x0A == g_aucKBRecvdBuff[3])
{ //修改用户ID
if (IsBCD(g_aucKBRecvdBuff[4]) && IsBCD(g_aucKBRecvdBuff[5]))
{
;
}
else
{
FlagKBExeOK = 0; ///电话个数和电话号码不是BCD码,则回复命令执行错误。
break;
}
///将用户地址写进eeprom
if (2 == PageWrite(g_aucKBRecvdBuff + 4, EEPROM_ADD_USER_ID, 2))
{ ///将两个字节成功写入了
g_ucUserIDH = g_aucKBRecvdBuff[4];
g_ucUserIDL = g_aucKBRecvdBuff[5];
}
}
///*****************修改电话号码
else if ((0 != g_aucKBRecvdBuff[3]) && (6 >= g_aucKBRecvdBuff[3]))
{ //修改电话号码
uiAdd_PKBMsg = g_aucKBRecvdBuff[3] * BYTES_PER_TEL
+ EEPROM_ADD_TEL - BYTES_PER_TEL; //号码起始地址
///得出号码起始地址
//验证是否全是压缩BCD码
if (0 == g_aucKBRecvdBuff[4]) ///清除电话号码
{ ///电话号码位数为0
ucTmp_PKBMsg = LOCATN_KB_CMDL + 2;///???
}
else///修改电话号码
{
for (ucTmp_PKBMsg = LOCATN_KB_CMDL + 2;
LOCATN_KB_CMDL + 2 + (BCD_Hex(g_aucKBRecvdBuff[4]) - 1)/2 >= ucTmp_PKBMsg;
ucTmp_PKBMsg++)///???
{
if (!IsBCD(g_aucKBRecvdBuff[ucTmp_PKBMsg])) ///电话号码BCD码判断
{
FlagKBExeOK = 0;
break;
}
}
}
//不足部分改为0xFF //号码长度为零清除电话号码部分不再需要
//为奇数清后半部分
if (1 == (g_aucKBRecvdBuff[4] % 2))
{
g_aucKBRecvdBuff[ucTmp_PKBMsg - 1] |= 0x0F; ///执行前面的for语句,ucTmp_PKBMsg已经加到最大了
}
//ucTmp_PKBMsg 可以不用重新赋值,接上面的值
//for (ucTmp_PKBMsg = LOCATN_KB_CMDL + 2 + BCD_Hex(g_aucKBRecvdBuff[4])/2;
//KB_RECV_BUFF_LEN > ucTmp_PKBMsg; ucTmp_PKBMsg++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -