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

📄 usb.src

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 SRC
📖 第 1 页 / 共 5 页
字号:
?C0055:
; 		ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
			; SOURCE LINE # 291
	MOV  	A,ControlData+02H
	MOV  	R5,A
	MOV  	A,ControlData+03H
	MOV  	ControlData+02H,A
	MOV  	A,R5
	MOV  	ControlData+03H,A
; 		ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
			; SOURCE LINE # 292
	MOV  	A,ControlData+04H
	MOV  	R5,A
	MOV  	A,ControlData+05H
	MOV  	ControlData+04H,A
	MOV  	A,R5
	MOV  	ControlData+05H,A
; 		ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
			; SOURCE LINE # 293
	MOV  	A,ControlData+06H
	MOV  	R5,A
	MOV  	A,ControlData+07H
	MOV  	ControlData+06H,A
	MOV  	A,R5
	MOV  	ControlData+07H,A
; 
; 		//对控制端点的输入/输出进行应答
; 		D12_AcknowledgeEndpoint(0);
			; SOURCE LINE # 296
	CLR  	A
	MOV  	R7,A
	LCALL	_D12_AcknowledgeEndpoint
; 		D12_AcknowledgeEndpoint(1);
			; SOURCE LINE # 297
	MOV  	R7,#01H
	LCALL	_D12_AcknowledgeEndpoint
; 
; 		ControlData.wLength = ControlData.DeviceRequest.wLength;
			; SOURCE LINE # 299
	MOV  	ControlData+08H,ControlData+06H
	MOV  	ControlData+09H,ControlData+07H
; 		ControlData.wCount = 0;
			; SOURCE LINE # 300
	CLR  	A
	MOV  	ControlData+0AH,A
	MOV  	ControlData+0BH,A
; 
; 		if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			; SOURCE LINE # 302
	MOV  	A,ControlData
	JNB  	ACC.7,?C0057
; 		{
			; SOURCE LINE # 303
; 			//从主机传输数据
; 			bEPPflags.bits.setup_packet = 1;
			; SOURCE LINE # 305
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#08H
	MOV  	bEPPflags,A
; 			bEPPflags.bits.control_state = USB_TRANSMIT;		/* get command */
			; SOURCE LINE # 306
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	ORL  	A,#040H
	MOV  	bEPPflags,A
; 		}
			; SOURCE LINE # 307
	RET  	
?C0057:
; 		else
; 		{
			; SOURCE LINE # 309
; 			if (ControlData.DeviceRequest.wLength == 0)
			; SOURCE LINE # 310
	MOV  	A,ControlData+07H
	ORL  	A,ControlData+06H
	JNZ  	?C0059
; 			{
			; SOURCE LINE # 311
; 				bEPPflags.bits.setup_packet = 1;
			; SOURCE LINE # 312
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#08H
	MOV  	bEPPflags,A
; 				bEPPflags.bits.control_state = USB_IDLE;		/* set command */
			; SOURCE LINE # 313
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 			}
			; SOURCE LINE # 314
	RET  	
?C0059:
; 			else
; 			{
			; SOURCE LINE # 316
; 				if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
			; SOURCE LINE # 317
	SETB 	C
	MOV  	A,ControlData+07H
	SUBB 	A,#08H
	MOV  	A,ControlData+06H
	SUBB 	A,#00H
	JC   	?C0061
; 				{
			; SOURCE LINE # 318
; 					//接收数据长度为0
; 					bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 320
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 					D12_SetEndpointStatus(0, 1);
			; SOURCE LINE # 321
	LCALL	L?0216
; 					D12_SetEndpointStatus(1, 1);
			; SOURCE LINE # 322
	MOV  	R5,#01H
	MOV  	R7,#01H
	LJMP 	_D12_SetEndpointStatus
; 				}
			; SOURCE LINE # 323
?C0061:
; 				else
; 				{
			; SOURCE LINE # 325
; 					bEPPflags.bits.control_state = USB_RECEIVE;	//设置接收状态
			; SOURCE LINE # 326
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	ORL  	A,#080H
	MOV  	bEPPflags,A
; 				}
			; SOURCE LINE # 327
; 			} // set command with data
			; SOURCE LINE # 328
; 		} // else set command
			; SOURCE LINE # 329
; 	} // if setup packet
			; SOURCE LINE # 330
	RET  	
?C0054:
; 	else if (bEPPflags.bits.control_state == USB_RECEIVE)
			; SOURCE LINE # 331
	MOV  	R7,bEPPflags
	MOV  	A,R7
	SWAP 	A
	RRC  	A
	RRC  	A
	ANL  	A,#03H
	XRL  	A,#02H
	JNZ  	?C0064
; 	{
			; SOURCE LINE # 332
; 		//接收数据
; 		i =	D12_ReadEndpoint(0, EP0_PACKET_SIZE,
			; SOURCE LINE # 334
	MOV  	A,#LOW (ControlData+0FH)
	ADD  	A,ControlData+0BH
	MOV  	R1,A
	CLR  	A
	MOV  	R2,A
	MOV  	R3,A
	MOV  	R5,#010H
	MOV  	R7,A
	LCALL	_D12_ReadEndpoint
;---- Variable 'i?1653' assigned to Register 'R7' ----
; 			ControlData.dataBuffer + ControlData.wCount);
; 		ControlData.wCount += i;
			; SOURCE LINE # 336
	MOV  	A,R7
	ADD  	A,ControlData+0BH
	MOV  	ControlData+0BH,A
	CLR  	A
	ADDC 	A,ControlData+0AH
	MOV  	ControlData+0AH,A
; 		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
			; SOURCE LINE # 337
	CJNE 	R7,#010H,?C0066
	CLR  	C
	MOV  	A,ControlData+0BH
	SUBB 	A,ControlData+09H
	MOV  	A,ControlData+0AH
	SUBB 	A,ControlData+08H
	JC   	?C0056
?C0066:
; 		{
			; SOURCE LINE # 338
; 			//数据接收完毕
; 			bEPPflags.bits.setup_packet = 1;
			; SOURCE LINE # 340
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#08H
	MOV  	bEPPflags,A
; 			bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 341
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 		}
			; SOURCE LINE # 342
; 	}
			; SOURCE LINE # 343
	RET  	
?C0064:
; 	else
; 	{
			; SOURCE LINE # 345
; 		bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
			; SOURCE LINE # 346
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 	}
			; SOURCE LINE # 347
; }
			; SOURCE LINE # 348
?C0056:
	RET  	
; END OF ep0_rxdone

; 
; //端点0IN处理
; void ep0_txdone(void)

	RSEG  ?PR?ep0_txdone?USB
ep0_txdone:
	USING	0
			; SOURCE LINE # 351
; {
			; SOURCE LINE # 352
; 
; 	short i = ControlData.wLength - ControlData.wCount;
			; SOURCE LINE # 354
	CLR  	C
	MOV  	A,ControlData+09H
	SUBB 	A,ControlData+0BH
	MOV  	i?1754+01H,A
	MOV  	A,ControlData+08H
	SUBB 	A,ControlData+0AH
	MOV  	i?1754,A
;         
; 	D12_ReadLastTransactionStatus(1); //清中断标志位
			; SOURCE LINE # 356
	MOV  	R7,#01H
	LCALL	_D12_ReadLastTransactionStatus
; 	if (bEPPflags.bits.control_state != USB_TRANSMIT) return;//非发送状态,返回
			; SOURCE LINE # 357
	MOV  	R7,bEPPflags
	MOV  	A,R7
	SWAP 	A
	RRC  	A
	RRC  	A
	ANL  	A,#03H
	XRL  	A,#01H
	JNZ  	?C0069
?C0068:
; 	if( i >= EP0_PACKET_SIZE)
			; SOURCE LINE # 358
	CLR  	C
	MOV  	A,i?1754+01H
	SUBB 	A,#010H
	MOV  	A,i?1754
	XRL  	A,#080H
	SUBB 	A,#080H
	JC   	?C0070
; 	{
			; SOURCE LINE # 359
; 		//剩下数据大于16字节,发送16字节
; 		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
			; SOURCE LINE # 361
	MOV  	R3,ControlData+0CH
	MOV  	A,ControlData+0EH
	ADD  	A,ControlData+0BH
	MOV  	R1,A
	MOV  	A,ControlData+0DH
	ADDC 	A,ControlData+0AH
	MOV  	R2,A
	MOV  	R5,#010H
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 		ControlData.wCount += EP0_PACKET_SIZE;
			; SOURCE LINE # 362
	MOV  	A,#010H
	ADD  	A,ControlData+0BH
	MOV  	ControlData+0BH,A
	CLR  	A
	ADDC 	A,ControlData+0AH
	MOV  	ControlData+0AH,A
; 		bEPPflags.bits.control_state = USB_TRANSMIT;
			; SOURCE LINE # 363
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	ORL  	A,#040H
	MOV  	bEPPflags,A
; 	}
			; SOURCE LINE # 364
	RET  	
?C0070:
; 	else if( i != 0)
			; SOURCE LINE # 365
	MOV  	A,i?1754+01H
	ORL  	A,i?1754
	JZ   	?C0072
; 	{
			; SOURCE LINE # 366
; 		//发送剩下数据
; 			D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
			; SOURCE LINE # 368
	MOV  	R5,i?1754+01H
	MOV  	R3,ControlData+0CH
	MOV  	A,ControlData+0EH
	ADD  	A,ControlData+0BH
	MOV  	R1,A
	MOV  	A,ControlData+0DH
	ADDC 	A,ControlData+0AH
	MOV  	R2,A
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 			ControlData.wCount += i;
			; SOURCE LINE # 369
	MOV  	A,i?1754+01H
	ADD  	A,ControlData+0BH
	MOV  	ControlData+0BH,A
	MOV  	A,i?1754
	ADDC 	A,ControlData+0AH
	MOV  	ControlData+0AH,A
; 			bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 370
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 
; 	}
			; SOURCE LINE # 372
	RET  	
?C0072:
; 	else if (i == 0)
			; SOURCE LINE # 373
	MOV  	A,i?1754+01H
	ORL  	A,i?1754
	JNZ  	?C0069
; 	{
			; SOURCE LINE # 374
; 		D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
			; SOURCE LINE # 375
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R5,A
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 		bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 376
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 	}
			; SOURCE LINE # 377
; }
			; SOURCE LINE # 378
?C0069:
	RET  	
; END OF ep0_txdone

; 
; //DMA结束处理
; void dma_eot(void)

	RSEG  ?PR?dma_eot?USB
dma_eot:
			; SOURCE LINE # 381
; {
			; SOURCE LINE # 382
; }
			; SOURCE LINE # 383
	RET  	
; END OF dma_eot

; 
; //端点1OUT处理
; void ep1_txdone(void)

	RSEG  ?PR?ep1_txdone?USB
ep1_txdone:
	USING	0
			; SOURCE LINE # 386
; {
			; SOURCE LINE # 387
; 	D12_ReadLastTransactionStatus(3); //清中断标志位
			; SOURCE LINE # 388
	MOV  	R7,#03H
	LJMP 	_D12_ReadLastTransactionStatus
; END OF ep1_txdone

; }
; 
; //端点1IN处理
; void ep1_rxdone(void)

	RSEG  ?PR?ep1_rxdone?USB
ep1_rxdone:
	USING	0
			; SOURCE LINE # 392
; {
			; SOURCE LINE # 393
; 	unsigned char len;
; 
; 	D12_ReadLastTransactionStatus(2); //清中断标志位
			; SOURCE LINE # 396
	MOV  	R7,#02H
	LCALL	_D12_ReadLastTransactionStatus
; 	len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
			; SOURCE LINE # 397
	MOV  	R3,#00H
	MOV  	R2,#HIGH (GenEpBuf)
	MOV  	R1,#LOW (GenEpBuf)
	MOV  	R5,#010H
	MOV  	R7,#02H
	LCALL	_D12_ReadEndpoint
;---- Variable 'len?2055' assigned to Register 'R7' ----
; 	if(len != 0) bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
			; SOURCE LINE # 398
	MOV  	A,R7
	JZ   	?C0077
	MOV  	R6,bEPPflags+01H
	MOV  	A,R6
	ORL  	A,#04H
	MOV  	bEPPflags+01H,A
?C0077:
; 	rcv_data_len = len ;
			; SOURCE LINE # 399
	MOV  	rcv_data_len,R7
; }
			; SOURCE LINE # 400
	RET  	
; END OF ep1_rxdone

; 
; //主端点OUT控制
; void main_txdone(void)

	RSEG  ?PR?main_txdone?USB
main_txdone:
	USING	0
			; SOURCE LINE # 403
; {
			; SOURCE LINE # 404
; 	D12_ReadLastTransactionStatus(5); //清中断标志位
			; SOURCE LINE # 405
	MOV  	R7,#05H
	LJMP 	_D12_ReadLastTransactionStatus
; END OF main_txdone

; }
; 
; //主端点IN控制
; void main_rxdone(void)

	RSEG  ?PR?main_rxdone?USB
main_rxdone:
	USING	0
			; SOURCE LINE # 409
; {
			; SOURCE LINE # 410
; 	unsigned char len,epstatus;
; 
; 	D12_ReadLastTransactionStatus(4); 			//清中断标志位
			; SOURCE LINE # 413
	MOV  	R7,#04H
	LCALL	_D12_ReadLastTransactionStatus
; 	len = D12_ReadEndpoint(4, 64, EpBuf);		//接收数据
			; SOURCE LINE # 414
	LCALL	L?0213
	MOV  	len?2256,R7
; 	epstatus=D12_ReadEndpointStatus(4);
			; SOURCE LINE # 415
	MOV  	R7,#04H
	LCALL	_D12_ReadEndpointStatus
;---- Variable 'epstatus?2257' assigned to Register 'R7' ----
; 	epstatus &= 0x60;
			; SOURCE LINE # 416
	ANL  	AR7,#060H
; 	if (epstatus == 0x60) len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
			; SOURCE LINE # 417
	CJNE 	R7,#060H,?C0080
	LCALL	L?0213
	MOV  	len?2256,R7
?C0080:
; 	rcv_data_len = len ;
			; SOURCE LINE # 418
	MOV  	rcv_data_len,len?2256
; 	bEPPflags.bits.ep2_rxdone = 1 ;
			; SOURCE LINE # 419
	MOV  	R7,bEPPflags+02H
	MOV  	A,R7
	ORL  	A,#01H
	MOV  	bEPPflags+02H,A
; }
			; SOURCE LINE # 420
	RET  	
; END OF main_rxdone

; void reserved(void)

	RSEG  ?PR?reserved?USB
reserved:
	USING	0
			; SOURCE LINE # 421
; {
			; SOURCE LINE # 422
; 	stall_ep0();
			; SOURCE LINE # 423
	LJMP 	stall_ep0
; END OF reserved

; }
; 
; 
; //获取设备状态
; void get_status(void)

	RSEG  ?PR?get_status?USB
get_status:
	USING	0
			; SOURCE LINE # 428
; {
			; SOURCE LINE # 429
; 	unsigned char endp, txdat[2];
; 	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
			; SOURCE LINE # 431
	MOV  	A,ControlData
	ANL  	A,#01FH
	MOV  	bRecipient?2460,A
; 	unsigned char c;
; 	if (bRecipient == USB_RECIPIENT_DEVICE)
			; SOURCE LINE # 433
	JNZ  	?C0083
; 	{
			; SOURCE LINE # 434
; 		if(bEPPflags.bits.remote_wakeup == 1)		//获取远程唤醒状态
			; SOURCE LINE # 435
	MOV  	R7,bEPPflags
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0FH
	JNB  	ACC.0,?C0084
; 			txdat[0] = 3;
			; SOURCE LINE # 436
	MOV  	txdat?2459,#03H
	SJMP 	?C0085
?C0084:
; 		else
; 			txdat[0] = 1;
			; SOURCE LINE # 438
	MOV  	txdat?2459,#01H
?C0085:
; 		txdat[1]=0;
			; SOURCE LINE # 439
	CLR  	A
	MOV  	txdat?2459+01H,A
; 		single_transmit(txdat, 2);
			; SOURCE LINE # 440
	MOV  	R3,A
	MOV  	R2,#HIGH (txdat?2459)
	MOV  	R1,#LOW (txdat?2459)
	MOV  	R5,#02H
	LJMP 	_single_transmit
; 	}
			; SOURCE LINE # 441
?C0083:
; 	else if (bRecipient == USB_RECIPIENT_INTERFACE)
			; SOURCE LINE # 442
	MOV  	A,bRecipient?2460
	CJNE 	A,#01H,?C0087
; 	{												//获取接口状态
			; SOURCE LINE # 443
; 		txdat[0]=0;
			; SOURCE LINE # 444
	CLR  	A
	MOV  	txdat?2459,A
; 		txdat[1]=0;
			; SOURCE LINE # 445
	MOV  	txdat?2459+01H,A
; 		single_transmit(txdat, 2);
			; SOURCE LINE # 446
	MOV  	R3,A

⌨️ 快捷键说明

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