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

📄 51.lst

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