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

📄 usbd12.s

📁 1.实现单片机驱动USBD12的固件
💻 S
📖 第 1 页 / 共 5 页
字号:
;   USBCTL_PORT|=BIT(C_D); 
	sbi 0x12,6
	.dbline 255
;   Delayus(5);
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 256
;   USBCTL_PORT&=~BIT(WR_N);
	cbi 0x12,4
	.dbline 257
;   Delayus(5);
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 258
;   USBDAT_PORT=dat;  
	out 0x18,R20
	.dbline 259
;   Delayus(5);
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 260
;   USBCTL_PORT|=BIT(WR_N);
	sbi 0x12,4
	.dbline 261
;  }
	xjmp L47
L46:
	.dbline 263
	.dbline 264
	cbi 0x12,6
	.dbline 265
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 266
	cbi 0x12,4
	.dbline 267
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 268
	out 0x18,R20
	.dbline 269
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 270
	sbi 0x12,4
	.dbline 271
L47:
	.dbline -2
	.dbline 272
;  else
;  {
;   USBCTL_PORT&=~BIT(C_D);
;   Delayus(1);
;   USBCTL_PORT&=~BIT(WR_N);
;   Delayus(1);
;   USBDAT_PORT=dat;  
;   Delayus(1);
;   USBCTL_PORT|=BIT(WR_N);
;  }
; }
L45:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dat 20 c
	.dbsym r cmd 22 c
	.dbend
	.dbfunc e InB _InB fc
;            dat -> R20
	.even
_InB::
	xcall push_gset1
	.dbline -1
	.dbline 280
; /*******************************************
; 函数名称: InB
; 功    能: 从D12读出一个字节数据
; 参    数: 无
; 返回值  : dat--读出的字节数据
; /********************************************/
; uchar InB(void)
; { 
	.dbline 282
;   uchar dat;
;   USBDAT_DDR=0x00;
	clr R2
	out 0x17,R2
	.dbline 283
;   USBDAT_PORT=0xFF;
	ldi R24,255
	out 0x18,R24
	.dbline 284
;   USBCTL_PORT&=~BIT(C_D);
	cbi 0x12,6
	.dbline 285
;   Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 286
;   USBCTL_PORT&=~BIT(RD_N);
	cbi 0x12,5
	.dbline 287
;   Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 288
;   dat=USBDAT_PIN;
	in R20,0x16
	.dbline 289
;   Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 290
;   USBCTL_PORT|=BIT(RD_N);
	sbi 0x12,5
	.dbline 291
;   USBDAT_DDR=0xFF;
	ldi R24,255
	out 0x17,R24
	.dbline 292
;   return dat;
	mov R16,R20
	.dbline -2
L48:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dat 20 c
	.dbend
	.dbfunc e Set_addren _Set_addren fV
;         enable -> R22
;           addr -> R20
	.even
_Set_addren::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 302
; }
; /*******************************************
; 函数名称: Set_addren
; 功    能: 设置地址/使能----------------------------
; 参    数: addr--设置的地址
; 	  	  enable--使能标志(为1使能,为0禁止)
; 返回值  : 无
; /********************************************/
; void Set_addren(uchar addr, uchar enable)
; {
	.dbline 303
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L50
	.dbline 304
; 		UEN_GINT();
	bclr 7
L50:
	.dbline 306
; 
; 	OutB(CMD, 0xD0);	//输出设置地址/使能指令
	ldi R18,208
	ldi R16,1
	xcall _OutB
	.dbline 307
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 308
; 	if(enable)
	tst R22
	breq L53
	.dbline 309
; 	{
	.dbline 310
; 		addr|=0x80;		//bit7置1,使能
	ori R20,128
	.dbline 311
; 	}
L53:
	.dbline 312
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 313
	mov R18,R20
	clr R16
	xcall _OutB
	.dbline 315
	lds R2,_USB_FLAG+4
	tst R2
	brne L55
	.dbline 316
	bset 7
L55:
	.dbline -2
	.dbline 317
; 	Delayus(1);
; 	OutB(DAT,addr);		//输出设置值
; 
; 	if(USB_FLAG.in_isr == 0)
; 		EN_GINT();
; }
L49:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r enable 22 c
	.dbsym r addr 20 c
	.dbend
	.dbfunc e Set_EPen _Set_EPen fV
;         enable -> R20
	.even
_Set_EPen::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 325
; /*******************************************
; 函数名称: Set_EPen
; 功    能: 设置端点使能
; 参    数: enable--使能标志(为1使能,为0禁止)
; 返回值  : 无
; /********************************************/
; void Set_EPen(uchar enable)
; {
	.dbline 326
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L59
	.dbline 327
; 		UEN_GINT();
	bclr 7
L59:
	.dbline 329
; 
; 	OutB(CMD,0xD8);	//输出设置端点使能指令
	ldi R18,216
	ldi R16,1
	xcall _OutB
	.dbline 330
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 331
; 	if(enable)
	tst R20
	breq L62
	.dbline 332
; 		OutB(DAT,1);		//设置端点允许
	ldi R18,1
	clr R16
	xcall _OutB
	xjmp L63
L62:
	.dbline 334
; 	else
; 		OutB(DAT,0);		//设置端点禁止
	clr R18
	clr R16
	xcall _OutB
L63:
	.dbline 336
	lds R2,_USB_FLAG+4
	tst R2
	brne L64
	.dbline 337
	bset 7
L64:
	.dbline -2
	.dbline 338
; 
; 	if(USB_FLAG.in_isr == 0)
; 		EN_GINT();
; }
L58:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r enable 20 c
	.dbend
	.dbfunc e Set_mode _Set_mode fV
;         clkdiv -> R20
;         config -> R22
	.even
_Set_mode::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 347
; /*******************************************
; 函数名称: Set_mode
; 功    能: 设置模式
; 参    数: config--配置字节信息
; 	  	  clkdiv--分频因子
; 返回值  : 无
; /********************************************/
; void Set_mode(uchar config,uchar clkdiv)
; {
	.dbline 348
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L68
	.dbline 349
; 		UEN_GINT();
	bclr 7
L68:
	.dbline 351
	ldi R18,243
	ldi R16,1
	xcall _OutB
	.dbline 352
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 353
	mov R18,R22
	clr R16
	xcall _OutB
	.dbline 354
	mov R18,R20
	clr R16
	xcall _OutB
	.dbline 356
	lds R2,_USB_FLAG+4
	tst R2
	brne L71
	.dbline 357
	bset 7
L71:
	.dbline -2
	.dbline 358
; 
; 	OutB(CMD,0xF3);		//输出设置模式指令
; 	Delayus(1);
; 	OutB(DAT,config);		//输出配置字节信息
; 	OutB(DAT,clkdiv);		//输出时钟分频因数字节
; 
; 	if(USB_FLAG.in_isr == 0)
; 		EN_GINT();	
; }
L67:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r clkdiv 20 c
	.dbsym r config 22 c
	.dbend
	.dbfunc e Set_DMA _Set_DMA fV
;          bMode -> R20
	.even
_Set_DMA::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 366
; /*******************************************
; 函数名称: Set_DMA
; 功    能: 设置DMA工作方式设置
; 参    数: bMode--设置值
; 返回值  : 无
; /********************************************/
; void Set_DMA(uchar bMode)
; {
	.dbline 367
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L75
	.dbline 368
; 		UEN_GINT();
	bclr 7
L75:
	.dbline 370
	ldi R18,251
	ldi R16,1
	xcall _OutB
	.dbline 371
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 372
	mov R18,R20
	clr R16
	xcall _OutB
	.dbline 374
	lds R2,_USB_FLAG+4
	tst R2
	brne L78
	.dbline 375
	bset 7
L78:
	.dbline -2
	.dbline 376
; 
; 	OutB(CMD, 0xFB);	//设置DMA工作方命令
; 	Delayus(1);
; 	OutB(DAT, bMode);		//输出设置值
; 
; 	if(USB_FLAG.in_isr == 0)
; 		EN_GINT();			
; }
L74:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r bMode 20 c
	.dbend
	.dbfunc e Read_IntR _Read_IntR fi
;           regl -> R22
;         intreg -> R20,R21
	.even
_Read_IntR::
	xcall push_gset2
	.dbline -1
	.dbline 385
; 
; /*******************************************
; 函数名称: Read_IntR
; 功    能: 读取中断寄存器值
; 参    数: 无
; 返回值  : intreg--16位中断寄存器值
; /********************************************/
; uint Read_IntR(void)
; {
	.dbline 389
; 	uchar regl;
; 	uint  intreg;
; 
; 	OutB(CMD,0xF4);	//读取中断寄存器命令
	ldi R18,244
	ldi R16,1
	xcall _OutB
	.dbline 390
; 	Delayus(5);
	ldi R16,5
	ldi R17,0
	xcall _Delayus
	.dbline 391
; 	regl=InB( );			//读取低8位字节
	xcall _InB
	mov R22,R16
	.dbline 392
; 	intreg=InB( );			//读取高8位字节
	xcall _InB
	mov R20,R16
	clr R21
	.dbline 394
; 
; 	intreg<<=8;
	mov R21,R20
	clr R20
	.dbline 395
; 	intreg+=regl;			//组合为16位
	mov R2,R22
	clr R3
	add R20,R2
	adc R21,R3
	.dbline 397
; 
; 	return intreg;
	mov R16,R20
	mov R17,R21
	.dbline -2
L81:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r regl 22 c
	.dbsym r intreg 20 i
	.dbend
	.dbfunc e Sel_EP _Sel_EP fc
;           byte -> R20
;           endp -> R20
	.even
_Sel_EP::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 406
; }
; /*******************************************
; 函数名称: Sel_EP
; 功    能: 端点选择,将内部指针初始化到选择的缓冲区起始位置
; 参    数: endp--端点索引号,取值0 ~ 5
; 返回值  : byte--一个字节的返回数据
; /********************************************/
; uchar Sel_EP(uchar endp)
; {
	.dbline 408
; 	uchar byte;
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L83
	.dbline 409
; 		UEN_GINT();
	bclr 7
L83:
	.dbline 411
; 
; 	OutB(CMD,endp);	//端点选择
	mov R18,R20
	ldi R16,1
	xcall _OutB
	.dbline 412
; 	Delayus(1);
	ldi R16,1
	ldi R17,0
	xcall _Delayus
	.dbline 413
; 	byte=InB( );			//读出一个字节
	xcall _InB
	mov R20,R16
	.dbline 415
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L86
	.dbline 416
; 		EN_GINT();
	bset 7
L86:
	.dbline 418
; 
; 	return byte;
	mov R16,R20
	.dbline -2
L82:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r byte 20 c
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Read_EPsta _Read_EPsta fc
;         status -> R20
;           endp -> R20
	.even
_Read_EPsta::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 427
; }
; /*******************************************
; 函数名称: Sel_EP
; 功    能: 读取端点状态
; 参    数: endp--端点索引号,取值0 ~ 5
; 返回值  : status--端点状态
; /********************************************/
; uchar Read_EPsta(uchar endp)//-----------------
; {
	.dbline 430
; 	uchar status;
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L90
	.dbline 431
; 		UEN_GINT();
	bclr 7
L90:
	.dbline 433
; 
; 	OutB(CMD,0x80+endp);	//读取端点状态命令
	mov R18,R20
	subi R18,128    ; addi 128
	ldi R16,1
	xcall _OutB
	.dbline 434
; 	status=InB( );					//读取端点状态
	xcall _InB
	mov R20,R16
	.dbline 436
; 
; 	if(USB_FLAG.in_isr == 0)
	lds R2,_USB_FLAG+4
	tst R2
	brne L93
	.dbline 437
; 		EN_GINT();
	bset 7
L93:
	.dbline 439
; 
; 	return status;
	mov R16,R20
	.dbline -2
L89:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r status 20 c
	.dbsym r endp 20 c
	.dbend
	.dbfunc e Read_LttransSta _Read_LttransSta fc
;         status -> R20
;           endp -> R20
	.even
_Read_LttransSta::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 448
; }
; /*******************************************
; 函数名称: Read_LttransSta
; 功    能: 读取最后处理状态寄存器
; 参    数: endp--端点索引号,取值0 ~ 5
; 返回值  : status--端点最后处理的状态
; /********************************************/
; uchar Read_LttransSta(uchar endp)
; {
	.dbline 450
;  	uchar status;
; 	OutB(CMD,0x40+endp);	//输出读取最后处理状态寄存器命令
	mov R18,R20
	subi R18,192    ; addi 64
	ldi R16,1

⌨️ 快捷键说明

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