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

📄 usb.src

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 SRC
📖 第 1 页 / 共 5 页
字号:
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0

VendorDeviceRequest:
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	read_write_register + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0
	DB	0FFH
	DW	reserved + 0


	RSEG  ?C_INITSEG
	DB	004H
	DB	ClockTicks
	DB	000H,000H,000H,000H	; long

	DB	001H
	DB	last_key?946
	DB	00FH

; #include <reg51.h>                /* special function register declarations   */
; #include <stdio.h>
; #include <string.h>
; #include "d12.h"
; 
; 
; unsigned char rcv_data_len;
; 
; void main(void)

	RSEG  ?PR?main?USB
main:
	USING	0
			; SOURCE LINE # 9
; {
			; SOURCE LINE # 10
; 
; 	init_port();					//初始化I/O口
			; SOURCE LINE # 12
	LCALL	init_port
; 	init_serial();					//初始化串行口
			; SOURCE LINE # 13
	LCALL	init_serial
; 	init_timer0();					//初始化定时器0
			; SOURCE LINE # 14
	LCALL	init_timer0
; 	init_special_interrupts();		//设置中断
			; SOURCE LINE # 15
	LCALL	init_special_interrupts
; 	MCU_D12CS = 0x1;
			; SOURCE LINE # 16
	SETB 	MCU_D12CS
; 	MCU_D12CS = 0x0;
			; SOURCE LINE # 17
	CLR  	MCU_D12CS
; 	bEPPflags.value = 0;
			; SOURCE LINE # 18
	CLR  	A
	MOV  	bEPPflags,A
	MOV  	bEPPflags+01H,A
; 	reconnect_USB();				//重新连接USB
			; SOURCE LINE # 19
	LCALL	reconnect_USB
?C0001:
; 	while( TRUE )
			; SOURCE LINE # 20
; 	{
			; SOURCE LINE # 21
; 		if (bEPPflags.bits.timer)
			; SOURCE LINE # 22
	MOV  	R7,bEPPflags
	MOV  	A,R7
	JNB  	ACC.0,?C0003
; 		{
			; SOURCE LINE # 23
; 			DISABLE;				//定时器溢出,检测按键状态
			; SOURCE LINE # 24
	CLR  	EA
; 			bEPPflags.bits.timer = 0;
			; SOURCE LINE # 25
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0FEH
	MOV  	bEPPflags,A
; 			ENABLE;
			; SOURCE LINE # 26
	SETB 	EA
; 			if(bEPPflags.bits.configuration)//设备未配置返回
			; SOURCE LINE # 27
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	JNB  	ACC.0,?C0003
; 				check_key_LED();
			; SOURCE LINE # 28
	LCALL	check_key_LED
; 		}
			; SOURCE LINE # 29
?C0003:
; 		if (bEPPflags.bits.bus_reset)
			; SOURCE LINE # 30
	MOV  	R7,bEPPflags
	MOV  	A,R7
	CLR  	C
	RRC  	A
	JNB  	ACC.0,?C0005
; 		{							//设备复位处理
			; SOURCE LINE # 31
; 			DISABLE;
			; SOURCE LINE # 32
	CLR  	EA
; 			bEPPflags.bits.bus_reset = 0;
			; SOURCE LINE # 33
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0FDH
	MOV  	bEPPflags,A
; 			ENABLE;
			; SOURCE LINE # 34
	SETB 	EA
; 			// Release D12's SUSPEND pin after bus reset
; 			// Enable 74HCT123 pulse generation before disconnect
; 			D12SUSPD = 1;
			; SOURCE LINE # 37
	SETB 	D12SUSPD
; 		}
			; SOURCE LINE # 38
?C0005:
; 		if (bEPPflags.bits.suspend)
			; SOURCE LINE # 39
	MOV  	R7,bEPPflags
	MOV  	A,R7
	RRC  	A
	RRC  	A
	ANL  	A,#03FH
	JNB  	ACC.0,?C0006
; 		{							//挂起改变处理
			; SOURCE LINE # 40
; 			DISABLE;
			; SOURCE LINE # 41
	CLR  	EA
; 			bEPPflags.bits.suspend= 0;
			; SOURCE LINE # 42
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0FBH
	MOV  	bEPPflags,A
; 			ENABLE;
			; SOURCE LINE # 43
	SETB 	EA
; 			if(D12SUSPD == 1)
			; SOURCE LINE # 44
	JNB  	D12SUSPD,?C0006
; 			{						//挂起处理
			; SOURCE LINE # 45
; 				D12SUSPD = 0;
			; SOURCE LINE # 46
	CLR  	D12SUSPD
; 				P0 = 0xFF;
			; SOURCE LINE # 47
	MOV  	P0,#0FFH
; 				P1 = 0xFF;
			; SOURCE LINE # 48
	MOV  	P1,#0FFH
; 				P2 = 0xFF;
			; SOURCE LINE # 49
	MOV  	P2,#0FFH
; 				P3 = 0xFF;
			; SOURCE LINE # 50
	MOV  	P3,#0FFH
; 				D12_SetDMA(0xC3);
			; SOURCE LINE # 51
	MOV  	R7,#0C3H
	LCALL	_D12_SetDMA
; 				D12SUSPD = 1;
			; SOURCE LINE # 52
	SETB 	D12SUSPD
; 				PCON |= 0x02;
			; SOURCE LINE # 53
	ORL  	PCON,#02H
?C0008:
; 				while (1);
			; SOURCE LINE # 54
	SJMP 	?C0008
; 			}
			; SOURCE LINE # 55
; 		}
			; SOURCE LINE # 56
?C0006:
; 		if (bEPPflags.bits.setup_packet)
			; SOURCE LINE # 57
	MOV  	R7,bEPPflags
	MOV  	A,R7
	RRC  	A
	RRC  	A
	RRC  	A
	ANL  	A,#01FH
	JNB  	ACC.0,?C0010
; 		{							//Setup包处理
			; SOURCE LINE # 58
; 			DISABLE;
			; SOURCE LINE # 59
	CLR  	EA
; 			bEPPflags.bits.setup_packet = 0;
			; SOURCE LINE # 60
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0F7H
	MOV  	bEPPflags,A
; 			ENABLE;
			; SOURCE LINE # 61
	SETB 	EA
; 			control_handler();		//调用请求处理子程序
			; SOURCE LINE # 62
	LCALL	control_handler
; 			D12SUSPD = 1;
			; SOURCE LINE # 63
	SETB 	D12SUSPD
; 		}
			; SOURCE LINE # 64
?C0010:
; 		if(bEPPflags.bits.ep1_rxdone)
			; SOURCE LINE # 65
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	RRC  	A
	RRC  	A
	ANL  	A,#03FH
	JNB  	ACC.0,?C0011
; 		{
			; SOURCE LINE # 66
; 			D12_WriteEndpoint(3,rcv_data_len,GenEpBuf);
			; SOURCE LINE # 67
	MOV  	R3,#00H
	MOV  	R2,#HIGH (GenEpBuf)
	MOV  	R1,#LOW (GenEpBuf)
	MOV  	R5,rcv_data_len
	MOV  	R7,#03H
	LCALL	_D12_WriteEndpoint
;             bEPPflags.bits.ep1_rxdone = 0 ;
			; SOURCE LINE # 68
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	ANL  	A,#0FBH
	MOV  	bEPPflags+01H,A
; 		}
			; SOURCE LINE # 69
?C0011:
; 		if(bEPPflags.bits.ep2_rxdone)
			; SOURCE LINE # 70
	MOV  	R7,bEPPflags+02H
	MOV  	A,R7
	JB   	ACC.0,$ + 6H
	LJMP 	?C0001
; 		{
			; SOURCE LINE # 71
; 			D12_WriteEndpoint(5,rcv_data_len,EpBuf);
			; SOURCE LINE # 72
	MOV  	R3,#00H
	MOV  	R2,#HIGH (EpBuf)
	MOV  	R1,#LOW (EpBuf)
	MOV  	R5,rcv_data_len
	MOV  	R7,#05H
	LCALL	_D12_WriteEndpoint
;             bEPPflags.bits.ep2_rxdone = 0 ;
			; SOURCE LINE # 73
	MOV  	R7,bEPPflags+02H
	MOV  	A,R7
	ANL  	A,#0FEH
	MOV  	bEPPflags+02H,A
; 		}
			; SOURCE LINE # 74
; 	}
			; SOURCE LINE # 75
	LJMP 	?C0001
; END OF main

; }
; 
; //返回stall应答
; void stall_ep0(void)

	RSEG  ?PR?stall_ep0?USB
stall_ep0:
	USING	0
			; SOURCE LINE # 79
; {
			; SOURCE LINE # 80
; 	D12_SetEndpointStatus(0, 1);
			; SOURCE LINE # 81
	LCALL	L?0215
; 	D12_SetEndpointStatus(1, 1);
			; SOURCE LINE # 82
	MOV  	R5,#01H
	MOV  	R7,#01H
	LJMP 	_D12_SetEndpointStatus
; END OF stall_ep0

; }
; 
; //断开USB总线
; void disconnect_USB(void)

	RSEG  ?PR?disconnect_USB?USB
disconnect_USB:
	USING	0
			; SOURCE LINE # 86
; {
			; SOURCE LINE # 87
; 	// Initialize D12 configuration
; 	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
			; SOURCE LINE # 89
	MOV  	R5,#043H
	MOV  	R7,#02H
	LJMP 	_D12_SetMode
; END OF disconnect_USB

; }
; 
; //连接USB总线
; void connect_USB(void)

	RSEG  ?PR?connect_USB?USB
connect_USB:
	USING	0
			; SOURCE LINE # 93
; {
			; SOURCE LINE # 94
; 	// reset event flags
; 	DISABLE;
			; SOURCE LINE # 96
	CLR  	EA
; 	bEPPflags.value = 0;//清除所有状态
			; SOURCE LINE # 97
	CLR  	A
	MOV  	bEPPflags,A
	MOV  	bEPPflags+01H,A
; 	ENABLE;
			; SOURCE LINE # 98
	SETB 	EA
; 	// V2.1 enable normal+sof interrupt
; 	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
			; SOURCE LINE # 100
	MOV  	R7,#0C0H
	LCALL	_D12_SetDMA
; 	// Initialize D12 configuration
; 	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
			; SOURCE LINE # 102
	MOV  	R5,#043H
	MOV  	R7,#012H
	LJMP 	_D12_SetMode
; END OF connect_USB

; }
; 
; //重新连接到USB总线
; void reconnect_USB(void)

	RSEG  ?PR?reconnect_USB?USB
reconnect_USB:
	USING	0
			; SOURCE LINE # 106
; {
			; SOURCE LINE # 107
; 	unsigned long clk_cnt;
; 	MCU_LED0 = 0;
			; SOURCE LINE # 109
	CLR  	MCU_LED0
; 	MCU_LED1 = 0;
			; SOURCE LINE # 110
	CLR  	MCU_LED1
; 	// Pull-down D12's SUSPEND pin
; 	// Disable 74HCT123 pulse generation before disconnect
; 	// Release D12's SUSPEND pin after receiving bus reset from host
; 	D12SUSPD = 0;
			; SOURCE LINE # 114
	CLR  	D12SUSPD
; 	disconnect_USB();
			; SOURCE LINE # 115
	LCALL	disconnect_USB
; 	printf("Wait for 1 second ...\n");
			; SOURCE LINE # 116
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (?SC_268)
	MOV  	R1,#LOW (?SC_268)
	LCALL	_printf
; 	clk_cnt = ClockTicks;
			; SOURCE LINE # 117
	MOV  	clk_cnt?440+03H,ClockTicks+03H
	MOV  	clk_cnt?440+02H,ClockTicks+02H
	MOV  	clk_cnt?440+01H,ClockTicks+01H
	MOV  	clk_cnt?440,ClockTicks
?C0017:
; 	while(ClockTicks < clk_cnt + 20) ;
			; SOURCE LINE # 118
	MOV  	A,clk_cnt?440+03H
	ADD  	A,#014H
	MOV  	R7,A
	CLR  	A
	ADDC 	A,clk_cnt?440+02H
	MOV  	R6,A
	CLR  	A
	ADDC 	A,clk_cnt?440+01H
	MOV  	R5,A
	CLR  	A
	ADDC 	A,clk_cnt?440
	MOV  	R4,A
	MOV  	R3,ClockTicks+03H
	MOV  	R2,ClockTicks+02H
	MOV  	R1,ClockTicks+01H
	MOV  	R0,ClockTicks
	CLR  	C
	LCALL	?C?ULCMP
	JC   	?C0017
?C0018:
; 	connect_USB();
			; SOURCE LINE # 119
	LCALL	connect_USB
; 	MCU_LED0 = 1;
			; SOURCE LINE # 120
	SETB 	MCU_LED0
; 	MCU_LED1 = 1;
			; SOURCE LINE # 121
	SETB 	MCU_LED1
; }
			; SOURCE LINE # 122
	RET  	
; END OF reconnect_USB

; 
; //恢复到未配置状态
; void init_unconfig(void)

	RSEG  ?PR?init_unconfig?USB
init_unconfig:
	USING	0
			; SOURCE LINE # 125
; {
			; SOURCE LINE # 126
; //	unsigned char i;
; 	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
			; SOURCE LINE # 128
	CLR  	A
	MOV  	R7,A
	LJMP 	_D12_SetEndpointEnable
; END OF init_unconfig

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

	RSEG  ?PR?init_config?USB
init_config:
	USING	0
			; SOURCE LINE # 132
; {
			; SOURCE LINE # 133
; 	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
			; SOURCE LINE # 134
	MOV  	R7,#01H
	LJMP 	_D12_SetEndpointEnable
; END OF init_config

; }
; 
; //从端点号1发送数据
; void single_transmit(unsigned char * buf, unsigned char len)

	RSEG  ?PR?_single_transmit?USB
L?0211:
	USING	0
	MOV  	bEPPflags,A
	SETB 	EA
L?0212:
	MOV  	R3,#00H
	MOV  	R2,#00H
	MOV  	R1,#00H
	CLR  	A
	MOV  	R5,A
_single_transmit:
	USING	0
;---- Variable 'buf?741' assigned to Register 'R1/R2/R3' ----
;---- Variable 'len?742' assigned to Register 'R5' ----
			; SOURCE LINE # 138
; {
			; SOURCE LINE # 139
; 	if( len <= EP0_PACKET_SIZE)
			; SOURCE LINE # 140
	MOV  	A,R5
	SETB 	C
	SUBB 	A,#010H
	JNC  	?C0023
; 	{
			; SOURCE LINE # 141
; 		D12_WriteEndpoint(1, len, buf);
			; SOURCE LINE # 142
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 	}
			; SOURCE LINE # 143
; }
			; SOURCE LINE # 144
?C0023:
	RET  	
; END OF _single_transmit

; //发送端点号1建立代码
; void code_transmit(unsigned char code * pRomData, unsigned short len)

	RSEG  ?PR?_code_transmit?USB
_code_transmit:
	USING	0
	MOV  	pRomData?843,R6
	MOV  	pRomData?843+01H,R7
;---- Variable 'len?844' assigned to Register 'R4/R5' ----
			; SOURCE LINE # 146
; {
			; SOURCE LINE # 147
; 
; 	ControlData.wCount = 0;
			; SOURCE LINE # 149
	CLR  	A
	MOV  	ControlData+0AH,A
	MOV  	ControlData+0BH,A
; 	if(ControlData.wLength > len) ControlData.wLength = len;
			; SOURCE LINE # 150
	SETB 	C
	MOV  	A,ControlData+09H
	SUBB 	A,R5
	MOV  	A,ControlData+08H
	SUBB 	A,R4
	JC   	?C0024
	MOV  	ControlData+08H,R4
	MOV  	ControlData+09H,R5
?C0024:
; 	ControlData.pData = pRomData;
			; SOURCE LINE # 151
	MOV  	ControlData+0CH,#0FFH
	MOV  	ControlData+0DH,pRomData?843
	MOV  	ControlData+0EH,pRomData?843+01H
; 	if( ControlData.wLength >= EP0_PACKET_SIZE)
			; SOURCE LINE # 152
	CLR  	C
	MOV  	A,ControlData+09H
	SUBB 	A,#010H
	MOV  	A,ControlData+08H
	SUBB 	A,#00H
	JC   	?C0025
; 	{
			; SOURCE LINE # 153
; 		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
			; SOURCE LINE # 154
	MOV  	R3,ControlData+0CH
	MOV  	R2,ControlData+0DH
	MOV  	R1,ControlData+0EH
	MOV  	R5,#010H
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 		ControlData.wCount += EP0_PACKET_SIZE;
			; SOURCE LINE # 155
	MOV  	A,#010H
	ADD  	A,ControlData+0BH
	MOV  	ControlData+0BH,A
	CLR  	A
	ADDC 	A,ControlData+0AH
	MOV  	ControlData+0AH,A
; 		DISABLE;
			; SOURCE LINE # 156
	CLR  	EA

⌨️ 快捷键说明

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