📄 51.lst
字号:
0243 C02D RJMP 0x0271
(0144) {
(0145) for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
0244 E042 LDI R20,2
0245 C023 RJMP 0x0269
(0146) {
(0147) if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
0246 E688 LDI R24,0x68
0247 E090 LDI R25,0
0248 2FE4 MOV R30,R20
0249 27FF CLR R31
024A 0FE8 ADD R30,R24
024B 1FF9 ADC R31,R25
024C 8100 LDD R16,Z+0
024D 91E00080 LDS R30,0x80
024F 91F00081 LDS R31,0x81
0251 D106 RCALL xicall
0252 2300 TST R16
0253 F459 BNE 0x025F
(0148) {
(0149) pw.fpProOver();//出错了就结束编程
0254 91E00086 LDS R30,0x86
0256 91F00087 LDS R31,0x87
0258 D0FF RCALL xicall
(0150) ComBuf[0]=0xff;
0259 EF8F LDI R24,0xFF
025A 93800068 STS ComBuf,R24
(0151) SendResp();//回应上位机一个字节,表示写数据出错了
025C DFBD RCALL _SendResp
(0152) WaitData();//等待上位机的回应后就结束
025D DF7E RCALL _WaitData
(0153) return;
025E C030 RJMP 0x028F
(0154) }
(0155) nAddress++;//下一个单元
025F 9180008A LDS R24,nAddress
0261 9190008B LDS R25,nAddress+1
0263 9601 ADIW R24,1
0264 9390008B STS nAddress+1,R25
0266 9380008A STS nAddress,R24
0268 9543 INC R20
0269 E181 LDI R24,0x11
026A 1784 CP R24,R20
026B F6D0 BCC 0x0246
(0156) }
(0157) ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
026C E081 LDI R24,1
026D 93800068 STS ComBuf,R24
(0158) SendResp();
026F DFAA RCALL _SendResp
(0159) }
0270 C011 RJMP 0x0282
(0160) else if(ComBuf[0]==0x00)//写器件结束
0271 90200068 LDS R2,ComBuf
0273 2022 TST R2
0274 F409 BNE 0x0276
(0161) break;
0275 C00D RJMP 0x0283
(0162) else//可能是通讯出错了
(0163) {
(0164) pw.fpProOver();
0276 91E00086 LDS R30,0x86
0278 91F00087 LDS R31,0x87
027A D0DD RCALL xicall
(0165) return;
027B C013 RJMP 0x028F
(0166) }
(0167) }
(0168) else//等待数据失败
(0169) {
(0170) pw.fpProOver();
027C 91E00086 LDS R30,0x86
027E 91F00087 LDS R31,0x87
0280 D0D7 RCALL xicall
(0171) return;
0281 C00D RJMP 0x028F
0282 CFB8 RJMP 0x023B
(0172) }
(0173) }
(0174) pw.fpProOver();//编程结束后的工作
0283 91E00086 LDS R30,0x86
0285 91F00087 LDS R31,0x87
0287 D0D0 RCALL xicall
(0175) Delay_ms(50);//延时等待上位机写线程结束
0288 E302 LDI R16,0x32
0289 E010 LDI R17,0
028A DED3 RCALL _Delay_ms
(0176) ComBuf[0]=0;//通知上位机编程器进入就绪状态
028B 2422 CLR R2
028C 92200068 STS ComBuf,R2
(0177) SendData();
028E DF7A RCALL _SendData
028F D0B4 RCALL pop_gset1
0290 9508 RET
_Read:
n --> R20
0291 D0AF RCALL push_gset1
(0178) }
(0179)
(0180) void Read()//读器件
(0181) {
(0182) BYTE n;
(0183) pw.fpInitPro();//先设置成编程状态
0292 91E0007A LDS R30,pw
0294 91F0007B LDS R31,pw+1
0296 D0C1 RCALL xicall
(0184) SendData();//回应上位机表示进入读状态
0297 DF71 RCALL _SendData
0298 C035 RJMP 0x02CE
(0185) while(1)
(0186) {
(0187) if(WaitResp())//等待上位机回应1个字节
0299 DF20 RCALL _WaitResp
029A 2300 TST R16
029B F409 BNE 0x029D
029C C032 RJMP 0x02CF
(0188) {
(0189) if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
029D 90200068 LDS R2,ComBuf
029F 2022 TST R2
02A0 F409 BNE 0x02A2
(0190) {
(0191) break;
02A1 C02D RJMP 0x02CF
(0192) }
(0193) else if(ComBuf[0]==0xff)//0xff表示重发
02A2 91800068 LDS R24,ComBuf
02A4 3F8F CPI R24,0xFF
02A5 F449 BNE 0x02AF
(0194) {
(0195) nAddress=nAddress-0x0010;
02A6 9180008A LDS R24,nAddress
02A8 9190008B LDS R25,nAddress+1
02AA 9740 SBIW R24,0x10
02AB 9390008B STS nAddress+1,R25
02AD 9380008A STS nAddress,R24
(0196) }
(0197) for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
02AF E042 LDI R20,2
02B0 C016 RJMP 0x02C7
(0198) {
(0199) ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
02B1 91E00082 LDS R30,0x82
02B3 91F00083 LDS R31,0x83
02B5 D0A2 RCALL xicall
02B6 E688 LDI R24,0x68
02B7 E090 LDI R25,0
02B8 2FE4 MOV R30,R20
02B9 27FF CLR R31
02BA 0FE8 ADD R30,R24
02BB 1FF9 ADC R31,R25
02BC 8300 STD Z+0,R16
(0200) nAddress++;//下一个单元
02BD 9180008A LDS R24,nAddress
02BF 9190008B LDS R25,nAddress+1
02C1 9601 ADIW R24,1
02C2 9390008B STS nAddress+1,R25
02C4 9380008A STS nAddress,R24
02C6 9543 INC R20
02C7 E181 LDI R24,0x11
02C8 1784 CP R24,R20
02C9 F738 BCC 0x02B1
(0201) }
(0202) ComBuf[0]=6;//向上位机发送读出的数据块
02CA E086 LDI R24,6
02CB 93800068 STS ComBuf,R24
(0203) SendData();
02CD DF3B RCALL _SendData
02CE CFCA RJMP 0x0299
(0204) }
(0205) else
(0206) break;//等待回应失败
(0207)
(0208) }
(0209) pw.fpProOver();//操作结束设置为运行状态
02CF 91E00086 LDS R30,0x86
02D1 91F00087 LDS R31,0x87
02D3 D084 RCALL xicall
(0210) ComBuf[0]=0;//通知上位机编程器进入就绪状态
02D4 2422 CLR R2
02D5 92200068 STS ComBuf,R2
(0211) SendData();
02D7 DF31 RCALL _SendData
02D8 D06B RCALL pop_gset1
02D9 9508 RET
(0212) }
(0213)
(0214) void Lock()//写锁定位
(0215) {
(0216) pw.fpLock();
_Lock:
02DA 91E00084 LDS R30,0x84
02DC 91F00085 LDS R31,0x85
02DE D079 RCALL xicall
(0217) SendData();
02DF DF29 RCALL _SendData
02E0 9508 RET
(0218) }
(0219)
(0220) ///////////////////////////////////////////////////////////////////////////////////////////////////
(0221) //所支持的FID,请在这里继续添加
(0222) ///////////////////////////////////////////////////////////////////////////////////////////////////
(0223) extern void PreparePro00();//FID=00:AT89C51编程器
(0224) extern void PreparePro01();//FID=01:AT89C2051编程器
(0225) extern void PreparePro02();//FID=02:AT89S51编程器
(0226)
(0227) void main()
(0228) {
(0229) DDRC=0xff;
_main:
02E1 EF8F LDI R24,0xFF
02E2 BB84 OUT 0x14,R24
(0230) PORTC|=BIT(PB0);
02E3 9AA8 SBI 0x15,0
(0231) PORTC&=~BIT(PB1);
02E4 98A9 CBI 0x15,1
(0232) uart_init();
02E5 DE8D RCALL _uart_init
(0233) Delay_ms(500);//延时1秒后编程器自举
02E6 EF04 LDI R16,0xF4
02E7 E011 LDI R17,1
02E8 DE75 RCALL _Delay_ms
(0234) ComBuf[0]=0;
02E9 2422 CLR R2
02EA 92200068 STS ComBuf,R2
(0235) SendData();
02EC DF1C RCALL _SendData
02ED C047 RJMP 0x0335
(0236) while(1)//串口通讯采用查询方式
(0237) {
(0238) if(!WaitComm())//如果超时,通讯出错
02EE DE93 RCALL _WaitComm
02EF 2300 TST R16
02F0 F431 BNE 0x02F7
(0239) {
(0240) Delay_ms(200);
02F1 EC08 LDI R16,0xC8
02F2 E010 LDI R17,0
02F3 DE6A RCALL _Delay_ms
(0241) ComBuf[0]=0;//让编程器复位,使编程器就绪
02F4 2422 CLR R2
02F5 92200068 STS ComBuf,R2
(0242) }
(0243) switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
02F7 91600069 LDS R22,ComBuf+1
02F9 2777 CLR R23
02FA 3060 CPI R22,0
02FB 0767 CPC R22,R23
02FC F081 BEQ 0x030D
02FD 3061 CPI R22,1
02FE E0E0 LDI R30,0
02FF 077E CPC R23,R30
0300 F061 BEQ 0x030D
0301 3062 CPI R22,2
0302 E0E0 LDI R30,0
0303 077E CPC R23,R30
0304 F009 BEQ 0x0306
0305 C002 RJMP 0x0308
(0244) {
(0245) case 0://at89c51编程器
(0246) //PreparePro00();
(0247) break;
(0248) case 1://at89c2051编程器
(0249) //PreparePro01();
(0250) break;
(0251) case 2://at89s51编程器
(0252) PreparePro02();
0306 DE1E RCALL _PreparePro02
(0253) break;
0307 C005 RJMP 0x030D
(0254) //case 3:支持新器件时,请继续向下添加
(0255) // break;
(0256) //case 4:
(0257) // break;
(0258) default:
(0259) ComBuf[0]=0xff;
0308 EF8F LDI R24,0xFF
0309 93800068 STS ComBuf,R24
(0260) ComBuf[1]=0xff;//表示无效的操作
030B 93800069 STS ComBuf+1,R24
(0261) break;
(0262) }
(0263) switch(ComBuf[0])//根据操作ID跳到不同的操作函数
030D 91400068 LDS R20,ComBuf
030F 2755 CLR R21
0310 3040 CPI R20,0
0311 0745 CPC R20,R21
0312 F0A9 BEQ 0x0328
0313 3041 CPI R20,1
0314 E0E0 LDI R30,0
0315 075E CPC R21,R30
0316 F099 BEQ 0x032A
0317 3042 CPI R20,2
0318 E0E0 LDI R30,0
0319 075E CPC R21,R30
031A F089 BEQ 0x032C
031B 3043 CPI R20,3
031C E0E0 LDI R30,0
031D 075E CPC R21,R30
031E F079 BEQ 0x032E
031F 3044 CPI R20,4
0320 E0E0 LDI R30,0
0321 075E CPC R21,R30
0322 F069 BEQ 0x0330
0323 3045 CPI R20,5
0324 E0E0 LDI R30,0
0325 075E CPC R21,R30
0326 F059 BEQ 0x0332
0327 C00C RJMP 0x0334
(0264) {
(0265) case 0x00:
(0266) RstPro();//编程器复位
0328 DEF5 RCALL _RstPro
(0267) break;
0329 C00B RJMP 0x0335
(0268) case 0x01:
(0269) ReadSign();//读特征字
032A DEFA RCALL _ReadSign
(0270) break;
032B C009 RJMP 0x0335
(0271) case 0x02:
(0272) Erase();//擦除器件
032C DEFF RCALL _Erase
(0273) break;
032D C007 RJMP 0x0335
(0274) case 0x03:
(0275) Write();//写器件
032E DF04 RCALL _Write
(0276) break;
032F C005 RJMP 0x0335
(0277) case 0x04:
(0278) Read();//读器件
0330 DF60 RCALL _Read
(0279) break;
0331 C003 RJMP 0x0335
(0280) case 0x05:
(0281) Lock();//写锁定位
0332 DFA7 RCALL _Lock
(0282) break;
0333 C001 RJMP 0x0335
(0283) default:
(0284) SendData();
FILE: <library>
0334 DED4 RCALL _SendData
0335 CFB8 RJMP 0x02EE
0336 9508 RET
pop_gset2:
0337 E0E2 LDI R30,2
0338 C00C RJMP pop
push_gset5:
0339 92FA ST R15,-Y
033A 92EA ST R14,-Y
push_gset4:
033B 92DA ST R13,-Y
033C 92CA ST R12,-Y
push_gset3:
033D 92BA ST R11,-Y
033E 92AA ST R10,-Y
push_gset2:
033F 937A ST R23,-Y
0340 936A ST R22,-Y
push_gset1:
0341 935A ST R21,-Y
0342 934A ST R20,-Y
0343 9508 RET
pop_gset1:
0344 E0E1 LDI R30,1
pop:
0345 9149 LD R20,Y+
0346 9159 LD R21,Y+
0347 FDE0 SBRC R30,0
0348 9508 RET
0349 9169 LD R22,Y+
034A 9179 LD R23,Y+
034B FDE1 SBRC R30,1
034C 9508 RET
034D 90A9 LD R10,Y+
034E 90B9 LD R11,Y+
034F FDE2 SBRC R30,2
0350 9508 RET
0351 90C9 LD R12,Y+
0352 90D9 LD R13,Y+
0353 FDE3 SBRC R30,3
0354 9508 RET
0355 90E9 LD R14,Y+
0356 90F9 LD R15,Y+
0357 9508 RET
xicall:
0358 920A ST R0,-Y
0359 95C8 LPM
035A 920A ST R0,-Y
035B 9631 ADIW R30,1
035C 95C8 LPM
035D 2DF0 MOV R31,R0
035E 91E9 LD R30,Y+
035F 9009 LD R0,Y+
0360 9409 IJMP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -