📄 51pro.lis
字号:
0284 E0910000 lds R30,_pw
0288 F0910100 lds R31,_pw+1
028C 00D0 rcall xicall
028E .dbline 184
028E ; SendData();//回应上位机表示进入读状态
028E 71DF rcall _SendData
0290 35C0 rjmp L88
0292 L87:
0292 .dbline 186
0292 ; while(1)
0292 ; {
0292 .dbline 187
0292 ; if(WaitResp())//等待上位机回应1个字节
0292 20DF rcall _WaitResp
0294 0023 tst R16
0296 09F4 brne X3
0298 32C0 rjmp L89
029A X3:
029A .dbline 188
029A ; {
029A .dbline 189
029A ; if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
029A 20900000 lds R2,_ComBuf
029E 2220 tst R2
02A0 09F4 brne L92
02A2 .dbline 190
02A2 ; {
02A2 .dbline 191
02A2 ; break;
02A2 2DC0 rjmp L89
02A4 L92:
02A4 .dbline 193
02A4 ; }
02A4 ; else if(ComBuf[0]==0xff)//0xff表示重发
02A4 80910000 lds R24,_ComBuf
02A8 8F3F cpi R24,255
02AA 49F4 brne L94
02AC .dbline 194
02AC ; {
02AC .dbline 195
02AC ; nAddress=nAddress-0x0010;
02AC 80911000 lds R24,_nAddress
02B0 90911100 lds R25,_nAddress+1
02B4 4097 sbiw R24,16
02B6 90931100 sts _nAddress+1,R25
02BA 80931000 sts _nAddress,R24
02BE .dbline 196
02BE ; }
02BE L94:
02BE .dbline 197
02BE ; for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
02BE 42E0 ldi R20,2
02C0 16C0 rjmp L99
02C2 L96:
02C2 .dbline 198
02C2 .dbline 199
02C2 E0910800 lds R30,_pw+8
02C6 F0910900 lds R31,_pw+8+1
02CA 00D0 rcall xicall
02CC 80E0 ldi R24,<_ComBuf
02CE 90E0 ldi R25,>_ComBuf
02D0 E42F mov R30,R20
02D2 FF27 clr R31
02D4 E80F add R30,R24
02D6 F91F adc R31,R25
02D8 0083 std z+0,R16
02DA .dbline 200
02DA 80911000 lds R24,_nAddress
02DE 90911100 lds R25,_nAddress+1
02E2 0196 adiw R24,1
02E4 90931100 sts _nAddress+1,R25
02E8 80931000 sts _nAddress,R24
02EC .dbline 201
02EC L97:
02EC .dbline 197
02EC 4395 inc R20
02EE L99:
02EE .dbline 197
02EE 81E1 ldi R24,17
02F0 8417 cp R24,R20
02F2 38F7 brsh L96
02F4 .dbline 202
02F4 ; {
02F4 ; ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
02F4 ; nAddress++;//下一个单元
02F4 ; }
02F4 ; ComBuf[0]=6;//向上位机发送读出的数据块
02F4 86E0 ldi R24,6
02F6 80930000 sts _ComBuf,R24
02FA .dbline 203
02FA ; SendData();
02FA 3BDF rcall _SendData
02FC .dbline 204
02FC ; }
02FC .dbline 206
02FC ; else
02FC ; break;//等待回应失败
02FC L91:
02FC .dbline 208
02FC L88:
02FC .dbline 185
02FC CACF rjmp L87
02FE L89:
02FE .dbline 209
02FE ;
02FE ; }
02FE ; pw.fpProOver();//操作结束设置为运行状态
02FE E0910C00 lds R30,_pw+12
0302 F0910D00 lds R31,_pw+12+1
0306 00D0 rcall xicall
0308 .dbline 210
0308 ; ComBuf[0]=0;//通知上位机编程器进入就绪状态
0308 2224 clr R2
030A 20920000 sts _ComBuf,R2
030E .dbline 211
030E ; SendData();
030E 31DF rcall _SendData
0310 .dbline -2
0310 L86:
0310 00D0 rcall pop_gset1
0312 .dbline 0 ; func end
0312 0895 ret
0314 .dbsym r n 20 c
0314 .dbend
0314 .dbfunc e Lock _Lock fV
.even
0314 _Lock::
0314 .dbline -1
0314 .dbline 215
0314 ; }
0314 ;
0314 ; void Lock()//写锁定位
0314 ; {
0314 .dbline 216
0314 ; pw.fpLock();
0314 E0910A00 lds R30,_pw+10
0318 F0910B00 lds R31,_pw+10+1
031C 00D0 rcall xicall
031E .dbline 217
031E ; SendData();
031E 29DF rcall _SendData
0320 .dbline -2
0320 L102:
0320 .dbline 0 ; func end
0320 0895 ret
0322 .dbend
0322 .dbfunc e main _main fV
.even
0322 _main::
0322 .dbline -1
0322 .dbline 228
0322 ; }
0322 ;
0322 ; ///////////////////////////////////////////////////////////////////////////////////////////////////
0322 ; //所支持的FID,请在这里继续添加
0322 ; ///////////////////////////////////////////////////////////////////////////////////////////////////
0322 ; extern void PreparePro00();//FID=00:AT89C51编程器
0322 ; extern void PreparePro01();//FID=01:AT89C2051编程器
0322 ; extern void PreparePro02();//FID=02:AT89S51编程器
0322 ;
0322 ; void main()
0322 ; {
0322 .dbline 229
0322 ; DDRC=0xff;
0322 8FEF ldi R24,255
0324 84BB out 0x14,R24
0326 .dbline 230
0326 ; PORTC|=BIT(PB0);
0326 A89A sbi 0x15,0
0328 .dbline 231
0328 ; PORTC&=~BIT(PB1);
0328 A998 cbi 0x15,1
032A .dbline 232
032A ; uart_init();
032A 8DDE rcall _uart_init
032C .dbline 233
032C ; Delay_ms(500);//延时1秒后编程器自举
032C 04EF ldi R16,500
032E 11E0 ldi R17,1
0330 75DE rcall _Delay_ms
0332 .dbline 234
0332 ; ComBuf[0]=0;
0332 2224 clr R2
0334 20920000 sts _ComBuf,R2
0338 .dbline 235
0338 ; SendData();
0338 1CDF rcall _SendData
033A 47C0 rjmp L106
033C L105:
033C .dbline 237
033C ; while(1)//串口通讯采用查询方式
033C ; {
033C .dbline 238
033C ; if(!WaitComm())//如果超时,通讯出错
033C 93DE rcall _WaitComm
033E 0023 tst R16
0340 31F4 brne L108
0342 .dbline 239
0342 ; {
0342 .dbline 240
0342 ; Delay_ms(200);
0342 08EC ldi R16,200
0344 10E0 ldi R17,0
0346 6ADE rcall _Delay_ms
0348 .dbline 241
0348 ; ComBuf[0]=0;//让编程器复位,使编程器就绪
0348 2224 clr R2
034A 20920000 sts _ComBuf,R2
034E .dbline 242
034E ; }
034E L108:
034E .dbline 243
034E ; switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
034E 60910100 lds R22,_ComBuf+1
0352 7727 clr R23
0354 6030 cpi R22,0
0356 6707 cpc R22,R23
0358 81F0 breq L111
035A X4:
035A 6130 cpi R22,1
035C E0E0 ldi R30,0
035E 7E07 cpc R23,R30
0360 61F0 breq L111
0362 6230 cpi R22,2
0364 E0E0 ldi R30,0
0366 7E07 cpc R23,R30
0368 09F0 breq L116
036A 02C0 rjmp L110
036C X5:
036C .dbline 244
036C ; {
036C .dbline 247
036C ; case 0://at89c51编程器
036C ; //PreparePro00();
036C ; break;
036C .dbline 250
036C ; case 1://at89c2051编程器
036C ; //PreparePro01();
036C ; break;
036C L116:
036C .dbline 252
036C ; case 2://at89s51编程器
036C ; PreparePro02();
036C 00D0 rcall _PreparePro02
036E .dbline 253
036E ; break;
036E 05C0 rjmp L111
0370 L110:
0370 .dbline 259
0370 ; //case 3:支持新器件时,请继续向下添加
0370 ; // break;
0370 ; //case 4:
0370 ; // break;
0370 ; default:
0370 ; ComBuf[0]=0xff;
0370 8FEF ldi R24,255
0372 80930000 sts _ComBuf,R24
0376 .dbline 260
0376 ; ComBuf[1]=0xff;//表示无效的操作
0376 80930100 sts _ComBuf+1,R24
037A .dbline 261
037A ; break;
037A L111:
037A .dbline 263
037A ; }
037A ; switch(ComBuf[0])//根据操作ID跳到不同的操作函数
037A 40910000 lds R20,_ComBuf
037E 5527 clr R21
0380 4030 cpi R20,0
0382 4507 cpc R20,R21
0384 A9F0 breq L121
0386 X6:
0386 4130 cpi R20,1
0388 E0E0 ldi R30,0
038A 5E07 cpc R21,R30
038C 99F0 breq L122
038E 4230 cpi R20,2
0390 E0E0 ldi R30,0
0392 5E07 cpc R21,R30
0394 89F0 breq L123
0396 4330 cpi R20,3
0398 E0E0 ldi R30,0
039A 5E07 cpc R21,R30
039C 79F0 breq L124
039E 4430 cpi R20,4
03A0 E0E0 ldi R30,0
03A2 5E07 cpc R21,R30
03A4 69F0 breq L125
03A6 4530 cpi R20,5
03A8 E0E0 ldi R30,0
03AA 5E07 cpc R21,R30
03AC 59F0 breq L126
03AE 0CC0 rjmp L118
03B0 X7:
03B0 .dbline 264
03B0 ; {
03B0 L121:
03B0 .dbline 266
03B0 ; case 0x00:
03B0 ; RstPro();//编程器复位
03B0 F5DE rcall _RstPro
03B2 .dbline 267
03B2 ; break;
03B2 0BC0 rjmp L119
03B4 L122:
03B4 .dbline 269
03B4 ; case 0x01:
03B4 ; ReadSign();//读特征字
03B4 FADE rcall _ReadSign
03B6 .dbline 270
03B6 ; break;
03B6 09C0 rjmp L119
03B8 L123:
03B8 .dbline 272
03B8 ; case 0x02:
03B8 ; Erase();//擦除器件
03B8 FFDE rcall _Erase
03BA .dbline 273
03BA ; break;
03BA 07C0 rjmp L119
03BC L124:
03BC .dbline 275
03BC ; case 0x03:
03BC ; Write();//写器件
03BC 04DF rcall _Write
03BE .dbline 276
03BE ; break;
03BE 05C0 rjmp L119
03C0 L125:
03C0 .dbline 278
03C0 ; case 0x04:
03C0 ; Read();//读器件
03C0 60DF rcall _Read
03C2 .dbline 279
03C2 ; break;
03C2 03C0 rjmp L119
03C4 L126:
03C4 .dbline 281
03C4 ; case 0x05:
03C4 ; Lock();//写锁定位
03C4 A7DF rcall _Lock
03C6 .dbline 282
03C6 ; break;
03C6 01C0 rjmp L119
03C8 L118:
03C8 .dbline 284
03C8 ; default:
03C8 ; SendData();
03C8 D4DE rcall _SendData
03CA .dbline 285
03CA ; break;
03CA L119:
03CA .dbline 287
03CA L106:
03CA .dbline 236
03CA B8CF rjmp L105
03CC X8:
03CC .dbline -2
03CC L104:
03CC .dbline 0 ; func end
03CC 0895 ret
03CE .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
0000 _pw::
0000 .blkb 14
000E .dbstruct 0 14 _prowork
000E .dbfield 0 fpInitPro pfV
000E .dbfield 2 fpReadSign pfV
000E .dbfield 4 fpErase pfV
000E .dbfield 6 fpWrite pfc
000E .dbfield 8 fpRead pfc
000E .dbfield 10 fpLock pfV
000E .dbfield 12 fpProOver pfV
000E .dbend
000E .dbsym e pw _pw S[_prowork]
000E _nTimeOut::
000E .blkb 2
0010 .dbsym e nTimeOut _nTimeOut i
0010 _nAddress::
0010 .blkb 2
0012 .dbsym e nAddress _nAddress i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -