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

📄 usb.src

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 SRC
📖 第 1 页 / 共 5 页
字号:
	MOV  	R2,#HIGH (txdat?2459)
	MOV  	R1,#LOW (txdat?2459)
	MOV  	R5,#02H
	LJMP 	_single_transmit
; 	}
			; SOURCE LINE # 447
?C0087:
; 	else if (bRecipient == USB_RECIPIENT_ENDPOINT)
			; SOURCE LINE # 448
	MOV  	A,bRecipient?2460
	XRL  	A,#02H
	JNZ  	?C0089
; 	{												//获取端点状态
			; SOURCE LINE # 449
; 		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
			; SOURCE LINE # 450
	MOV  	A,ControlData+05H
	ANL  	A,#03H
	MOV  	endp?2458,A
; 		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			; SOURCE LINE # 451
	MOV  	A,ControlData+05H
	JNB  	ACC.7,?C0090
; 			c = D12_SelectEndpoint(endp*2 + 1);	/* Control-in */
			; SOURCE LINE # 452
	MOV  	A,endp?2458
	ADD  	A,ACC
	INC  	A
	MOV  	R7,A
	LCALL	_D12_SelectEndpoint
	MOV  	c?2461,R7
	SJMP 	?C0091
?C0090:
; 		else
; 			c = D12_SelectEndpoint(endp*2);	/* Control-out */
			; SOURCE LINE # 454
	MOV  	A,endp?2458
	ADD  	A,ACC
	MOV  	R7,A
	LCALL	_D12_SelectEndpoint
	MOV  	c?2461,R7
?C0091:
; 		if(c & D12_STALL)
			; SOURCE LINE # 455
	MOV  	A,c?2461
	JNB  	ACC.1,?C0092
; 			txdat[0] = 1;
			; SOURCE LINE # 456
	MOV  	txdat?2459,#01H
	SJMP 	?C0093
?C0092:
; 		else
; 			txdat[0] = 0;
			; SOURCE LINE # 458
	CLR  	A
	MOV  	txdat?2459,A
?C0093:
; 		txdat[1] = 0;
			; SOURCE LINE # 459
	CLR  	A
	MOV  	txdat?2459+01H,A
; 		single_transmit(txdat, 2);
			; SOURCE LINE # 460
	MOV  	R3,A
	MOV  	R2,#HIGH (txdat?2459)
	MOV  	R1,#LOW (txdat?2459)
	MOV  	R5,#02H
	LJMP 	_single_transmit
; 	}
			; SOURCE LINE # 461
?C0089:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 463
	LCALL	stall_ep0
; }
			; SOURCE LINE # 464
?C0095:
	RET  	
; END OF get_status

; 
; //特性清除
; void clear_feature(void)

	RSEG  ?PR?clear_feature?USB
clear_feature:
	USING	0
			; SOURCE LINE # 467
; {
			; SOURCE LINE # 468
; 	unsigned char endp;
; 	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
			; SOURCE LINE # 470
	MOV  	A,ControlData
	ANL  	A,#01FH
	MOV  	bRecipient?2563,A
; 
; 	if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
			; SOURCE LINE # 472
	JNZ  	?C0096
	MOV  	A,ControlData+03H
	XRL  	A,#01H
	ORL  	A,ControlData+02H
	JNZ  	?C0096
; 	{											//清除远程唤醒功能
			; SOURCE LINE # 473
; 		DISABLE;
			; SOURCE LINE # 474
	CLR  	EA
; 		bEPPflags.bits.remote_wakeup = 0;
			; SOURCE LINE # 475
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0EFH
; 		ENABLE;
			; SOURCE LINE # 476
; 		single_transmit(0, 0);
			; SOURCE LINE # 477
	LJMP 	L?0211
; 	}
			; SOURCE LINE # 478
?C0096:
; 	else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
			; SOURCE LINE # 479
	MOV  	A,bRecipient?2563
	XRL  	A,#02H
	JNZ  	?C0098
	MOV  	A,ControlData+03H
	ORL  	A,ControlData+02H
	JNZ  	?C0098
; 	{											//清除端点stall
			; SOURCE LINE # 480
; 		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
			; SOURCE LINE # 481
	MOV  	A,ControlData+05H
	ANL  	A,#03H
	MOV  	endp?2562,A
; 		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			; SOURCE LINE # 482
	MOV  	A,ControlData+05H
	JNB  	ACC.7,?C0099
; 			/* clear TX stall for IN on EPn. */
; 			D12_SetEndpointStatus(endp*2 + 1, 0);
			; SOURCE LINE # 484
	MOV  	A,endp?2562
	ADD  	A,ACC
	INC  	A
	MOV  	R7,A
	CLR  	A
	MOV  	R5,A
	LCALL	_D12_SetEndpointStatus
	SJMP 	?C0100
?C0099:
; 		else
; 			/* clear RX stall for OUT on EPn. */
; 			D12_SetEndpointStatus(endp*2, 0);
			; SOURCE LINE # 487
	MOV  	A,endp?2562
	ADD  	A,ACC
	MOV  	R7,A
	CLR  	A
	MOV  	R5,A
	LCALL	_D12_SetEndpointStatus
?C0100:
; 		single_transmit(0, 0);
			; SOURCE LINE # 488
	LJMP 	L?0212
; 	}
			; SOURCE LINE # 489
?C0098:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 491
	LCALL	stall_ep0
; }
			; SOURCE LINE # 492
?C0102:
	RET  	
; END OF clear_feature

; 
; //特性设置
; void set_feature(void)

	RSEG  ?PR?set_feature?USB
set_feature:
	USING	0
			; SOURCE LINE # 495
; {
			; SOURCE LINE # 496
; 	unsigned char endp;
; 	unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
			; SOURCE LINE # 498
	MOV  	A,ControlData
	ANL  	A,#01FH
	MOV  	bRecipient?2665,A
; 
; 	if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
			; SOURCE LINE # 500
	JNZ  	?C0103
	MOV  	A,ControlData+03H
	XRL  	A,#01H
	ORL  	A,ControlData+02H
	JNZ  	?C0103
; 	{											//设置远程唤醒功能
			; SOURCE LINE # 501
; 		DISABLE;
			; SOURCE LINE # 502
	CLR  	EA
; 		bEPPflags.bits.remote_wakeup = 1;
			; SOURCE LINE # 503
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#010H
; 		ENABLE;
			; SOURCE LINE # 504
; 		single_transmit(0, 0);
			; SOURCE LINE # 505
	LJMP 	L?0211
; 	}
			; SOURCE LINE # 506
?C0103:
; 	else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
			; SOURCE LINE # 507
	MOV  	A,bRecipient?2665
	XRL  	A,#02H
	JNZ  	?C0105
	MOV  	A,ControlData+03H
	ORL  	A,ControlData+02H
	JNZ  	?C0105
; 	{											//设置端点stall
			; SOURCE LINE # 508
; 		endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
			; SOURCE LINE # 509
	MOV  	A,ControlData+05H
	ANL  	A,#03H
	MOV  	endp?2664,A
; 		if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
			; SOURCE LINE # 510
	MOV  	A,ControlData+05H
	JNB  	ACC.7,?C0106
; 			/* clear TX stall for IN on EPn. */
; 			D12_SetEndpointStatus(endp*2 + 1, 1);
			; SOURCE LINE # 512
	MOV  	A,endp?2664
	ADD  	A,ACC
	INC  	A
	MOV  	R7,A
	MOV  	R5,#01H
	LCALL	_D12_SetEndpointStatus
	SJMP 	?C0107
?C0106:
; 		else
; 			/* clear RX stall for OUT on EPn. */
; 			D12_SetEndpointStatus(endp*2, 1);
			; SOURCE LINE # 515
	MOV  	A,endp?2664
	ADD  	A,ACC
	MOV  	R7,A
	MOV  	R5,#01H
	LCALL	_D12_SetEndpointStatus
?C0107:
; 		single_transmit(0, 0);
			; SOURCE LINE # 516
	LJMP 	L?0212
; 	}
			; SOURCE LINE # 517
?C0105:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 519
	LCALL	stall_ep0
; }
			; SOURCE LINE # 520
?C0109:
	RET  	
; END OF set_feature

; 
; //设置地址
; void set_address(void)

	RSEG  ?PR?set_address?USB
set_address:
	USING	0
			; SOURCE LINE # 523
; {
			; SOURCE LINE # 524
; 	D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &	DEVICE_ADDRESS_MASK), 1);
			; SOURCE LINE # 525
	MOV  	A,ControlData+03H
	ANL  	A,#07FH
	MOV  	R7,A
	MOV  	R5,#01H
	LCALL	_D12_SetAddressEnable
; 	single_transmit(0, 0);
			; SOURCE LINE # 526
	LJMP 	L?0212
; END OF set_address

; }
; 
; //获取描述符
; void get_descriptor(void)

	RSEG  ?PR?get_descriptor?USB
get_descriptor:
	USING	0
			; SOURCE LINE # 530
; {
			; SOURCE LINE # 531
; 	unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
			; SOURCE LINE # 532
	MOV  	A,ControlData+02H
	MOV  	bDescriptor?2866,A
; 	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
			; SOURCE LINE # 533
	MOV  	A,bDescriptor?2866
	CJNE 	A,#01H,?C0111
; 	{											//获取设备描述符
			; SOURCE LINE # 534
; 		code_transmit((unsigned char code *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
			; SOURCE LINE # 535
	MOV  	R6,#HIGH (DeviceDescr)
	MOV  	R7,#LOW (DeviceDescr)
	MOV  	R5,#012H
	MOV  	R4,#00H
	LJMP 	_code_transmit
; 	}
			; SOURCE LINE # 536
?C0111:
; 	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
			; SOURCE LINE # 537
	MOV  	A,bDescriptor?2866
	CJNE 	A,#02H,?C0113
; 	{											//获取配置描述符
			; SOURCE LINE # 538
; 		code_transmit((unsigned char code *)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);
			; SOURCE LINE # 539
	MOV  	R6,#HIGH (ConfigDescr)
	MOV  	R7,#LOW (ConfigDescr)
	MOV  	R5,#02EH
	MOV  	R4,#00H
	LJMP 	_code_transmit
; 	}
			; SOURCE LINE # 540
?C0113:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 542
	LCALL	stall_ep0
; }
			; SOURCE LINE # 543
?C0115:
	RET  	
; END OF get_descriptor

; //获取配置状态
; void get_configuration(void)

	RSEG  ?PR?get_configuration?USB
get_configuration:
	USING	0
			; SOURCE LINE # 545
; {
			; SOURCE LINE # 546
; 	unsigned char c = bEPPflags.bits.configuration;
			; SOURCE LINE # 547
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	ANL  	A,#01H
	MOV  	c?2967,A
; 	single_transmit(&c, 1);
			; SOURCE LINE # 548
	MOV  	R3,#00H
	MOV  	R2,#HIGH (c?2967)
	MOV  	R1,#LOW (c?2967)
	MOV  	R5,#01H
	LJMP 	_single_transmit
; END OF get_configuration

; }
; 
; //设置配置状态
; void set_configuration(void)

	RSEG  ?PR?set_configuration?USB
set_configuration:
	USING	0
			; SOURCE LINE # 552
; {
			; SOURCE LINE # 553
; 	if (ControlData.DeviceRequest.wValue == 0)
			; SOURCE LINE # 554
	MOV  	A,ControlData+03H
	ORL  	A,ControlData+02H
	JNZ  	?C0117
; 	{
			; SOURCE LINE # 555
; 		//设备进入未配置状态
; 		single_transmit(0, 0);
			; SOURCE LINE # 557
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R5,A
	LCALL	_single_transmit
; 		DISABLE;
			; SOURCE LINE # 558
	CLR  	EA
; 		bEPPflags.bits.configuration = 0;
			; SOURCE LINE # 559
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	ANL  	A,#0FEH
	MOV  	bEPPflags+01H,A
; 		ENABLE;
			; SOURCE LINE # 560
	SETB 	EA
; 		init_unconfig();
			; SOURCE LINE # 561
	LJMP 	init_unconfig
; 	}
			; SOURCE LINE # 562
?C0117:
; 	else if (ControlData.DeviceRequest.wValue == 1)
			; SOURCE LINE # 563
	MOV  	A,ControlData+03H
	XRL  	A,#01H
	ORL  	A,ControlData+02H
	JNZ  	?C0119
; 	{
			; SOURCE LINE # 564
; 		//配置设备
; 		single_transmit(0, 0);
			; SOURCE LINE # 566
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R5,A
	LCALL	_single_transmit
; 		
; 		init_unconfig();
			; SOURCE LINE # 568
	LCALL	init_unconfig
; 		init_config();
			; SOURCE LINE # 569
	LCALL	init_config
; 		DISABLE;
			; SOURCE LINE # 570
	CLR  	EA
; 		bEPPflags.bits.configuration = 1;
			; SOURCE LINE # 571
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	ORL  	A,#01H
	MOV  	bEPPflags+01H,A
; 		ENABLE;
			; SOURCE LINE # 572
	SETB 	EA
; 	}
			; SOURCE LINE # 573
	RET  	
?C0119:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 575
	LCALL	stall_ep0
; }
			; SOURCE LINE # 576
?C0121:
	RET  	
; END OF set_configuration

; 
; //获取接口状态
; void get_interface(void)

	RSEG  ?PR?get_interface?USB
get_interface:
	USING	0
			; SOURCE LINE # 579
; {
			; SOURCE LINE # 580
; 	unsigned char txdat = 0;        /* Only/Current interface = 0 */
			; SOURCE LINE # 581
	CLR  	A
	MOV  	txdat?3168,A
; 	single_transmit(&txdat, 1);
			; SOURCE LINE # 582
	MOV  	R3,A
	MOV  	R2,#HIGH (txdat?3168)
	MOV  	R1,#LOW (txdat?3168)
	MOV  	R5,#01H
	LJMP 	_single_transmit
; END OF get_interface

; }
; 
; //设置接口状态
; void set_interface(void)

	RSEG  ?PR?set_interface?USB
set_interface:
	USING	0
			; SOURCE LINE # 586
; {
			; SOURCE LINE # 587
; 	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)	single_transmit(0, 0);
			; SOURCE LINE # 588
	MOV  	A,ControlData+03H
	ORL  	A,ControlData+02H
	JNZ  	?C0123
	MOV  	A,ControlData+05H
	ORL  	A,ControlData+04H
	JNZ  	?C0123
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R1,A
	MOV  	R5,A
	LJMP 	_single_transmit
?C0123:
; 	else
; 		stall_ep0();
			; SOURCE LINE # 590
	LCALL	stall_ep0
; }
			; SOURCE LINE # 591
?C0125:
	RET  	
; END OF set_interface

; 
; //设置地址使能
; void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable)

	RSEG  ?PR?_D12_SetAddressEnable?USB
_D12_SetAddressEnable:
	USING	0
	MOV  	bAddress?3369,R7
	MOV  	bEnable?3370,R5
			; SOURCE LINE # 594
; {
			; SOURCE LINE # 595
; 	if(bEPPflags.bits.in_isr == 0)	DISABLE;
			; SOURCE LINE # 596
	MOV  	R7,bEPPflags
	MOV  	A,R7
	SWAP 	A
	RRC  	A
	ANL  	A,#07H
	JB   	ACC.0,?C0126
	CLR  	EA
?C0126:
; 	outportb(D12_COMMAND, 0xD0);			//输出指令
			; SOURCE LINE # 597
	MOV  	R5,#0D0H
	LCALL	L?0208
; 	if(bEnable)	bAddress |= 0x80;
			; SOURCE LINE # 598
	MOV  	A,bEnable?3370
	JZ   	?C0127
	ORL  	bAddress?3369,#080H
?C0127:
; 	outportb(D12_DATA, bAddress);			//设置地址
			; SOURCE LINE # 599
	MOV  	R5,bAddress?3369
	MOV  	R7,#02H
	MOV  	R6,#0FFH
	LCALL	_outportb
; 	if(bEPPflags.bits.in_isr == 0)	ENABLE;
			; SOURCE LINE # 600
	MOV  	R7,bEPPflags
	MOV  	A,R7
	SWAP 	A
	RRC  	A
	ANL  	A,#07H
	JB   	ACC.0,?C0129
	SETB 	EA
; }
			; SOURCE LINE # 601
?C0129:
	RET  	
; END OF _D12_SetAddressEnable

; 
; //设置端点使能
; void D12_SetEndpointEnable(unsigned char bEnable)

	RSEG  ?PR?_D12_SetEndpointEnable?USB
_D12_SetEndpointEnable:
	USING	0
	MOV  	bEnable?3471,R7
			; SOURCE LINE # 604
; {
			; SOURCE LINE # 605
; 	if(bEPPflags.bits.in_isr

⌨️ 快捷键说明

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