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

📄 usbd12.lst

📁 AVR16单片机USB通信程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -