📄 sd8060.lst
字号:
42E 940E 05B1 CALL _I2C_Initial
(0396) AT24_Read((unsigned char *)&p_buf->Data,SystemConfig_Address,p_buf->Length-1);
430 01FB MOVW R30,R22
431 8181 LDD R24,Z+1
432 8192 LDD R25,Z+2
433 9701 SBIW R24,1
434 8388 STD Y+0,R24
435 2722 CLR R18
436 2733 CLR R19
437 018F MOVW R16,R30
438 5F0C SUBI R16,0xFC
439 4F1F SBCI R17,0xFF
43A 940E 0615 CALL _AT24_Read
(0397) I2C_Close();
43C 940E 05B6 CALL _I2C_Close
(0398) communication->pc_txd = 1;
43E E081 LDI R24,1
43F 01FA MOVW R30,R20
440 8381 STD Z+1,R24
(0399) }
441 C001 RJMP 0x0443
(0400) else if(TEST) CommandReply(RESP_INVALID_DATA); /*包长度异常*/
442 C000 RJMP 0x0443
(0401) }
443 9621 ADIW R28,1
444 940C 0DAA JMP pop_xgsetF000
_SET_CONFIG:
count --> Y,+2
point --> Y,+2
p_buf --> R20
446 934A ST R20,-Y
447 935A ST R21,-Y
448 9721 SBIW R28,1
(0402) }
(0403) //------------------------------------------------------------------------------
(0404) /*设置系统配置参数*/
(0405) void SET_CONFIG(void)
(0406) {
(0407) unsigned int point,count;
(0408) struct StructOfProtocol *p_buf;
(0409) p_buf = (struct StructOfProtocol *)Buffer485;
449 E749 LDI R20,0x79
44A E051 LDI R21,1
(0410) *C51Buffer485 = *Buffer485;
44B 9020 0179 LDS R2,Buffer485
44D 9220 0079 STS C51Buffer485,R2
(0411) if (p_buf->Length == sizeof(SystemConfig) + 1) /*接收数据包长度确认*/
44F 01FA MOVW R30,R20
450 8181 LDD R24,Z+1
451 8192 LDD R25,Z+2
452 3281 CPI R24,0x21
453 E0E0 LDI R30,0
454 079E CPC R25,R30
455 F4C9 BNE 0x046F
(0412) {
(0413) I2C_Initial();
456 940E 05B1 CALL _I2C_Initial
(0414) AT24_Write((unsigned char *)&p_buf->Data,SystemConfig_Address,sizeof(SystemConfig));
458 E280 LDI R24,0x20
459 8388 STD Y+0,R24
45A 2722 CLR R18
45B 2733 CLR R19
45C 018A MOVW R16,R20
45D 5F0C SUBI R16,0xFC
45E 4F1F SBCI R17,0xFF
45F 940E 0651 CALL _AT24_Write
(0415) I2C_Close();
461 940E 05B6 CALL _I2C_Close
(0416) if (p_buf->Address != 0xff)
463 01FA MOVW R30,R20
464 8180 LDD R24,Z+0
465 3F8F CPI R24,0xFF
466 F049 BEQ 0x0470
(0417) {
(0418) Cyc_manage |= 0x04;//打开更新51控制板的数据
467 9180 0078 LDS R24,Cyc_manage
469 6084 ORI R24,4
46A 9380 0078 STS Cyc_manage,R24
(0419) CommandReply(RESP_CMD_OK);
46C E801 LDI R16,0x81
46D DCE7 RCALL _CommandReply
(0420) }
(0421) }
46E C001 RJMP 0x0470
(0422) else if (TEST && p_buf->Address != 0xff)
46F C000 RJMP 0x0470
470 9621 ADIW R28,1
471 9159 LD R21,Y+
472 9149 LD R20,Y+
473 9508 RET
_GET_PRODUCT_CODE:
communication --> R20
p_buf --> R22
474 940E 0DA5 CALL push_xgsetF000
476 9721 SBIW R28,1
(0423) CommandReply(RESP_INVALID_DATA);
(0424) }
(0425) //------------------------------------------------------------------------------
(0426) //------------------------------------------------------------------------------
(0427) /*取产品标签代码*/
(0428) void GET_PRODUCT_CODE(void)
(0429) {
(0430) struct StructOfProtocol *p_buf;
(0431) struct data *communication;
(0432) p_buf = (struct StructOfProtocol *)Buffer485;
477 E769 LDI R22,0x79
478 E071 LDI R23,1
(0433) if (p_buf->Address == Device_Address) /*本机地址响应*/
479 9020 0077 LDS R2,Device_Address
47B 01FB MOVW R30,R22
47C 8030 LDD R3,Z+0
47D 1432 CP R3,R2
47E F4F9 BNE 0x049E
(0434) {
(0435) if (p_buf->Length == 1) /*接收数据包长度确认*/
47F 8181 LDD R24,Z+1
480 8192 LDD R25,Z+2
481 3081 CPI R24,1
482 E0A0 LDI R26,0
483 079A CPC R25,R26
484 F4C1 BNE 0x049D
(0436) {
(0437) p_buf->Length = sizeof(struct StructOfProductCode) + 1;
485 EF8B LDI R24,0xFB
486 E090 LDI R25,0
487 8392 STD Z+2,R25
488 8381 STD Z+1,R24
(0438) I2C_Initial();
489 940E 05B1 CALL _I2C_Initial
(0439) AT24_Read((unsigned char *)&p_buf->Data,StructOfProductCode_Address,p_buf->Length-1);
48B 01FB MOVW R30,R22
48C 8181 LDD R24,Z+1
48D 8192 LDD R25,Z+2
48E 9701 SBIW R24,1
48F 8388 STD Y+0,R24
490 EB2A LDI R18,0xBA
491 E93A LDI R19,0x9A
492 018F MOVW R16,R30
493 5F0C SUBI R16,0xFC
494 4F1F SBCI R17,0xFF
495 940E 0615 CALL _AT24_Read
(0440) I2C_Close();
497 940E 05B6 CALL _I2C_Close
(0441) communication->pc_txd = 1;
499 E081 LDI R24,1
49A 01FA MOVW R30,R20
49B 8381 STD Z+1,R24
(0442) }
49C C001 RJMP 0x049E
(0443) else if(TEST)
49D C000 RJMP 0x049E
(0444) CommandReply(RESP_INVALID_DATA); /*包长度异常*/
(0445) }
49E 9621 ADIW R28,1
49F 940C 0DAA JMP pop_xgsetF000
_SET_PRODUCT_CODE:
p_buf --> R20
4A1 934A ST R20,-Y
4A2 935A ST R21,-Y
4A3 9721 SBIW R28,1
(0446) }
(0447) //------------------------------------------------------------------------------
(0448) /*设置产品标签代码*/
(0449) void SET_PRODUCT_CODE(void)
(0450) {
(0451) struct StructOfProtocol *p_buf;
(0452) p_buf = (struct StructOfProtocol *)Buffer485;
4A4 E749 LDI R20,0x79
4A5 E051 LDI R21,1
(0453) *C51Buffer485 = *Buffer485;
4A6 9020 0179 LDS R2,Buffer485
4A8 9220 0079 STS C51Buffer485,R2
(0454) if (p_buf->Length == sizeof(struct StructOfProductCode) + 1) /*接收数据包长度确认*/
4AA 01FA MOVW R30,R20
4AB 8181 LDD R24,Z+1
4AC 8192 LDD R25,Z+2
4AD 3F8B CPI R24,0xFB
4AE E0E0 LDI R30,0
4AF 079E CPC R25,R30
4B0 F4C9 BNE 0x04CA
(0455) {
(0456) I2C_Initial();
4B1 940E 05B1 CALL _I2C_Initial
(0457) AT24_Write((unsigned char *)&p_buf->Data,StructOfProductCode_Address,sizeof(struct StructOfProductCode));
4B3 EF8A LDI R24,0xFA
4B4 8388 STD Y+0,R24
4B5 EB2A LDI R18,0xBA
4B6 E93A LDI R19,0x9A
4B7 018A MOVW R16,R20
4B8 5F0C SUBI R16,0xFC
4B9 4F1F SBCI R17,0xFF
4BA 940E 0651 CALL _AT24_Write
(0458) I2C_Close();
4BC 940E 05B6 CALL _I2C_Close
(0459) if (p_buf->Address != 0xff)
4BE 01FA MOVW R30,R20
4BF 8180 LDD R24,Z+0
4C0 3F8F CPI R24,0xFF
4C1 F049 BEQ 0x04CB
(0460) {
(0461) Cyc_manage |= 0x04;//打开更新51控制板的数据
4C2 9180 0078 LDS R24,Cyc_manage
4C4 6084 ORI R24,4
4C5 9380 0078 STS Cyc_manage,R24
(0462) CommandReply(RESP_CMD_OK);
4C7 E801 LDI R16,0x81
4C8 DC8C RCALL _CommandReply
(0463) }
(0464) }
4C9 C001 RJMP 0x04CB
(0465) else if(TEST && p_buf->Address != 0xff)
4CA C000 RJMP 0x04CB
4CB 9621 ADIW R28,1
4CC 9159 LD R21,Y+
4CD 9149 LD R20,Y+
4CE 9508 RET
(0466) CommandReply(RESP_INVALID_DATA);
(0467) }
(0468) //------------------------------------------------------------------------------
(0469) //------------------------------------------------------------------------------
(0470) /*取控制器状态*/
(0471) void GET_UNIT_STATUS(void)
(0472) {
(0473) struct StructOfProtocol *p_buf;
(0474) struct data *communication;
(0475) p_buf = (struct StructOfProtocol *)Buffer485;
_GET_UNIT_STATUS:
communication --> R16
p_buf --> R18
4CF E729 LDI R18,0x79
4D0 E031 LDI R19,1
(0476) if (p_buf->Address == Device_Address) /*本机地址响应*/
4D1 9020 0077 LDS R2,Device_Address
4D3 01F9 MOVW R30,R18
4D4 8030 LDD R3,Z+0
4D5 1432 CP R3,R2
4D6 F4B1 BNE 0x04ED
(0477) {
(0478) if (p_buf->Length == 1) /*接收数据包长度确认*/
4D7 8181 LDD R24,Z+1
4D8 8192 LDD R25,Z+2
4D9 3081 CPI R24,1
4DA E0A0 LDI R26,0
4DB 079A CPC R25,R26
4DC F481 BNE 0x04ED
(0479) {
(0480) p_buf->Length = 4;
4DD E084 LDI R24,4
4DE E090 LDI R25,0
4DF 8392 STD Z+2,R25
4E0 8381 STD Z+1,R24
(0481) p_buf->Data[0] = WorkingMode; /*工作模式状态*/
4E1 9020 0072 LDS R2,WorkingMode
4E3 8224 STD Z+4,R2
(0482) p_buf->Data[1] = StopSwitchStatus; /*停止开关状态*/
4E4 9020 0071 LDS R2,StopSwitchStatus
4E6 8225 STD Z+5,R2
(0483) p_buf->Data[2] = FireSwitchStatus; /*火警开关状态*/
4E7 9020 0070 LDS R2,FireSwitchStatus
4E9 8226 STD Z+6,R2
(0484) communication->pc_txd = 1;
4EA E081 LDI R24,1
4EB 01F8 MOVW R30,R16
4EC 8381 STD Z+1,R24
(0485) }
(0486) }
4ED 9508 RET
(0487) }
(0488) //------------------------------------------------------------------------------
(0489) /*设置控制器状态*/
(0490) void SET_UNIT_STATUS(void)
(0491) {
_SET_UNIT_STATUS:
4EE 9508 RET
(0492) /*
(0493) struct StructOfProtocol *p_buf;
(0494) struct Device51_StructOfProtocol *C51_buf;
(0495) struct ControlStream *p_stream;
(0496) p_buf = (struct StructOfProtocol *)Buffer485;
(0497) C51_buf = (struct Device51_StructOfProtocol *)Buffer485;
(0498) if (p_buf->Length == 3) //接收数据包长度确认
(0499) {
(0500) p_stream = (struct ControlStream *)p_buf->Data;
(0501) if (!p_stream->Device_Address) //复位控制器
(0502) {
(0503) if (!p_stream->Status)
(0504) {
(0505) b_reset = 1;
(0506) EventRecord(MSG_WARM_RESET);
(0507) if (p_buf->Address != 0xff)
(0508) CommandReply(RESP_CMD_OK);
(0509) }
(0510) else if (p_stream->Status == 1)
(0511) {
(0512) CleanDatabase();
(0513) EventRecord(MSG_COLD_RESET);
(0514) b_reset = 1;
(0515) }
(0516) }
(0517) else if (p_stream->Address == 1) //设置工作模式
(0518) {
(0519) if (p_stream->Status == SLEEP_MODE ||
(0520) p_stream->Status == UNLOCK_MODE || p_stream->Status == SAFETY_MODE)
(0521) {
(0522) tmp = WorkingMode & ~MANUAL;
(0523) WorkingMode = p_stream->Status | MANUAL;
(0524) if (!(tmp & MANUAL) || p_stream->Status != (tmp & 0x0f))
(0525) {
(0526) EventRecord(MSG_WORKING_MODE_CHANGED);
(0527) if (p_stream->Status == UNLOCK_MODE)
(0528) {
(0529) if (SystemConfig.FirstKeyUnlock) b_unlock = 0;
(0530) else b_unlock = 1;
(0531) }
(0532) }
(0533) }
(0534) else WorkingMode = MANUAL;
(0535) b_minute = 1;
(0536) if (p_buf->Address != 0xff)
(0537) CommandReply(RESP_CMD_OK);
(0538) }
(0539) else if (TEST && p_buf->Address != 0xff)
(0540) CommandReply(RESP_INVALID_DATA);
(0541) }
(0542) else if (TEST && p_buf->Address != 0xff)
(0543) CommandReply(RESP_INVALID_DATA);
(0544) */
(0545) }
(0546) //------------------------------------------------------------------------------
(0547) //------------------------------------------------------------------------------
(0548) /*取控制器历史事件*/
(0549) void GET_EVENT(void)
(0550) {
_GET_EVENT:
4EF 9508 RET
_communication_with_pc:
p_buf --> R20
communication --> R22
4F0 940E 0DA5 CALL push_xgsetF000
(0551)
(0552) /*
(0553)
(0554) if (p_buf->Address == Address)
(0555) {
(0556) if (p_buf->Length == 3) //接收数据包长度确认
(0557) {
(0558) tmp = p_buf->Data[0]; //取删除记录数
(0559) if (tmp == 0xff) //删除所有记录
(0560) {
(0561) Record.TopPoint = Record.BottomPoint = Record.Overflow = 0;
(0562) SequentialWrite((unsigned char *)&Record,OFFSET_RECORD_POINT,sizeof(Record));
(0563) }
(0564) else if (p_buf->Data[1] == (unsigned char)Record.BottomPoint)//数据包标志比较
(0565) {
(0566) count = GetRecordNumber(); //计算现有记录数
(0567) if (tmp) //删除部分记录
(0568) {
(0569) if (tmp <= count && tmp <= ((sizeof(Buffer485) - 10) / sizeof(struct StructOfRecord)))
(0570) {
(0571) count = tmp + Record.BottomPoint;
(0572) if (count < MAX_RECORD_NUMBER) Record.BottomPoint = count;
(0573) else Record.BottomPoint = count - MAX_RECORD_NUMBER;
(0574) Record.Overflow = 0;
(0575) SequentialWrite((unsigned char *)&Record,OFFSET_RECORD_POINT,sizeof(Record));
(0576) }
(0577) else if (TEST) //删除记录数据异常
(0578) {
(0579) CommandReply(RESP_INVALID_DATA);
(0580) break;
(0581) }
(0582) }
(0583) }
(0584) count = GetRecordNumber(); //计算删除后的记录数
(0585) if (count)
(0586) {
(0587) if (count > ((sizeof(Buffer485) - 10) / sizeof(struct StructOfRecord)))
(0588) count = (sizeof(Buffer485) - 10) / sizeof(struct StructOfRecord);
(0589) count *= sizeof(struct StructOfRecord);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -