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

📄 51pro.lis

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 012A           ;                       nTimeOut++;
 012A 80910E00          lds R24,_nTimeOut
 012E 90910F00          lds R25,_nTimeOut+1
 0132 0196              adiw R24,1
 0134 90930F00          sts _nTimeOut+1,R25
 0138 80930E00          sts _nTimeOut,R24
 013C                   .dbline 92
 013C           ;                       if(nTimeOut>10000)
 013C 80E1              ldi R24,10000
 013E 97E2              ldi R25,39
 0140 20900E00          lds R2,_nTimeOut
 0144 30900F00          lds R3,_nTimeOut+1
 0148 8215              cp R24,R2
 014A 9305              cpc R25,R3
 014C 10F4              brsh L51
 014E                   .dbline 93
 014E           ;                       {
 014E                   .dbline 94
 014E           ;                               return 0;
 014E 0027              clr R16
 0150 0FC0              rjmp L43
 0152           L51:
 0152                   .dbline 96
 0152           L49:
 0152                   .dbline 89
 0152 5F9B              sbis 0xb,7
 0154 EACF              rjmp L48
 0156                   .dbline 97
 0156 80E0              ldi R24,<_ComBuf
 0158 90E0              ldi R25,>_ComBuf
 015A E02F              mov R30,R16
 015C FF27              clr R31
 015E E80F              add R30,R24
 0160 F91F              adc R31,R25
 0162 2CB0              in R2,0xc
 0164 2082              std z+0,R2
 0166                   .dbline 98
 0166           L45:
 0166                   .dbline 86
 0166 0395              inc R16
 0168           L47:
 0168                   .dbline 86
 0168 81E1              ldi R24,17
 016A 8017              cp R24,R16
 016C B8F6              brsh L44
 016E                   .dbline 99
 016E           ;                       }
 016E           ;               }
 016E           ;               ComBuf[n]=UDR;
 016E           ;       }
 016E           ;       return 1;
 016E 01E0              ldi R16,1
 0170                   .dbline -2
 0170           L43:
 0170                   .dbline 0 ; func end
 0170 0895              ret
 0172                   .dbsym r n 16 c
 0172                   .dbend
 0172                   .dbfunc e SendData _SendData fV
 0172           ;              n -> R20
                        .even
 0172           _SendData::
 0172 00D0              rcall push_gset1
 0174                   .dbline -1
 0174                   .dbline 103
 0174           ; }
 0174           ; 
 0174           ; void SendData()//发送数据或回应操作完成,18字节
 0174           ; {
 0174                   .dbline 104
 0174           ;       BYTE n=0;
 0174 4427              clr R20
 0176                   .dbline 105
 0176           ;       for(n;n<=17;n++)
 0176 09C0              rjmp L57
 0178           L54:
 0178                   .dbline 106
 0178                   .dbline 107
 0178 80E0              ldi R24,<_ComBuf
 017A 90E0              ldi R25,>_ComBuf
 017C E42F              mov R30,R20
 017E FF27              clr R31
 0180 E80F              add R30,R24
 0182 F91F              adc R31,R25
 0184 0081              ldd R16,z+0
 0186 6ADF              rcall _uart_putchar
 0188                   .dbline 108
 0188           L55:
 0188                   .dbline 105
 0188 4395              inc R20
 018A           L57:
 018A                   .dbline 105
 018A 81E1              ldi R24,17
 018C 8417              cp R24,R20
 018E A0F7              brsh L54
 0190                   .dbline -2
 0190           L53:
 0190 00D0              rcall pop_gset1
 0192                   .dbline 0 ; func end
 0192 0895              ret
 0194                   .dbsym r n 20 c
 0194                   .dbend
 0194                   .dbfunc e SendResp _SendResp fV
                        .even
 0194           _SendResp::
 0194                   .dbline -1
 0194                   .dbline 112
 0194           ;       {
 0194           ;       uart_putchar(ComBuf[n]);
 0194           ;       }
 0194           ; }
 0194           ; 
 0194           ; void SendResp()//回应上位机1个字节,在写器件函数中使用
 0194           ; {
 0194                   .dbline 113
 0194           ;       uart_putchar(ComBuf[0]);
 0194 00910000          lds R16,_ComBuf
 0198 61DF              rcall _uart_putchar
 019A                   .dbline -2
 019A           L58:
 019A                   .dbline 0 ; func end
 019A 0895              ret
 019C                   .dbend
 019C                   .dbfunc e RstPro _RstPro fV
                        .even
 019C           _RstPro::
 019C                   .dbline -1
 019C                   .dbline 117
 019C           ; }
 019C           ; 
 019C           ; void RstPro()//编程器复位
 019C           ; {
 019C                   .dbline 118
 019C           ;       pw.fpProOver();//直接编程结束
 019C E0910C00          lds R30,_pw+12
 01A0 F0910D00          lds R31,_pw+12+1
 01A4 00D0              rcall xicall
 01A6                   .dbline 119
 01A6           ;       SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
 01A6 E5DF              rcall _SendData
 01A8                   .dbline -2
 01A8           L59:
 01A8                   .dbline 0 ; func end
 01A8 0895              ret
 01AA                   .dbend
 01AA                   .dbfunc e ReadSign _ReadSign fV
                        .even
 01AA           _ReadSign::
 01AA                   .dbline -1
 01AA                   .dbline 123
 01AA           ; }
 01AA           ; 
 01AA           ; void ReadSign()//读特征字
 01AA           ; {
 01AA                   .dbline 124
 01AA           ;       pw.fpReadSign();
 01AA E0910200          lds R30,_pw+2
 01AE F0910300          lds R31,_pw+2+1
 01B2 00D0              rcall xicall
 01B4                   .dbline 125
 01B4           ;       SendData();//通知上位机,送出读出器件特征字
 01B4 DEDF              rcall _SendData
 01B6                   .dbline -2
 01B6           L61:
 01B6                   .dbline 0 ; func end
 01B6 0895              ret
 01B8                   .dbend
 01B8                   .dbfunc e Erase _Erase fV
                        .even
 01B8           _Erase::
 01B8                   .dbline -1
 01B8                   .dbline 129
 01B8           ; }
 01B8           ; 
 01B8           ; void Erase()//擦除器件
 01B8           ; {
 01B8                   .dbline 130
 01B8           ;       pw.fpErase();
 01B8 E0910400          lds R30,_pw+4
 01BC F0910500          lds R31,_pw+4+1
 01C0 00D0              rcall xicall
 01C2                   .dbline 131
 01C2           ;       SendData();//通知上位机,擦除了器件
 01C2 D7DF              rcall _SendData
 01C4                   .dbline -2
 01C4           L63:
 01C4                   .dbline 0 ; func end
 01C4 0895              ret
 01C6                   .dbend
 01C6                   .dbfunc e Write _Write fV
 01C6           ;              n -> R20
                        .even
 01C6           _Write::
 01C6 00D0              rcall push_gset1
 01C8                   .dbline -1
 01C8                   .dbline 135
 01C8           ; }
 01C8           ; 
 01C8           ; void Write()//写器件
 01C8           ; {
 01C8                   .dbline 137
 01C8           ;       BYTE n;
 01C8           ;       pw.fpInitPro();//编程前的准备工作
 01C8 E0910000          lds R30,_pw
 01CC F0910100          lds R31,_pw+1
 01D0 00D0              rcall xicall
 01D2                   .dbline 138
 01D2           ;       SendData();//回应上位机表示进入写器件状态,可以发来数据
 01D2 CFDF              rcall _SendData
 01D4 47C0              rjmp L67
 01D6           L66:
 01D6                   .dbline 140
 01D6           ;       while(1)
 01D6           ;       {
 01D6                   .dbline 141
 01D6           ;               if(WaitData())//如果等待数据成功
 01D6 A0DF              rcall _WaitData
 01D8 0023              tst R16
 01DA 09F4              brne X1
 01DC 3DC0              rjmp L69
 01DE           X1:
 01DE                   .dbline 142
 01DE           ;               {
 01DE                   .dbline 143
 01DE           ;                       if(ComBuf[0]==0x07)//判断是否继续写
 01DE 80910000          lds R24,_ComBuf
 01E2 8730              cpi R24,7
 01E4 09F0              breq X2
 01E6 2DC0              rjmp L71
 01E8           X2:
 01E8                   .dbline 144
 01E8           ;                       {
 01E8                   .dbline 145
 01E8           ;                               for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
 01E8 42E0              ldi R20,2
 01EA 23C0              rjmp L76
 01EC           L73:
 01EC                   .dbline 146
 01EC           ;                               {
 01EC                   .dbline 147
 01EC           ;                                       if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
 01EC 80E0              ldi R24,<_ComBuf
 01EE 90E0              ldi R25,>_ComBuf
 01F0 E42F              mov R30,R20
 01F2 FF27              clr R31
 01F4 E80F              add R30,R24
 01F6 F91F              adc R31,R25
 01F8 0081              ldd R16,z+0
 01FA E0910600          lds R30,_pw+6
 01FE F0910700          lds R31,_pw+6+1
 0202 00D0              rcall xicall
 0204 0023              tst R16
 0206 59F4              brne L77
 0208                   .dbline 148
 0208           ;                                       {
 0208                   .dbline 149
 0208           ;                                               pw.fpProOver();//出错了就结束编程
 0208 E0910C00          lds R30,_pw+12
 020C F0910D00          lds R31,_pw+12+1
 0210 00D0              rcall xicall
 0212                   .dbline 150
 0212           ;                                               ComBuf[0]=0xff;
 0212 8FEF              ldi R24,255
 0214 80930000          sts _ComBuf,R24
 0218                   .dbline 151
 0218           ;                                               SendResp();//回应上位机一个字节,表示写数据出错了
 0218 BDDF              rcall _SendResp
 021A                   .dbline 152
 021A           ;                                               WaitData();//等待上位机的回应后就结束
 021A 7EDF              rcall _WaitData
 021C                   .dbline 153
 021C           ;                                               return; 
 021C 30C0              rjmp L65
 021E           L77:
 021E                   .dbline 155
 021E 80911000          lds R24,_nAddress
 0222 90911100          lds R25,_nAddress+1
 0226 0196              adiw R24,1
 0228 90931100          sts _nAddress+1,R25
 022C 80931000          sts _nAddress,R24
 0230                   .dbline 156
 0230           L74:
 0230                   .dbline 145
 0230 4395              inc R20
 0232           L76:
 0232                   .dbline 145
 0232 81E1              ldi R24,17
 0234 8417              cp R24,R20
 0236 D0F6              brsh L73
 0238                   .dbline 157
 0238           ;                                       }
 0238           ;                                       nAddress++;//下一个单元
 0238           ;                               }
 0238           ;                               ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
 0238 81E0              ldi R24,1
 023A 80930000          sts _ComBuf,R24
 023E                   .dbline 158
 023E           ;                               SendResp();
 023E AADF              rcall _SendResp
 0240                   .dbline 159
 0240           ;                       }
 0240 11C0              rjmp L70
 0242           L71:
 0242                   .dbline 160
 0242           ;                       else if(ComBuf[0]==0x00)//写器件结束
 0242 20900000          lds R2,_ComBuf
 0246 2220              tst R2
 0248 09F4              brne L81
 024A                   .dbline 161
 024A           ;                               break;
 024A 0DC0              rjmp L68
 024C           L81:
 024C                   .dbline 163
 024C           ;                       else//可能是通讯出错了
 024C           ;                       {
 024C                   .dbline 164
 024C           ;                               pw.fpProOver();
 024C E0910C00          lds R30,_pw+12
 0250 F0910D00          lds R31,_pw+12+1
 0254 00D0              rcall xicall
 0256                   .dbline 165
 0256           ;                               return;
 0256 13C0              rjmp L65
 0258           X0:
 0258                   .dbline 167
 0258           ;                       }
 0258           ;               }
 0258           L69:
 0258                   .dbline 169
 0258           ;               else//等待数据失败
 0258           ;               {
 0258                   .dbline 170
 0258           ;                       pw.fpProOver();
 0258 E0910C00          lds R30,_pw+12
 025C F0910D00          lds R31,_pw+12+1
 0260 00D0              rcall xicall
 0262                   .dbline 171
 0262           ;                       return;
 0262 0DC0              rjmp L65
 0264           L70:
 0264                   .dbline 173
 0264           L67:
 0264                   .dbline 139
 0264 B8CF              rjmp L66
 0266           L68:
 0266                   .dbline 174
 0266           ;               }
 0266           ;       }
 0266           ;       pw.fpProOver();//编程结束后的工作
 0266 E0910C00          lds R30,_pw+12
 026A F0910D00          lds R31,_pw+12+1
 026E 00D0              rcall xicall
 0270                   .dbline 175
 0270           ;       Delay_ms(50);//延时等待上位机写线程结束
 0270 02E3              ldi R16,50
 0272 10E0              ldi R17,0
 0274 D3DE              rcall _Delay_ms
 0276                   .dbline 176
 0276           ;       ComBuf[0]=0;//通知上位机编程器进入就绪状态
 0276 2224              clr R2
 0278 20920000          sts _ComBuf,R2
 027C                   .dbline 177
 027C           ;       SendData();
 027C 7ADF              rcall _SendData
 027E                   .dbline -2
 027E           L65:
 027E 00D0              rcall pop_gset1
 0280                   .dbline 0 ; func end
 0280 0895              ret
 0282                   .dbsym r n 20 c
 0282                   .dbend
 0282                   .dbfunc e Read _Read fV
 0282           ;              n -> R20
                        .even
 0282           _Read::
 0282 00D0              rcall push_gset1
 0284                   .dbline -1
 0284                   .dbline 181
 0284           ; }
 0284           ; 
 0284           ; void Read()//读器件
 0284           ; {
 0284                   .dbline 183
 0284           ;       BYTE n;
 0284           ;       pw.fpInitPro();//先设置成编程状态

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -