⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -