📄 usbd12.lst
字号:
018F B381 IN R24,P11
0190 6F80 ORI R24,0xF0
0191 BB81 OUT P11,R24
(0232) USBCTL_DDR&=~BIT(D12_INT); //中断引脚设置为输入
0192 988B CBI P11,3
(0233) USBCTL_PORT|=BIT(D12_INT); //上拉使能
0193 9A93 SBI P12,3
(0234) USBCTL_PORT|=BIT(WR_N)|BIT(RD_N)|BIT(D12_CS); //控制引脚无效
0194 B382 IN R24,P12
0195 6B80 ORI R24,0xB0
0196 BB82 OUT P12,R24
(0235) PORTA|=BIT(CSUSB); //送出控制信号
0197 9ADF SBI P1B,7
(0236)
(0237) SREG|=BIT(GLOBAL); //使能全局中断
0198 9478 BSET 7
(0238) MCUCR&=0xF3; //外部中断1采用低电平触发
0199 B785 IN R24,P35
019A 7F83 ANDI R24,0xF3
019B BF85 OUT P35,R24
(0239) GICR|=BIT(EXTINT1); //使能外部中断0和1
019C B78B IN R24,P3B
019D 6880 ORI R24,0x80
019E BF8B OUT P3B,R24
(0240)
(0241) USBCTL_PORT&=~BIT(D12_CS);
019F 9897 CBI P12,7
(0242) }
01A0 9508 RET
_OutB:
dat --> R20
cmd --> R22
01A1 940E0758 CALL push_gset2
01A3 2F42 MOV R20,R18
01A4 2F60 MOV R22,R16
(0243) /*******************************************
(0244) 函数名称: OutB
(0245) 功 能: 向D12写入一个字节数据或者命令
(0246) 参 数: cmd--命令标识(为CMD是命令,为DAT是数据)
(0247) dat--要写入的字节数据
(0248) 返回值 : 无
(0249) /********************************************/
(0250) void OutB(uchar cmd,uchar dat)
(0251) {
(0252) if(cmd==CMD)
01A5 3061 CPI R22,1
01A6 F471 BNE 0x01B5
(0253) {
(0254) USBCTL_PORT|=BIT(C_D);
01A7 9A96 SBI P12,6
(0255) Delayus(5);
01A8 E005 LDI R16,5
01A9 E010 LDI R17,0
01AA DEE5 RCALL _Delayus
(0256) USBCTL_PORT&=~BIT(WR_N);
01AB 9894 CBI P12,4
(0257) Delayus(5);
01AC E005 LDI R16,5
01AD E010 LDI R17,0
01AE DEE1 RCALL _Delayus
(0258) USBDAT_PORT=dat;
01AF BB48 OUT P18,R20
(0259) Delayus(5);
01B0 E005 LDI R16,5
01B1 E010 LDI R17,0
01B2 DEDD RCALL _Delayus
(0260) USBCTL_PORT|=BIT(WR_N);
01B3 9A94 SBI P12,4
(0261) }
01B4 C00D RJMP 0x01C2
(0262) else
(0263) {
(0264) USBCTL_PORT&=~BIT(C_D);
01B5 9896 CBI P12,6
(0265) Delayus(1);
01B6 E001 LDI R16,1
01B7 E010 LDI R17,0
01B8 DED7 RCALL _Delayus
(0266) USBCTL_PORT&=~BIT(WR_N);
01B9 9894 CBI P12,4
(0267) Delayus(1);
01BA E001 LDI R16,1
01BB E010 LDI R17,0
01BC DED3 RCALL _Delayus
(0268) USBDAT_PORT=dat;
01BD BB48 OUT P18,R20
(0269) Delayus(1);
01BE E001 LDI R16,1
01BF E010 LDI R17,0
01C0 DECF RCALL _Delayus
(0270) USBCTL_PORT|=BIT(WR_N);
01C1 9A94 SBI P12,4
(0271) }
(0272) }
01C2 940E0760 CALL pop_gset2
01C4 9508 RET
_InB:
dat --> R20
01C5 940E0741 CALL push_gset1
(0273) /*******************************************
(0274) 函数名称: InB
(0275) 功 能: 从D12读出一个字节数据
(0276) 参 数: 无
(0277) 返回值 : dat--读出的字节数据
(0278) /********************************************/
(0279) uchar InB(void)
(0280) {
(0281) uchar dat;
(0282) USBDAT_DDR=0x00;
01C7 2422 CLR R2
01C8 BA27 OUT P17,R2
(0283) USBDAT_PORT=0xFF;
01C9 EF8F LDI R24,0xFF
01CA BB88 OUT P18,R24
(0284) USBCTL_PORT&=~BIT(C_D);
01CB 9896 CBI P12,6
(0285) Delayus(1);
01CC E001 LDI R16,1
01CD E010 LDI R17,0
01CE DEC1 RCALL _Delayus
(0286) USBCTL_PORT&=~BIT(RD_N);
01CF 9895 CBI P12,5
(0287) Delayus(1);
01D0 E001 LDI R16,1
01D1 E010 LDI R17,0
01D2 DEBD RCALL _Delayus
(0288) dat=USBDAT_PIN;
01D3 B346 IN R20,P16
(0289) Delayus(1);
01D4 E001 LDI R16,1
01D5 E010 LDI R17,0
01D6 DEB9 RCALL _Delayus
(0290) USBCTL_PORT|=BIT(RD_N);
01D7 9A95 SBI P12,5
(0291) USBDAT_DDR=0xFF;
01D8 EF8F LDI R24,0xFF
01D9 BB87 OUT P17,R24
(0292) return dat;
01DA 2F04 MOV R16,R20
01DB 940E0744 CALL pop_gset1
01DD 9508 RET
_Set_addren:
enable --> R22
addr --> R20
01DE 940E0758 CALL push_gset2
01E0 2F62 MOV R22,R18
01E1 2F40 MOV R20,R16
(0293) }
(0294) /*******************************************
(0295) 函数名称: Set_addren
(0296) 功 能: 设置地址/使能----------------------------
(0297) 参 数: addr--设置的地址
(0298) enable--使能标志(为1使能,为0禁止)
(0299) 返回值 : 无
(0300) /********************************************/
(0301) void Set_addren(uchar addr, uchar enable)
(0302) {
(0303) if(USB_FLAG.in_isr == 0)
01E2 90200064 LDS R2,0x64
01E4 2022 TST R2
01E5 F409 BNE 0x01E7
(0304) UEN_GINT();
01E6 94F8 BCLR 7
(0305)
(0306) OutB(CMD, 0xD0); //输出设置地址/使能指令
01E7 ED20 LDI R18,0xD0
01E8 E001 LDI R16,1
01E9 DFB7 RCALL _OutB
(0307) Delayus(1);
01EA E001 LDI R16,1
01EB E010 LDI R17,0
01EC DEA3 RCALL _Delayus
(0308) if(enable)
01ED 2366 TST R22
01EE F009 BEQ 0x01F0
(0309) {
(0310) addr|=0x80; //bit7置1,使能
01EF 6840 ORI R20,0x80
(0311) }
(0312) Delayus(1);
01F0 E001 LDI R16,1
01F1 E010 LDI R17,0
01F2 DE9D RCALL _Delayus
(0313) OutB(DAT,addr); //输出设置值
01F3 2F24 MOV R18,R20
01F4 2700 CLR R16
01F5 DFAB RCALL _OutB
(0314)
(0315) if(USB_FLAG.in_isr == 0)
01F6 90200064 LDS R2,0x64
01F8 2022 TST R2
01F9 F409 BNE 0x01FB
(0316) EN_GINT();
01FA 9478 BSET 7
(0317) }
01FB 940E0760 CALL pop_gset2
01FD 9508 RET
_Set_EPen:
enable --> R20
01FE 940E0741 CALL push_gset1
0200 2F40 MOV R20,R16
(0318) /*******************************************
(0319) 函数名称: Set_EPen
(0320) 功 能: 设置端点使能
(0321) 参 数: enable--使能标志(为1使能,为0禁止)
(0322) 返回值 : 无
(0323) /********************************************/
(0324) void Set_EPen(uchar enable)
(0325) {
(0326) if(USB_FLAG.in_isr == 0)
0201 90200064 LDS R2,0x64
0203 2022 TST R2
0204 F409 BNE 0x0206
(0327) UEN_GINT();
0205 94F8 BCLR 7
(0328)
(0329) OutB(CMD,0xD8); //输出设置端点使能指令
0206 ED28 LDI R18,0xD8
0207 E001 LDI R16,1
0208 DF98 RCALL _OutB
(0330) Delayus(1);
0209 E001 LDI R16,1
020A E010 LDI R17,0
020B DE84 RCALL _Delayus
(0331) if(enable)
020C 2344 TST R20
020D F021 BEQ 0x0212
(0332) OutB(DAT,1); //设置端点允许
020E E021 LDI R18,1
020F 2700 CLR R16
0210 DF90 RCALL _OutB
0211 C003 RJMP 0x0215
(0333) else
(0334) OutB(DAT,0); //设置端点禁止
0212 2722 CLR R18
0213 2700 CLR R16
0214 DF8C RCALL _OutB
(0335)
(0336) if(USB_FLAG.in_isr == 0)
0215 90200064 LDS R2,0x64
0217 2022 TST R2
0218 F409 BNE 0x021A
(0337) EN_GINT();
0219 9478 BSET 7
(0338) }
021A 940E0744 CALL pop_gset1
021C 9508 RET
_Set_mode:
clkdiv --> R20
config --> R22
021D 940E0758 CALL push_gset2
021F 2F42 MOV R20,R18
0220 2F60 MOV R22,R16
(0339) /*******************************************
(0340) 函数名称: Set_mode
(0341) 功 能: 设置模式
(0342) 参 数: config--配置字节信息
(0343) clkdiv--分频因子
(0344) 返回值 : 无
(0345) /********************************************/
(0346) void Set_mode(uchar config,uchar clkdiv)
(0347) {
(0348) if(USB_FLAG.in_isr == 0)
0221 90200064 LDS R2,0x64
0223 2022 TST R2
0224 F409 BNE 0x0226
(0349) UEN_GINT();
0225 94F8 BCLR 7
(0350)
(0351) OutB(CMD,0xF3); //输出设置模式指令
0226 EF23 LDI R18,0xF3
0227 E001 LDI R16,1
0228 DF78 RCALL _OutB
(0352) Delayus(1);
0229 E001 LDI R16,1
022A E010 LDI R17,0
022B DE64 RCALL _Delayus
(0353) OutB(DAT,config); //输出配置字节信息
022C 2F26 MOV R18,R22
022D 2700 CLR R16
022E DF72 RCALL _OutB
(0354) OutB(DAT,clkdiv); //输出时钟分频因数字节
022F 2F24 MOV R18,R20
0230 2700 CLR R16
0231 DF6F RCALL _OutB
(0355)
(0356) if(USB_FLAG.in_isr == 0)
0232 90200064 LDS R2,0x64
0234 2022 TST R2
0235 F409 BNE 0x0237
(0357) EN_GINT();
0236 9478 BSET 7
(0358) }
0237 940E0760 CALL pop_gset2
0239 9508 RET
_Set_DMA:
bMode --> R20
023A 940E0741 CALL push_gset1
023C 2F40 MOV R20,R16
(0359) /*******************************************
(0360) 函数名称: Set_DMA
(0361) 功 能: 设置DMA工作方式设置
(0362) 参 数: bMode--设置值
(0363) 返回值 : 无
(0364) /********************************************/
(0365) void Set_DMA(uchar bMode)
(0366) {
(0367) if(USB_FLAG.in_isr == 0)
023D 90200064 LDS R2,0x64
023F 2022 TST R2
0240 F409 BNE 0x0242
(0368) UEN_GINT();
0241 94F8 BCLR 7
(0369)
(0370) OutB(CMD, 0xFB); //设置DMA工作方命令
0242 EF2B LDI R18,0xFB
0243 E001 LDI R16,1
0244 DF5C RCALL _OutB
(0371) Delayus(1);
0245 E001 LDI R16,1
0246 E010 LDI R17,0
0247 DE48 RCALL _Delayus
(0372) OutB(DAT, bMode); //输出设置值
0248 2F24 MOV R18,R20
0249 2700 CLR R16
024A DF56 RCALL _OutB
(0373)
(0374) if(USB_FLAG.in_isr == 0)
024B 90200064 LDS R2,0x64
024D 2022 TST R2
024E F409 BNE 0x0250
(0375) EN_GINT();
024F 9478 BSET 7
(0376) }
0250 940E0744 CALL pop_gset1
0252 9508 RET
_Read_IntR:
regl --> R22
intreg --> R20
0253 940E0758 CALL push_gset2
(0377)
(0378) /*******************************************
(0379) 函数名称: Read_IntR
(0380) 功 能: 读取中断寄存器值
(0381) 参 数: 无
(0382) 返回值 : intreg--16位中断寄存器值
(0383) /********************************************/
(0384) uint Read_IntR(void)
(0385) {
(0386) uchar regl;
(0387) uint intreg;
(0388)
(0389) OutB(CMD,0xF4); //读取中断寄存器命令
0255 EF24 LDI R18,0xF4
0256 E001 LDI R16,1
0257 DF49 RCALL _OutB
(0390) Delayus(5);
0258 E005 LDI R16,5
0259 E010 LDI R17,0
025A DE35 RCALL _Delayus
(0391) regl=InB( ); //读取低8位字节
025B DF69 RCALL _InB
025C 2F60 MOV R22,R16
(0392) intreg=InB( ); //读取高8位字节
025D DF67 RCALL _InB
025E 2F40 MOV R20,R16
025F 2755 CLR R21
(0393)
(0394) intreg<<=8;
0260 2F54 MOV R21,R20
0261 2744 CLR R20
(0395) intreg+=regl; //组合为16位
0262 2E26 MOV R2,R22
0263 2433 CLR R3
0264 0D42 ADD R20,R2
0265 1D53 ADC R21,R3
(0396)
(0397) return intreg;
0266 2F04 MOV R16,R20
0267 2F15 MOV R17,R21
0268 940E0760 CALL pop_gset2
026A 9508 RET
_Sel_EP:
byte --> R20
endp --> R20
026B 940E0741 CALL push_gset1
026D 2F40 MOV R20,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -