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

📄 51pro.s

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 S
📖 第 1 页 / 共 2 页
字号:
_Write::
	rcall push_gset1
	.dbline -1
	.dbline 135
; }
; 
; void Write()//写器件
; {
	.dbline 137
; 	BYTE n;
; 	pw.fpInitPro();//编程前的准备工作
	lds R30,_pw
	lds R31,_pw+1
	rcall xicall
	.dbline 138
; 	SendData();//回应上位机表示进入写器件状态,可以发来数据
	rcall _SendData
	rjmp L67
L66:
	.dbline 140
; 	while(1)
; 	{
	.dbline 141
; 		if(WaitData())//如果等待数据成功
	rcall _WaitData
	tst R16
	brne X1
	rjmp L69
X1:
	.dbline 142
; 		{
	.dbline 143
; 			if(ComBuf[0]==0x07)//判断是否继续写
	lds R24,_ComBuf
	cpi R24,7
	breq X2
	rjmp L71
X2:
	.dbline 144
; 			{
	.dbline 145
; 				for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
	ldi R20,2
	rjmp L76
L73:
	.dbline 146
; 				{
	.dbline 147
; 					if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
	ldi R24,<_ComBuf
	ldi R25,>_ComBuf
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	lds R30,_pw+6
	lds R31,_pw+6+1
	rcall xicall
	tst R16
	brne L77
	.dbline 148
; 					{
	.dbline 149
; 						pw.fpProOver();//出错了就结束编程
	lds R30,_pw+12
	lds R31,_pw+12+1
	rcall xicall
	.dbline 150
; 						ComBuf[0]=0xff;
	ldi R24,255
	sts _ComBuf,R24
	.dbline 151
; 						SendResp();//回应上位机一个字节,表示写数据出错了
	rcall _SendResp
	.dbline 152
; 						WaitData();//等待上位机的回应后就结束
	rcall _WaitData
	.dbline 153
; 						return;	
	rjmp L65
L77:
	.dbline 155
	lds R24,_nAddress
	lds R25,_nAddress+1
	adiw R24,1
	sts _nAddress+1,R25
	sts _nAddress,R24
	.dbline 156
L74:
	.dbline 145
	inc R20
L76:
	.dbline 145
	ldi R24,17
	cp R24,R20
	brsh L73
	.dbline 157
; 					}
; 					nAddress++;//下一个单元
; 				}
; 				ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
	ldi R24,1
	sts _ComBuf,R24
	.dbline 158
; 				SendResp();
	rcall _SendResp
	.dbline 159
; 			}
	rjmp L70
L71:
	.dbline 160
; 			else if(ComBuf[0]==0x00)//写器件结束
	lds R2,_ComBuf
	tst R2
	brne L81
	.dbline 161
; 				break;
	rjmp L68
L81:
	.dbline 163
; 			else//可能是通讯出错了
; 			{
	.dbline 164
; 				pw.fpProOver();
	lds R30,_pw+12
	lds R31,_pw+12+1
	rcall xicall
	.dbline 165
; 				return;
	rjmp L65
X0:
	.dbline 167
; 			}
; 		}
L69:
	.dbline 169
; 		else//等待数据失败
; 		{
	.dbline 170
; 			pw.fpProOver();
	lds R30,_pw+12
	lds R31,_pw+12+1
	rcall xicall
	.dbline 171
; 			return;
	rjmp L65
L70:
	.dbline 173
L67:
	.dbline 139
	rjmp L66
L68:
	.dbline 174
; 		}
; 	}
; 	pw.fpProOver();//编程结束后的工作
	lds R30,_pw+12
	lds R31,_pw+12+1
	rcall xicall
	.dbline 175
; 	Delay_ms(50);//延时等待上位机写线程结束
	ldi R16,50
	ldi R17,0
	rcall _Delay_ms
	.dbline 176
; 	ComBuf[0]=0;//通知上位机编程器进入就绪状态
	clr R2
	sts _ComBuf,R2
	.dbline 177
; 	SendData();
	rcall _SendData
	.dbline -2
L65:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r n 20 c
	.dbend
	.dbfunc e Read _Read fV
;              n -> R20
	.even
_Read::
	rcall push_gset1
	.dbline -1
	.dbline 181
; }
; 
; void Read()//读器件
; {
	.dbline 183
; 	BYTE n;
; 	pw.fpInitPro();//先设置成编程状态
	lds R30,_pw
	lds R31,_pw+1
	rcall xicall
	.dbline 184
; 	SendData();//回应上位机表示进入读状态
	rcall _SendData
	rjmp L88
L87:
	.dbline 186
; 	while(1)
; 	{
	.dbline 187
; 		if(WaitResp())//等待上位机回应1个字节
	rcall _WaitResp
	tst R16
	brne X3
	rjmp L89
X3:
	.dbline 188
; 		{
	.dbline 189
; 			if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
	lds R2,_ComBuf
	tst R2
	brne L92
	.dbline 190
; 			{
	.dbline 191
; 				break;
	rjmp L89
L92:
	.dbline 193
; 			}
; 			else if(ComBuf[0]==0xff)//0xff表示重发
	lds R24,_ComBuf
	cpi R24,255
	brne L94
	.dbline 194
; 			{
	.dbline 195
; 				nAddress=nAddress-0x0010;
	lds R24,_nAddress
	lds R25,_nAddress+1
	sbiw R24,16
	sts _nAddress+1,R25
	sts _nAddress,R24
	.dbline 196
; 			}
L94:
	.dbline 197
; 			for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
	ldi R20,2
	rjmp L99
L96:
	.dbline 198
	.dbline 199
	lds R30,_pw+8
	lds R31,_pw+8+1
	rcall xicall
	ldi R24,<_ComBuf
	ldi R25,>_ComBuf
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 200
	lds R24,_nAddress
	lds R25,_nAddress+1
	adiw R24,1
	sts _nAddress+1,R25
	sts _nAddress,R24
	.dbline 201
L97:
	.dbline 197
	inc R20
L99:
	.dbline 197
	ldi R24,17
	cp R24,R20
	brsh L96
	.dbline 202
; 			{
; 				ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
; 				nAddress++;//下一个单元
; 			}
; 			ComBuf[0]=6;//向上位机发送读出的数据块
	ldi R24,6
	sts _ComBuf,R24
	.dbline 203
; 			SendData();
	rcall _SendData
	.dbline 204
; 		}
	.dbline 206
; 		else
; 			break;//等待回应失败	
L91:
	.dbline 208
L88:
	.dbline 185
	rjmp L87
L89:
	.dbline 209
; 
; 	}
; 	pw.fpProOver();//操作结束设置为运行状态
	lds R30,_pw+12
	lds R31,_pw+12+1
	rcall xicall
	.dbline 210
; 	ComBuf[0]=0;//通知上位机编程器进入就绪状态
	clr R2
	sts _ComBuf,R2
	.dbline 211
; 	SendData();
	rcall _SendData
	.dbline -2
L86:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r n 20 c
	.dbend
	.dbfunc e Lock _Lock fV
	.even
_Lock::
	.dbline -1
	.dbline 215
; }
; 
; void Lock()//写锁定位
; {
	.dbline 216
; 	pw.fpLock();
	lds R30,_pw+10
	lds R31,_pw+10+1
	rcall xicall
	.dbline 217
; 	SendData();
	rcall _SendData
	.dbline -2
L102:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 228
; }
; 
; ///////////////////////////////////////////////////////////////////////////////////////////////////
; //所支持的FID,请在这里继续添加
; ///////////////////////////////////////////////////////////////////////////////////////////////////
; extern void PreparePro00();//FID=00:AT89C51编程器
; extern void PreparePro01();//FID=01:AT89C2051编程器
; extern void PreparePro02();//FID=02:AT89S51编程器
; 
; void main()
; {
	.dbline 229
;  	DDRC=0xff;
	ldi R24,255
	out 0x14,R24
	.dbline 230
; 	PORTC|=BIT(PB0);
	sbi 0x15,0
	.dbline 231
; 	PORTC&=~BIT(PB1);
	cbi 0x15,1
	.dbline 232
;     uart_init();
	rcall _uart_init
	.dbline 233
; 	Delay_ms(500);//延时1秒后编程器自举
	ldi R16,500
	ldi R17,1
	rcall _Delay_ms
	.dbline 234
; 	ComBuf[0]=0;
	clr R2
	sts _ComBuf,R2
	.dbline 235
; 	SendData();
	rcall _SendData
	rjmp L106
L105:
	.dbline 237
;  	while(1)//串口通讯采用查询方式
; 	{
	.dbline 238
; 		if(!WaitComm())//如果超时,通讯出错
	rcall _WaitComm
	tst R16
	brne L108
	.dbline 239
; 		{
	.dbline 240
; 			Delay_ms(200);
	ldi R16,200
	ldi R17,0
	rcall _Delay_ms
	.dbline 241
; 			ComBuf[0]=0;//让编程器复位,使编程器就绪
	clr R2
	sts _ComBuf,R2
	.dbline 242
; 		}
L108:
	.dbline 243
; 		switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
	lds R22,_ComBuf+1
	clr R23
	cpi R22,0
	cpc R22,R23
	breq L111
X4:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L111
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L116
	rjmp L110
X5:
	.dbline 244
; 		{
	.dbline 247
; 			case 0://at89c51编程器
; 				//PreparePro00();
; 				break;
	.dbline 250
; 			case 1://at89c2051编程器
; 				//PreparePro01();
; 				break;
L116:
	.dbline 252
; 			case 2://at89s51编程器
; 				PreparePro02();
	rcall _PreparePro02
	.dbline 253
; 				break;
	rjmp L111
L110:
	.dbline 259
; 			//case 3:支持新器件时,请继续向下添加
; 			//	break;
; 			//case 4:
; 			//	break;
; 			default:
; 				ComBuf[0]=0xff;
	ldi R24,255
	sts _ComBuf,R24
	.dbline 260
; 				ComBuf[1]=0xff;//表示无效的操作
	sts _ComBuf+1,R24
	.dbline 261
; 				break;
L111:
	.dbline 263
; 		}
; 		switch(ComBuf[0])//根据操作ID跳到不同的操作函数
	lds R20,_ComBuf
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L121
X6:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L122
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L123
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L124
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L125
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L126
	rjmp L118
X7:
	.dbline 264
; 		{
L121:
	.dbline 266
; 			case 0x00:
; 				RstPro();//编程器复位
	rcall _RstPro
	.dbline 267
; 				break;
	rjmp L119
L122:
	.dbline 269
; 			case 0x01:
; 				ReadSign();//读特征字
	rcall _ReadSign
	.dbline 270
; 				break;
	rjmp L119
L123:
	.dbline 272
; 			case 0x02:
; 				Erase();//擦除器件
	rcall _Erase
	.dbline 273
; 				break;
	rjmp L119
L124:
	.dbline 275
; 			case 0x03:
; 				Write();//写器件
	rcall _Write
	.dbline 276
; 				break;
	rjmp L119
L125:
	.dbline 278
; 			case 0x04:
; 				Read();//读器件
	rcall _Read
	.dbline 279
; 				break;
	rjmp L119
L126:
	.dbline 281
; 			case 0x05:
; 				Lock();//写锁定位
	rcall _Lock
	.dbline 282
; 				break;
	rjmp L119
L118:
	.dbline 284
; 			default:
; 				SendData();
	rcall _SendData
	.dbline 285
; 				break;
L119:
	.dbline 287
L106:
	.dbline 236
	rjmp L105
X8:
	.dbline -2
L104:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
_pw::
	.blkb 14
	.dbstruct 0 14 _prowork
	.dbfield 0 fpInitPro pfV
	.dbfield 2 fpReadSign pfV
	.dbfield 4 fpErase pfV
	.dbfield 6 fpWrite pfc
	.dbfield 8 fpRead pfc
	.dbfield 10 fpLock pfV
	.dbfield 12 fpProOver pfV
	.dbend
	.dbsym e pw _pw S[_prowork]
_nTimeOut::
	.blkb 2
	.dbsym e nTimeOut _nTimeOut i
_nAddress::
	.blkb 2
	.dbsym e nAddress _nAddress i

⌨️ 快捷键说明

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