📄 usbd12.s
字号:
; 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 + -