📄 main.lst
字号:
484
485 ;发送数据
0253 486 n1945_send_data:
0253 30991E 487 jnb ti,n1945_exit
0256 C299 488 clr ti
0258 E508 489 mov A,SCOM_SEND_DATA_CNT_REG
490 ;计数是否为0,为0则表示发送空
025A B40002 491 cjne A,#0,n1945_send_cnt_not_equ_0
025D 8015 492 jmp n1945_exit
025F 493 n1945_send_cnt_not_equ_0:
025F 7410 494 mov A,#SCOM_SEND_DATA_BUFFER_ADDR
0261 2509 495 add A,SCOM_SEND_DATA_IDX_REG
0263 F8 496 mov R0,A
0264 E6 497 mov A,@R0;获取发送指针对应的当前发送字节。
0265 F599 498 mov sbuf,A
0267 0509 499 inc SCOM_SEND_DATA_IDX_REG
0269 E509 500 mov A,SCOM_SEND_DATA_IDX_REG
501 ;比较发送指针是否和发送计数值相等,
502 ;相等,则表示发送完成了。将2个寄存器都清零。
026B B50806 503 cjne A,SCOM_SEND_DATA_CNT_REG,n1945_exit
026E 750800 504 mov SCOM_SEND_DATA_CNT_REG,#0
0271 750900 505 mov SCOM_SEND_DATA_IDX_REG,#0
0274 506 n1945_exit:
507 ; pop 1
0274 D000 508 pop 0 ;R0
509 ; mov R0,A
510 ; pop B
0276 D0E0 511 pop acc
0278 D0D0 512 pop psw
027A 32 513 reti
514 ;func_IRQ_Serial_Comm_service_n1945:end
515
516
517 ;串行口操作发送ACK应答信号
027B 518 func_Scom_send_ack_n1954:
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 9
027B 519 n1954:
027B 7810 520 mov R0,#SCOM_SEND_DATA_BUFFER_ADDR
027D 76FA 521 mov @R0,#0FAh;起始标志字符1
027F 08 522 inc R0
0280 76FB 523 mov @R0,#0FBh;起始标志字符2
0282 08 524 inc R0
0283 7631 525 mov @R0,#31h;操作码
0285 08 526 inc R0
0286 7600 527 mov @R0,#00h;数据长度
0288 75F004 528 mov B,#4
028B 1202A3 529 lcall func_Scom_Send_frame_n1957
028E 22 530 ret
531 ;func_Scom_send_ack_n1954:end
532
533
534
535 ;串行口操作发送NAK应答信号
028F 536 func_Scom_send_nak_n1955:
028F 537 n1955:
028F 7810 538 mov R0,#SCOM_SEND_DATA_BUFFER_ADDR
0291 76FA 539 mov @R0,#0FAh;起始标志字符1
0293 08 540 inc R0
0294 76FB 541 mov @R0,#0FBh;起始标志字符2
0296 08 542 inc R0
0297 7630 543 mov @R0,#30h;操作码
0299 08 544 inc R0
029A 7600 545 mov @R0,#00h;数据长度
546
029C 75F004 547 mov B,#4
029F 1202A3 548 lcall func_Scom_Send_frame_n1957
02A2 22 549 ret
550 ;func_Scom_send_nak_n1955:end
551
552
553
554 ;串行口操作给发送帧加上校验码,然后发送出去.
02A3 555 func_Scom_Send_frame_n1957:
02A3 C000 556 push 0
02A5 C001 557 push 1
02A7 C002 558 push 2
02A9 7913 559 mov R1,#SCOM_SEND_DATA_BUFFER_ADDR+3
02AB E7 560 mov A,@R1
02AC FA 561 mov R2,A
02AD 0A 562 inc R2
02AE 0A 563 inc R2
02AF 564 n1957_data_len_not_equ_0:
02AF 7812 565 mov R0,#SCOM_SEND_DATA_BUFFER_ADDR+2
02B1 7400 566 mov A,#0
02B3 567 n1957_add_calc:
02B3 26 568 add A,@R0
02B4 08 569 inc R0
02B5 DAFC 570 djnz R2,n1957_add_calc
02B7 571 n1957_copy_last_data:
02B7 C0E0 572 push ACC
02B9 E5F0 573 mov A,B
02BB 2410 574 add A,#SCOM_SEND_DATA_BUFFER_ADDR
02BD F8 575 mov R0,A
02BE D0E0 576 pop ACC
02C0 F6 577 mov @R0,A
02C1 05F0 578 inc B
02C3 579 n1957_wait_1:
02C3 E508 580 mov A,SCOM_SEND_DATA_CNT_REG
02C5 B400FB 581 cjne A,#00,n1957_wait_1
02C8 85F008 582 mov SCOM_SEND_DATA_CNT_REG,B
02CB D299 583 setb Ti
02CD 584 n1957_wait_2:
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 10
02CD E508 585 mov A,SCOM_SEND_DATA_CNT_REG
02CF B400FB 586 cjne A,#00,n1957_wait_2
02D2 D002 587 pop 2
02D4 D001 588 pop 1
02D6 D000 589 pop 0
02D8 22 590 ret
591 ;func_Scom_Send_frame_n1957:end
592
593
594
595 ;验证接收帧的校验码是否有效
02D9 596 func_Scom_Check_Verify_Code_n1958:
02D9 7813 597 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+3
02DB E6 598 mov A,@R0
02DC F9 599 mov R1,A
02DD 09 600 inc R1
02DE 09 601 inc R1
02DF 602 n1958_data_len_not_equ_0:
02DF 7812 603 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+2
02E1 7400 604 mov A,#0
02E3 605 n1958_calc_data:
02E3 26 606 add A,@R0
02E4 08 607 inc R0
02E5 D9FC 608 djnz R1,n1958_calc_data
02E7 C3 609 clr C
02E8 96 610 subb A,@R0
02E9 B40002 611 cjne A,#0,n1958_exit_error
02EC 612 n1958_exit_good:
02EC D3 613 setb C
02ED 22 614 ret
02EE 615 n1958_exit_error:
02EE C3 616 clr C
02EF 22 617 ret
618 ;func_Scom_Check_Verify_Code_n1958:end
619
620
621
622 ;接收下载的资费、号码信息操作的文件数据块
02F0 623 func_Scom_write_file_block_n1965:
624 ; setb LED_1_BIT ;点灭1
625 ; setb LED_2_BIT ;点灭2
626 ;帧数据校验
02F0 1202D9 627 lcall func_Scom_Check_Verify_Code_n1958
02F3 4000 628 jc n1965_recv_frame_valid
629 ;lcall func_Scom_send_nak_n1955
630 ;jmp n1965_exit_error2
02F5 631 n1965_recv_frame_valid:
632 ;判断是否是下载费率数据块的协议关键字。如果不是,则返回。
02F5 7812 633 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+2
02F7 E6 634 mov A,@R0
02F8 B40608 635 cjne A,#Scom_frame_Op_Write_File_Block_Key,n1965_exit_error2
636 ;比较总块数,如果大于等于最大数+1,则退出
02FB 781A 637 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+10
02FD E6 638 mov A,@R0
02FE B4FB00 639 cjne A,#DATA_BLOCK_AREA_64B_block_Cnt+1,n1965_nextline_1
0301 640 n1965_nextline_1:
0301 4003 641 jc n1965_bolck_cnt_good
0303 642 n1965_exit_error2:
0303 020394 643 ljmp n1965_exit_error
0306 644 n1965_bolck_cnt_good:
645 ;比较总块数小于当前块数,则退出
0306 781B 646 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+11
0308 86F0 647 mov B,@R0
030A B5F004 648 cjne A,B,n1965_block_not_equ
030D D2D5 649 setb F0 ;F0置位,表示是最后一块
030F 6115 650 ajmp n1965_compare_len
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 11
0311 651 n1965_block_not_equ:
0311 40F0 652 jc n1965_exit_error2
0313 C2D5 653 clr F0 ;F0清零,表示不是最后一块
0315 654 n1965_compare_len:
655 ;比较数据长度
0315 7813 656 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+3
0317 E6 657 mov A,@R0
0318 B44802 658 cjne A,#72,n1965_len_not_72B ;长度128+8
031B 6120 659 ajmp n1965_write_file ;长度等于128+8,转去写入
031D 660 n1965_len_not_72B:
031D 30D5E3 661 jnb F0,n1965_exit_error2 ;长度不等于128+8,而且不是最后一块,则出错,返回
662 ;找写入地址,写入数据
0320 663 n1965_write_file:
664 ;根据当前块数计算起始地址
0320 781B 665 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+11
0322 E6 666 mov A,@R0
0323 14 667 dec A
0324 75F040 668 mov B,#64
0327 A4 669 mul AB
0328 209404 670 jb SELECT_SWITCH_BIT,n1965_write_jfq_data1
032B 2400 671 add A,#DATA_BLOCK_JRT_AREA_ADDR_Low
032D 6131 672 ajmp n1965_calc_addr_next1
032F 673 n1965_write_jfq_data1:
032F 2400 674 add A,#DATA_BLOCK_JFQ_AREA_ADDR_Low
0331 675 n1965_calc_addr_next1:
0331 FA 676 mov R2,A ;计算当前块的写入地址
0332 E5F0 677 mov A,B
678
0334 C0D0 679 push PSW
0336 209406 680 jb SELECT_SWITCH_BIT,n1965_write_jfq_data2
0339 D0D0 681 pop PSW
033B 3420 682 addc A,#DATA_BLOCK_JRT_AREA_ADDR_High
033D 6143 683 ajmp n1965_calc_addr_next2
033F 684 n1965_write_jfq_data2:
033F D0D0 685 pop PSW
0341 3401 686 addc A,#DATA_BLOCK_JFQ_AREA_ADDR_High
0343 687 n1965_calc_addr_next2:
0343 FB 688 mov R3,A
0344 7840 689 mov R0,#64
0346 791C 690 mov R1,#SCOM_RECV_DATA_BUFFER_ADDR+12
0348 12043C 691 lcall func_EEP_IIC_bus_write_n1122
692
034B 30D53C 693 jnb F0,n1965_not_last_block ;F0清零,表示不是最后一块
694 ;是最后一块,进行数据校验
034E 7813 695 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+3
0350 E6 696 mov A,@R0
0351 C3 697 clr C
0352 9408 698 subb A,#8
0354 F5F0 699 mov B,A ;当前块字节数,也就是最后一块字节数存入B
0356 781A 700 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+10
0358 E6 701 mov A,@R0 ;总块数存入A
0359 1203A1 702 lcall func_verify_dl_block_data_n1986 ;debug
703 ;cjne A,#0,n1965_verify_fail ;校验出错,退出
704
705 ;写数据有效字节
035C 209410 706 jb SELECT_SWITCH_BIT,n1965_write_jfq_valid_idx_byte
035F 751000 707 mov EEP_RDWR_BYTE_BUFFER_ADDR,#00h
0362 7A00 708 mov R2,#DATA_BLOCK_JRT_AREA_ADDR_Low
0364 7B20 709 mov R3,#DATA_BLOCK_JRT_AREA_ADDR_High
0366 7801 710 mov R0,#1
0368 7910 711 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
036A 12043C 712 lcall func_EEP_IIC_bus_write_n1122
036D 617D 713 ajmp n1965_exit_success
036F 714 n1965_write_jfq_valid_idx_byte:
036F 751000 715 mov EEP_RDWR_BYTE_BUFFER_ADDR,#00h
0372 7A10 716 mov R2,#DATA_VALID_JFQ_IDX_BYTE_ADDR_Low
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 12
0374 7B00 717 mov R3,#DATA_VALID_JFQ_IDX_BYTE_ADDR_High
0376 7801 718 mov R0,#1
0378 7910 719 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR
037A 12043C 720 lcall func_EEP_IIC_bus_write_n1122
721
037D 722 n1965_exit_success:
723 ;数据写完成,提示一下。
037D 12027B 724 lcall func_Scom_send_ack_n1954 ;应答
725 ;操作成功,显示LED信息
0380 120543 726 lcall func_Sd_Rc_Data_success_show_LED_n0602
0383 750BFF 727 mov SCOM_RECV_FRAME_VALID_REG,#SCOM_RECV_FRAME_INVALID_KEY ;清除串行口接收有效帧比
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -