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

📄 51pro.lis

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -