📄 51pro.lis
字号:
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 + -