📄 main.lst
字号:
010B FB 238 mov R3,A
239 ;发送数据块
010C 12011F 240 lcall func_Send_File_Block_64_byte_n2068
010F 5008 241 jnc n2067_exit_failed
0111 D004 242 pop 4 ;退出R4,存放块的个数
0113 DCCF 243 djnz R4,n2067_next_block
0115 244 n2067_exit_success:
245 ;操作成功,显示LED信息
0115 120543 246 lcall func_Sd_Rc_Data_success_show_LED_n0602
0118 22 247 ret
0119 248 n2067_exit_failed:
0119 D004 249 pop 4
011B 250 n2067_exit_failed2:
251 ;操作失败,显示LED信息
011B 120570 252 lcall func_Sd_Rc_Data_fail_show_LED_n0603
011E 22 253 ret
254 ;func_File_Block_Full_Write_Entry_n2067:end
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 5
255
256
257
258 ;发送数据块的64个字节
011F 259 func_Send_File_Block_64_byte_n2068:
011F 260 n2068_paster_block_data:
011F BC0005 261 cjne R4,#0,n2068_clock_len_not_0
0122 BD0002 262 cjne R5,#0,n2068_clock_len_not_0
0125 21D7 263 jmp n2068_exit_success
0127 264 n2068_clock_len_not_0:
0127 BC4000 265 cjne R4,#64,n2068_nextline_1
012A 266 n2068_nextline_1:
012A 5008 267 jnc n2068_data_size_big_equ_64 ;大于等于64字节
012C BD0100 268 cjne R5,#1,n2068_nextline_2
012F 269 n2068_nextline_2:
012F 5003 270 jnc n2068_data_size_big_equ_64 ;大于等于256字节
271 ;小于64字节,转
0131 02018A 272 ljmp n2068_less_64_byte
0134 273 n2068_data_size_big_equ_64:
0134 7810 274 mov R0,#EEP_RDWR_BYTE_BUFFER_ADDR
0136 7510FA 275 mov EEP_RDWR_BYTE_BUFFER_ADDR,#0FAh
0139 7511FB 276 mov EEP_RDWR_BYTE_BUFFER_ADDR+1,#0FBh
013C 751235 277 mov EEP_RDWR_BYTE_BUFFER_ADDR+2,#035h
278 ;len
013F 751342 279 mov EEP_RDWR_BYTE_BUFFER_ADDR+3,#66
0142 8F14 280 mov EEP_RDWR_BYTE_BUFFER_ADDR+4,R7
0144 8E15 281 mov EEP_RDWR_BYTE_BUFFER_ADDR+5,R6
0146 7916 282 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR+6
0148 7840 283 mov R0,#64
014A 12048D 284 lcall func_EEP_IIC_bus_read_n1123
014D 75F046 285 mov B,#70
0150 1202A3 286 lcall func_Scom_Send_frame_n1957
287 ;等待应答帧
0153 7828 288 mov R0,#40
0155 289 n2068_delay_Max_2s:
0155 7401 290 mov A,#1
0157 12059B 291 lcall func_delay_A_mul_50ms_n2241
015A E50B 292 mov A,SCOM_RECV_FRAME_VALID_REG
015C B4FF04 293 cjne A,#SCOM_RECV_FRAME_INVALID_KEY,n2068_recv_valid_frame
015F D8F4 294 djnz R0,n2068_delay_Max_2s
0161 21D9 295 ajmp n2068_exit_failed ;超时退出
0163 296 n2068_recv_valid_frame:
0163 750BFF 297 mov SCOM_RECV_FRAME_VALID_REG,#SCOM_RECV_FRAME_INVALID_KEY
0166 7812 298 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+2
0168 E6 299 mov A,@R0
300 ;如果不是应答帧,则返回退出
0169 B4316D 301 cjne A,#Scom_frame_Op_Send_ACK_Key,n2068_exit_failed
016C 750A00 302 mov SCOM_RECV_DATA_CNT_REG,#0
303
304 ;EEPROM源地址增加64字节
016F 7440 305 mov A,#64
0171 2A 306 add A,R2
0172 FA 307 mov R2,A
0173 7400 308 mov A,#0
0175 3B 309 addc A,R3
0176 FB 310 mov R3,A
311 ;目的地址增加64字节
0177 7440 312 mov A,#64
0179 2E 313 add A,R6
017A FE 314 mov R6,A
017B 7400 315 mov A,#0
017D 3F 316 addc A,R7
017E FF 317 mov R7,A
318 ;块长度减64字节
017F C3 319 clr C
0180 EC 320 mov A,R4
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 6
0181 9440 321 subb A,#64
0183 FC 322 mov R4,A
0184 ED 323 mov A,R5
0185 9400 324 subb A,#0
0187 FD 325 mov R5,A
0188 8095 326 jmp n2068_paster_block_data
327
328 ;发送最后的小于64字节的数据
018A 329 n2068_less_64_byte:
018A 7810 330 mov R0,#EEP_RDWR_BYTE_BUFFER_ADDR
018C 7510FA 331 mov EEP_RDWR_BYTE_BUFFER_ADDR,#0FAh
018F 7511FB 332 mov EEP_RDWR_BYTE_BUFFER_ADDR+1,#0FBh
0192 751235 333 mov EEP_RDWR_BYTE_BUFFER_ADDR+2,#035h
0195 8F14 334 mov EEP_RDWR_BYTE_BUFFER_ADDR+4,R7
0197 8E15 335 mov EEP_RDWR_BYTE_BUFFER_ADDR+5,R6
0199 7916 336 mov R1,#EEP_RDWR_BYTE_BUFFER_ADDR+6
019B A804 337 mov R0,4 ;R4
019D 12048D 338 lcall func_EEP_IIC_bus_read_n1123
01A0 EC 339 mov A,R4
01A1 2406 340 add A,#6
01A3 F5F0 341 mov B,A
01A5 EC 342 mov A,R4
01A6 2402 343 add A,#2
344 ;len
01A8 F513 345 mov EEP_RDWR_BYTE_BUFFER_ADDR+3,A
01AA 1202A3 346 lcall func_Scom_Send_frame_n1957
347 ;等待应答帧
01AD 7814 348 mov R0,#20
01AF 349 n2068_delay_Max_1s_2:
01AF 7401 350 mov A,#1
01B1 12059B 351 lcall func_delay_A_mul_50ms_n2241
01B4 E50B 352 mov A,SCOM_RECV_FRAME_VALID_REG
01B6 B4FF04 353 cjne A,#SCOM_RECV_FRAME_INVALID_KEY,n2068_recv_valid_frame_2
01B9 D8F4 354 djnz R0,n2068_delay_Max_1s_2
01BB 21D9 355 ajmp n2068_exit_failed ;超时退出
01BD 356 n2068_recv_valid_frame_2:
01BD 750BFF 357 mov SCOM_RECV_FRAME_VALID_REG,#SCOM_RECV_FRAME_INVALID_KEY
01C0 7812 358 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+2
01C2 E6 359 mov A,@R0
360 ;如果不是应答帧,则返回退出
01C3 B43113 361 cjne A,#Scom_frame_Op_Send_ACK_Key,n2068_exit_failed
01C6 750A00 362 mov SCOM_RECV_DATA_CNT_REG,#0
363 ;EEPROM源地址增加64字节
01C9 EC 364 mov A,R4
01CA 2A 365 add A,R2
01CB FA 366 mov R2,A
01CC 7400 367 mov A,#0
01CE 3B 368 addc A,R3
01CF FB 369 mov R3,A
370 ;目的地址增加64字节
01D0 EC 371 mov A,R4
01D1 2E 372 add A,R6
01D2 FE 373 mov R6,A
01D3 7400 374 mov A,#0
01D5 3F 375 addc A,R7
01D6 FF 376 mov R7,A
01D7 377 n2068_exit_success:
01D7 D3 378 setb C
01D8 22 379 ret
01D9 380 n2068_exit_failed:
01D9 C3 381 clr C
01DA 22 382 ret
383 ;func_Send_File_Block_64_byte_n2068:end
384
385
386
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 7
387 ;///////////////////////////////////////////////////////////////////////
388 ;///////////////////////////////////////////////////////////////////////
389 ;///////////////////////////////////////////////////////////////////////
390 ;///////////////串行口处理模块服务程序//////////////////////////////////
391 ;///////////////////////////////////////////////////////////////////////
392 ;///////////////////////////////////////////////////////////////////////
393 ;///////////////////////////////////////////////////////////////////////
394
395 ;中断、定时器、串口的初始化寄存器的操作
01DB 396 func_init_timer_scom_irq_reg_n1946:
397 ;input:NO,output:NO,use:NO
01DB C28C 398 clr TR0
01DD C28E 399 clr TR1
01DF 758DFA 400 mov TH1,#IRQ_TIMER1_BYTE_KEY_FAh;设定时器1初始值,波特率4800
01E2 758BFA 401 mov TL1,#IRQ_TIMER1_BYTE_KEY_FAh
402 ;T1工作于方式2,T0工作于方式1,都只受TRi控制,计数源为内部晶振分频
01E5 758921 403 mov TMOD,#21h
404
405 ;设置串行口控制寄存器
01E8 759870 406 mov scon,#70h
407 ;0111 0000,工作在方式1,SM2为1,REN为1,允许接收,清零Ti和Ri
408
01EB 75B800 409 mov IP,#00h;中断优先级寄存器清零
01EE D2BC 410 setb ps;串行口优先级设为高优先级
411
01F0 75A800 412 mov IE,#00h;中断允许寄存器清零
01F3 C2A9 413 clr ET0;不允许定时器0中断
01F5 C2AB 414 clr ET1;不允许定时器1中断
01F7 D2AC 415 setb ES;允许串行口中断
01F9 D2AF 416 setb EA;开总中断允许
01FB D28E 417 setb TR1;启动定时器1计数
01FD 22 418 ret
419 ;func_init_timer_scom_irq_reg_n1946:end
420
421
422
423 ;///////////////////////////////////////////////////////////////////////
424 ;///////////////串行口通信中断服务程序//////////////////////////////////
425 ;///////////////////////////////////////////////////////////////////////
01FE 426 func_IRQ_Serial_Comm_service_n1945:
01FE C0D0 427 push psw
0200 C0E0 428 push acc
429 ; push B
430 ; mov A,R0
0202 C000 431 push 0 ;R0
432 ; push 0
433 ; push 1
434 ;接收数据
0204 30984C 435 jnb ri,n1945_send_data
0207 C298 436 clr ri
437 ;如果串行口接收帧有效比特还没有清零,则也退出
0209 E50B 438 mov A,SCOM_RECV_FRAME_VALID_REG
020B B4FF45 439 cjne A,#SCOM_RECV_FRAME_INVALID_KEY,n1945_send_data
020E E50A 440 mov A,SCOM_RECV_DATA_CNT_REG
441 ;接收计数是否到80,到80则表示接收满
0210 B45000 442 cjne A,#80,n1945_nextline_1
0213 443 n1945_nextline_1:
0213 4003 444 jc n1945_recv_cnt_less_80
0215 750A00 445 mov SCOM_RECV_DATA_CNT_REG,#0
0218 446 n1945_recv_cnt_less_80:
0218 7810 447 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR
021A E50A 448 mov A,SCOM_RECV_DATA_CNT_REG
021C 28 449 add A,R0
021D F8 450 mov R0,A
021E E599 451 mov A,sbuf
0220 F6 452 mov @R0,A
A51 MACRO ASSEMBLER MAIN 04/15/2004 14:47:38 PAGE 8
0221 050A 453 inc SCOM_RECV_DATA_CNT_REG
454
0223 E50A 455 mov A,SCOM_RECV_DATA_CNT_REG
456 ;判断第1个字符是否是帧开始标志字符1
0225 B4010B 457 cjne A,#1,n1945_not_first_byte;当前计数值是否为1
0228 E6 458 mov A,@R0
0229 B4FA02 459 cjne A,#0FAh,n1945_first_byte_not_match;当前字符是否为开始标志字符1
022C 8025 460 jmp n1945_send_data
022E 461 n1945_first_byte_not_match: ;第一个字符不是开始标志字符1
022E 750A00 462 mov SCOM_RECV_DATA_CNT_REG,#0
0231 8020 463 jmp n1945_send_data
0233 464 n1945_not_first_byte: ;当前计数值不是1
0233 B4020B 465 cjne A,#2,n1945_not_second_byte;当前计数值是否为2
0236 E6 466 mov A,@R0
0237 B4FB02 467 cjne A,#0FBh,n1945_second_byte_not_match;当前字符是否为开始标志字符2
023A 8017 468 jmp n1945_send_data
023C 469 n1945_second_byte_not_match: ;第二个字符不是开始标志字符2
023C 750A00 470 mov SCOM_RECV_DATA_CNT_REG,#0
023F 8012 471 jmp n1945_send_data
0241 472 n1945_not_second_byte: ;当前计数值不是2,判断计数值是否大于5
0241 B40500 473 cjne A,#5,n1945_nextline_2
0244 474 n1945_nextline_2:
475 ;判断当前接收的字节数,小于5,则表示没有接收完。转
0244 400D 476 jc n1945_send_data
477 ;大于等于5,则比较接收的帧数据长度是否到了。
0246 7813 478 mov R0,#SCOM_RECV_DATA_BUFFER_ADDR+3
0248 E6 479 mov A,@R0
0249 2405 480 add A,#5
024B B50A05 481 cjne A,SCOM_RECV_DATA_CNT_REG,n1945_send_data;长度不等,没有到,转
024E 750B00 482 mov SCOM_RECV_FRAME_VALID_REG,#SCOM_RECV_FRAME_VALID_KEY ;大于等于3,置位帧有效标志
0251 4153 483 ajmp n1945_send_data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -