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

📄 usb.src

📁 一个通过D12与计算机进行USB通信的单片机程序,开发者可以参考
💻 SRC
📖 第 1 页 / 共 5 页
字号:
; 		bEPPflags.bits.control_state = USB_TRANSMIT;
			; SOURCE LINE # 157
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	ORL  	A,#040H
	MOV  	bEPPflags,A
; 		ENABLE;
			; SOURCE LINE # 158
	SETB 	EA
; 	}
			; SOURCE LINE # 159
	RET  	
?C0025:
; 	else
; 	{
			; SOURCE LINE # 161
; 		D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
			; SOURCE LINE # 162
	MOV  	R5,ControlData+09H
	MOV  	R2,pRomData?843
	MOV  	R1,pRomData?843+01H
	MOV  	R3,#0FFH
	MOV  	R7,#01H
	LCALL	_D12_WriteEndpoint
; 		ControlData.wCount += ControlData.wLength;
			; SOURCE LINE # 163
	MOV  	A,ControlData+09H
	ADD  	A,ControlData+0BH
	MOV  	ControlData+0BH,A
	MOV  	A,ControlData+08H
	ADDC 	A,ControlData+0AH
	MOV  	ControlData+0AH,A
; 		DISABLE;
			; SOURCE LINE # 164
	CLR  	EA
; 		bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 165
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
; 		ENABLE;
			; SOURCE LINE # 166
	SETB 	EA
; 	}
			; SOURCE LINE # 167
; }
			; SOURCE LINE # 168
?C0027:
	RET  	
; END OF _code_transmit

; 
; //LED和按键处理子程序
; void check_key_LED(void)

	RSEG  ?PR?check_key_LED?USB
check_key_LED:
	USING	0
			; SOURCE LINE # 171
; {
			; SOURCE LINE # 172
; 	static unsigned char c, last_key = 0xf;
; 
; 	c = MCU_SWM0 & MCU_SWM1;
			; SOURCE LINE # 175
	MOV  	C,MCU_SWM1
	ANL  	C,MCU_SWM0
	CLR  	A
	RLC  	A
	MOV  	c?945,A
; 	c &= 0x0f;
			; SOURCE LINE # 176
	ANL  	c?945,#0FH
; 	if (c != last_key)
			; SOURCE LINE # 177
	MOV  	A,c?945
	XRL  	A,last_key?946
	JZ   	?C0028
; 	{
			; SOURCE LINE # 178
; 		D12_WriteEndpoint(3, 1, &c);//发送按键状态
			; SOURCE LINE # 179
	MOV  	R3,#00H
	MOV  	R2,#HIGH (c?945)
	MOV  	R1,#LOW (c?945)
	MOV  	R5,#01H
	MOV  	R7,#03H
	LCALL	_D12_WriteEndpoint
; 	}
			; SOURCE LINE # 180
?C0028:
; 	last_key = c;
			; SOURCE LINE # 181
	MOV  	last_key?946,c?945
; 	if(bEPPflags.bits.ep1_rxdone)
			; SOURCE LINE # 182
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	RRC  	A
	RRC  	A
	ANL  	A,#03FH
	JNB  	ACC.0,?C0030
; 	{
			; SOURCE LINE # 183
; 		DISABLE;
			; SOURCE LINE # 184
	CLR  	EA
; 		bEPPflags.bits.ep1_rxdone = 0;
			; SOURCE LINE # 185
	MOV  	R7,bEPPflags+01H
	MOV  	A,R7
	ANL  	A,#0FBH
	MOV  	bEPPflags+01H,A
; 		ENABLE;
			; SOURCE LINE # 186
	SETB 	EA
; 		MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
			; SOURCE LINE # 187
	MOV  	R0,#LOW (GenEpBuf+03H)
	MOV  	A,@R0
	MOV  	R7,A
	RRC  	A
	CPL  	C
	MOV  	MCU_LED0,C
; 		MCU_LED1 = !(GenEpBuf[3] & 0x2);
			; SOURCE LINE # 188
	MOV  	A,R7
	MOV  	C,ACC.1
	CPL  	C
	MOV  	MCU_LED1,C
; 	}
			; SOURCE LINE # 189
; }
			; SOURCE LINE # 190
?C0030:
	RET  	
; END OF check_key_LED

; 
; void help_devreq(unsigned char typ, unsigned char req)

	RSEG  ?PR?_help_devreq?USB
_help_devreq:
	USING	0
;---- Variable 'typ?1047' assigned to Register 'R7' ----
;---- Variable 'req?1048' assigned to Register 'R5' ----
			; SOURCE LINE # 192
; {
			; SOURCE LINE # 193
; 	typ >>= 5;
			; SOURCE LINE # 194
	MOV  	A,R7
	SWAP 	A
	RRC  	A
	ANL  	A,#07H
	MOV  	R7,A
; 	if(typ == USB_STANDARD_REQUEST)
			; SOURCE LINE # 195
	JZ   	?C0034
; 	{
			; SOURCE LINE # 196
; 	}
			; SOURCE LINE # 197
?C0031:
; 	else if(bEPPflags.bits.verbose) printf("Request Type = %s, bRequest = 0x%bx.\n", _NAME_USB_REQUEST_TYPE[typ],req);
			; SOURCE LINE # 198
	MOV  	R6,bEPPflags+01H
	MOV  	A,R6
	CLR  	C
	RRC  	A
	JNB  	ACC.0,?C0034
	MOV  	A,R7
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,#LOW (_NAME_USB_REQUEST_TYPE)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (_NAME_USB_REQUEST_TYPE)
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	R3,A
	MOV  	A,#01H
	MOVC 	A,@A+DPTR
	MOV  	R2,A
	MOV  	A,#02H
	MOVC 	A,@A+DPTR
	MOV  	?_printf?BYTE+03H,R3
	MOV  	?_printf?BYTE+04H,R2
	MOV  	?_printf?BYTE+05H,A
	MOV  	?_printf?BYTE+06H,R5
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (?SC_291)
	MOV  	R1,#LOW (?SC_291)
	LCALL	_printf
; }
			; SOURCE LINE # 199
?C0034:
	RET  	
; END OF _help_devreq

; 
; //请求处理子程序
; void control_handler()

	RSEG  ?PR?control_handler?USB
control_handler:
	USING	0
			; SOURCE LINE # 202
; {
			; SOURCE LINE # 203
; 	unsigned char type, req;
; 	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
			; SOURCE LINE # 205
	MOV  	A,ControlData
	ANL  	A,#060H
	MOV  	type?1149,A
; 	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
			; SOURCE LINE # 206
	MOV  	A,ControlData+01H
	ANL  	A,#0FH
	MOV  	req?1150,A
; 	help_devreq(type, req); //显示设备请求
			; SOURCE LINE # 207
	MOV  	R5,A
	MOV  	R7,type?1149
	LCALL	_help_devreq
; 	if (type == USB_STANDARD_REQUEST) (*StandardDeviceRequest[req])();//调用标准请求
			; SOURCE LINE # 208
	MOV  	A,type?1149
	JNZ  	?C0035
	MOV  	A,req?1150
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,#LOW (StandardDeviceRequest)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (StandardDeviceRequest)
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	A,#01H
	MOVC 	A,@A+DPTR
	MOV  	R2,A
	MOV  	A,#02H
	MOVC 	A,@A+DPTR
	MOV  	R1,A
	LJMP 	?C?ICALL
?C0035:
; 	else if (type == USB_VENDOR_REQUEST) (*VendorDeviceRequest[req])();//调用厂商请求
			; SOURCE LINE # 209
	MOV  	A,type?1149
	CJNE 	A,#040H,?C0037
	MOV  	A,req?1150
	MOV  	B,#03H
	MUL  	AB
	ADD  	A,#LOW (VendorDeviceRequest)
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (VendorDeviceRequest)
	MOV  	DPH,A
	CLR  	A
	MOVC 	A,@A+DPTR
	MOV  	A,#01H
	MOVC 	A,@A+DPTR
	MOV  	R2,A
	MOV  	A,#02H
	MOVC 	A,@A+DPTR
	MOV  	R1,A
	LJMP 	?C?ICALL
?C0037:
; 	else stall_ep0();
			; SOURCE LINE # 210
	LCALL	stall_ep0
; }
			; SOURCE LINE # 211
?C0039:
	RET  	
; END OF control_handler

CSEG	AT	0000BH
	LJMP	timer_isr

; 
; 
; //定时器0中断处理
; timer_isr() interrupt 1

	RSEG  ?PR?timer_isr?USB
	USING	0
timer_isr:
	PUSH 	ACC
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 215
; {
; 	DISABLE;
			; SOURCE LINE # 217
	CLR  	EA
; 	ClockTicks++;
			; SOURCE LINE # 218
	MOV  	A,ClockTicks+03H
	ADD  	A,#01H
	MOV  	ClockTicks+03H,A
	CLR  	A
	ADDC 	A,ClockTicks+02H
	MOV  	ClockTicks+02H,A
	CLR  	A
	ADDC 	A,ClockTicks+01H
	MOV  	ClockTicks+01H,A
	CLR  	A
	ADDC 	A,ClockTicks
	MOV  	ClockTicks,A
; 	bEPPflags.bits.timer = 1;
			; SOURCE LINE # 219
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#01H
	MOV  	bEPPflags,A
; 	ENABLE;
			; SOURCE LINE # 220
	SETB 	EA
; }
			; SOURCE LINE # 221
	POP  	AR7
	POP  	PSW
	POP  	ACC
	RETI 	
; END OF timer_isr

CSEG	AT	00003H
	LJMP	usb_isr

; 
; //USB中断处理
; usb_isr() interrupt 0

	RSEG  ?PR?usb_isr?USB
	USING	0
usb_isr:
	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 224
; {
; 	DISABLE;
			; SOURCE LINE # 226
	CLR  	EA
; 	fn_usb_isr();
			; SOURCE LINE # 227
	LCALL	fn_usb_isr
; 	ENABLE;
			; SOURCE LINE # 228
	SETB 	EA
; }
			; SOURCE LINE # 229
	POP  	AR7
	POP  	AR6
	POP  	AR5
	POP  	AR4
	POP  	AR3
	POP  	AR2
	POP  	AR1
	POP  	AR0
	POP  	PSW
	POP  	DPL
	POP  	DPH
	POP  	B
	POP  	ACC
	RETI 	
; END OF usb_isr

; 
; //USB中断服务子程序
; void fn_usb_isr()

	RSEG  ?PR?fn_usb_isr?USB
fn_usb_isr:
	USING	0
			; SOURCE LINE # 232
; {
			; SOURCE LINE # 233
; 	unsigned int i_st;
; 
; 	bEPPflags.bits.in_isr = 1;
			; SOURCE LINE # 236
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#020H
	MOV  	bEPPflags,A
; 
; 	i_st = D12_ReadInterruptRegister();//读取中断寄存器
			; SOURCE LINE # 238
	LCALL	D12_ReadInterruptRegister
	MOV  	i_st?1451,R6
	MOV  	i_st?1451+01H,R7
; 
; 	if(i_st != 0)
			; SOURCE LINE # 240
	MOV  	A,i_st?1451+01H
	ORL  	A,i_st?1451
	JZ   	?C0042
; 	{
			; SOURCE LINE # 241
; 		if(i_st & D12_INT_BUSRESET)
			; SOURCE LINE # 242
	MOV  	A,i_st?1451+01H
	JNB  	ACC.6,?C0043
; 		{
			; SOURCE LINE # 243
; 			bus_reset();//USB总线服务
			; SOURCE LINE # 244
	LCALL	bus_reset
; 			bEPPflags.bits.bus_reset = 1;
			; SOURCE LINE # 245
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#02H
	MOV  	bEPPflags,A
; 		}
			; SOURCE LINE # 246
?C0043:
; 		if(i_st & D12_INT_EOT)
			; SOURCE LINE # 247
	MOV  	A,i_st?1451
	JNB  	ACC.0,?C0044
; 			dma_eot();//DMA传输结束
			; SOURCE LINE # 248
	LCALL	dma_eot
?C0044:
; 		if(i_st & D12_INT_SUSPENDCHANGE)
			; SOURCE LINE # 249
	MOV  	A,i_st?1451+01H
	JNB  	ACC.7,?C0045
; 			bEPPflags.bits.suspend = 1;//挂起改变
			; SOURCE LINE # 250
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ORL  	A,#04H
	MOV  	bEPPflags,A
?C0045:
; 		if(i_st & D12_INT_ENDP0IN)
			; SOURCE LINE # 251
	MOV  	A,i_st?1451+01H
	JNB  	ACC.1,?C0046
; 			ep0_txdone();//端点0IN中断
			; SOURCE LINE # 252
	LCALL	ep0_txdone
?C0046:
; 		if(i_st & D12_INT_ENDP0OUT)
			; SOURCE LINE # 253
	MOV  	A,i_st?1451+01H
	JNB  	ACC.0,?C0047
; 			ep0_rxdone();//端点0OUT中断
			; SOURCE LINE # 254
	LCALL	ep0_rxdone
?C0047:
; 		if(i_st & D12_INT_ENDP1IN)
			; SOURCE LINE # 255
	MOV  	A,i_st?1451+01H
	JNB  	ACC.3,?C0048
; 			ep1_txdone();//端点1IN中断
			; SOURCE LINE # 256
	LCALL	ep1_txdone
?C0048:
; 		if(i_st & D12_INT_ENDP1OUT)
			; SOURCE LINE # 257
	MOV  	A,i_st?1451+01H
	JNB  	ACC.2,?C0049
; 			ep1_rxdone();//端点1OUT中断
			; SOURCE LINE # 258
	LCALL	ep1_rxdone
?C0049:
; 		if(i_st & D12_INT_ENDP2IN)
			; SOURCE LINE # 259
	MOV  	A,i_st?1451+01H
	JNB  	ACC.5,?C0050
; 			main_txdone();//端点2IN中断
			; SOURCE LINE # 260
	LCALL	main_txdone
?C0050:
; 		if(i_st & D12_INT_ENDP2OUT)
			; SOURCE LINE # 261
	MOV  	A,i_st?1451+01H
	JNB  	ACC.4,?C0042
; 			main_rxdone();//端点2OUT中断
			; SOURCE LINE # 262
	LCALL	main_rxdone
; 	}
			; SOURCE LINE # 263
?C0042:
; 	bEPPflags.bits.in_isr = 0;
			; SOURCE LINE # 264
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#0DFH
	MOV  	bEPPflags,A
; }
			; SOURCE LINE # 265
	RET  	
; END OF fn_usb_isr

; 
; //总线复位处理子程序
; void bus_reset(void)

	RSEG  ?PR?bus_reset?USB
bus_reset:
			; SOURCE LINE # 268
; {
			; SOURCE LINE # 269
; }
			; SOURCE LINE # 270
	RET  	
; END OF bus_reset

; 
; //端点0OUT中断
; void ep0_rxdone(void)

	RSEG  ?PR?ep0_rxdone?USB
ep0_rxdone:
	USING	0
			; SOURCE LINE # 273
; {
			; SOURCE LINE # 274
; 	unsigned char ep_last, i;
; 	ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
			; SOURCE LINE # 276
	CLR  	A
	MOV  	R7,A
	LCALL	_D12_ReadLastTransactionStatus
;---- Variable 'ep_last?1652' assigned to Register 'R7' ----
; 	if (ep_last & D12_SETUPPACKET)
			; SOURCE LINE # 277
	MOV  	A,R7
	JB   	ACC.5,$ + 6H
	LJMP 	?C0054
; 	{
			; SOURCE LINE # 278
; 		//接收到SETUP包
; 		ControlData.wLength = 0;
			; SOURCE LINE # 280
	CLR  	A
	MOV  	ControlData+08H,A
	MOV  	ControlData+09H,A
; 		ControlData.wCount = 0;
			; SOURCE LINE # 281
	MOV  	ControlData+0AH,A
	MOV  	ControlData+0BH,A
; 		if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
; 			(unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
			; SOURCE LINE # 283
	MOV  	R3,A
	MOV  	R2,#HIGH (ControlData)
	MOV  	R1,#LOW (ControlData)
	MOV  	R5,#08H
	MOV  	R7,A
	LCALL	_D12_ReadEndpoint
	MOV  	A,R7
	XRL  	A,#08H
	JZ   	?C0055
; 		{
			; SOURCE LINE # 284
; 			//SETUP包出错,返回
; 			D12_SetEndpointStatus(0, 1);
			; SOURCE LINE # 286
	LCALL	L?0215
; 			D12_SetEndpointStatus(1, 1);
			; SOURCE LINE # 287
	MOV  	R5,#01H
	MOV  	R7,#01H
	LCALL	_D12_SetEndpointStatus
; 			bEPPflags.bits.control_state = USB_IDLE;
			; SOURCE LINE # 288
	MOV  	R7,bEPPflags
	MOV  	A,R7
	ANL  	A,#03FH
	MOV  	bEPPflags,A
	RET  	
; 			return;
; 		}
			; SOURCE LINE # 290

⌨️ 快捷键说明

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