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

📄 li_jyq.lst

📁 这段程序是步进电机的细分驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
     585 2EE0      MOV	R14,R16
     586 2DEC      MOV	R30,R12
     587 27FF      CLR	R31
     588 800E      LDD	R0,Y+6
     589 801F      LDD	R1,Y+7
     58A 0DE0      ADD	R30,R0
     58B 1DF1      ADC	R31,R1
     58C 82E0      STD	Z+0,R14
     58D 94C3      INC	R12
     58E 14CA      CP	R12,R10
     58F F390      BCS	0x0582
(0622) 	outportb(D12_COMMAND, 0xF2);
     590 EF22      LDI	R18,0xF2
     591 E001      LDI	R16,1
     592 E010      LDI	R17,0
     593 DED6      RCALL	_outportb
(0623) 	EIMSK=0x01;
     594 E081      LDI	R24,1
     595 BF89      OUT	0x39,R24
(0624)  	return j;
     596 2D0A      MOV	R16,R10
     597 940C 172F JMP	pop_xgset00FC
_D12_WriteEndpoint:
  i                    --> R12
  buf                  --> Y,+2
  len                  --> R10
  endp                 --> R12
     599 92AA      ST	R10,-Y
     59A 92CA      ST	R12,-Y
     59B 2EA2      MOV	R10,R18
     59C 2EC0      MOV	R12,R16
(0625) }
(0626) 
(0627) //写端点
(0628) uchar D12_WriteEndpoint(uchar endp, uchar len, uchar * buf)//端点送出出数据
(0629) {                                                      
(0630) 	unsigned char i;
(0631) 	
(0632)  	EIMSK=0x00;
     59D 2422      CLR	R2
     59E BE29      OUT	0x39,R2
(0633)  	outportb(D12_COMMAND, endp);     
     59F 2D2C      MOV	R18,R12
     5A0 E001      LDI	R16,1
     5A1 E010      LDI	R17,0
     5A2 DEC7      RCALL	_outportb
(0634) 	i = inportb(D12_DATA);
     5A3 2700      CLR	R16
     5A4 2711      CLR	R17
     5A5 DED1      RCALL	_inportb
(0635)  	outportb(D12_COMMAND, 0xF0);                          //写缓冲区
     5A6 EF20      LDI	R18,0xF0
     5A7 E001      LDI	R16,1
     5A8 E010      LDI	R17,0
     5A9 DEC0      RCALL	_outportb
(0636) 	outportb(D12_DATA, 0);
     5AA 2722      CLR	R18
     5AB 2700      CLR	R16
     5AC 2711      CLR	R17
     5AD DEBC      RCALL	_outportb
(0637) 	outportb(D12_DATA, len);
     5AE 2D2A      MOV	R18,R10
     5AF 2700      CLR	R16
     5B0 2711      CLR	R17
     5B1 DEB8      RCALL	_outportb
(0638) 	for(i=0; i<len; i++)
     5B2 24CC      CLR	R12
     5B3 C00B      RJMP	0x05BF
(0639) 		outportb(D12_DATA, *(buf+i));
     5B4 2DEC      MOV	R30,R12
     5B5 27FF      CLR	R31
     5B6 800A      LDD	R0,Y+2
     5B7 801B      LDD	R1,Y+3
     5B8 0DE0      ADD	R30,R0
     5B9 1DF1      ADC	R31,R1
     5BA 8120      LDD	R18,Z+0
     5BB 2700      CLR	R16
     5BC 2711      CLR	R17
     5BD DEAC      RCALL	_outportb
     5BE 94C3      INC	R12
     5BF 14CA      CP	R12,R10
     5C0 F398      BCS	0x05B4
(0640)  	outportb(D12_COMMAND, 0xFA);                         //缓冲区有效
     5C1 EF2A      LDI	R18,0xFA
     5C2 E001      LDI	R16,1
     5C3 E010      LDI	R17,0
     5C4 DEA5      RCALL	_outportb
(0641) 	EIMSK=0x01;
     5C5 E081      LDI	R24,1
     5C6 BF89      OUT	0x39,R24
(0642) 	return len;
     5C7 2D0A      MOV	R16,R10
     5C8 90C9      LD	R12,Y+
     5C9 90A9      LD	R10,Y+
     5CA 9508      RET
_D12_AcknowledgeEndpoint:
  endp                 --> R10
     5CB 92AA      ST	R10,-Y
     5CC 2EA0      MOV	R10,R16
(0643) }
(0644) 
(0645) //设置端点应答
(0646) void D12_AcknowledgeEndpoint(uchar endp)                //缓冲区确认
(0647) {	
(0648) 	outportb(D12_COMMAND, endp);
     5CD 2D2A      MOV	R18,R10
     5CE E001      LDI	R16,1
     5CF E010      LDI	R17,0
     5D0 DE99      RCALL	_outportb
(0649) 	outportb(D12_COMMAND, 0xF1);
     5D1 EF21      LDI	R18,0xF1
     5D2 E001      LDI	R16,1
     5D3 E010      LDI	R17,0
     5D4 DE95      RCALL	_outportb
(0650) 	if(endp == 0)
     5D5 20AA      TST	R10
     5D6 F421      BNE	0x05DB
(0651) 	outportb(D12_COMMAND, 0xF2);
     5D7 EF22      LDI	R18,0xF2
     5D8 E001      LDI	R16,1
     5D9 E010      LDI	R17,0
     5DA DE8F      RCALL	_outportb
     5DB 90A9      LD	R10,Y+
     5DC 9508      RET
_get_status:
  c                    --> R10
  endp                 --> R12
  txdat                --> Y,+0
  bRecipient           --> R20
     5DD 940E 176E CALL	push_xgset303C
     5DF 9722      SBIW	R28,2
(0652) }
(0653) 
(0654) //获取设备状态
(0655) void get_status(void)
(0656) {
(0657) 	uchar endp, txdat[2];
(0658) 	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & (uchar)0x1F;
     5E0 9140 0359 LDS	R20,ControlData
     5E2 714F      ANDI	R20,0x1F
(0659) 	uchar c;                                      //请求的后五位
(0660) 	
(0661)  	if (bRecipient == (uchar)0x00) 
     5E3 F479      BNE	0x05F3
(0662) 	{
(0663) 		if(remote_wakeup == 1)     //获取远程唤醒状态
     5E4 9180 038A LDS	R24,remote_wakeup
     5E6 3081      CPI	R24,1
     5E7 F419      BNE	0x05EB
(0664) 			txdat[0] = 3;
     5E8 E083      LDI	R24,3
     5E9 8388      STD	Y+0,R24
     5EA C002      RJMP	0x05ED
(0665) 		else
(0666) 		  txdat[0] = 1;
     5EB E081      LDI	R24,1
     5EC 8388      STD	Y+0,R24
(0667) 		  txdat[1]=0;
     5ED 2422      CLR	R2
     5EE 8229      STD	Y+1,R2
(0668) 		  single_transmit(txdat, 2);
     5EF E022      LDI	R18,2
     5F0 018E      MOVW	R16,R28
     5F1 D419      RCALL	_single_transmit
(0669) 	} 
     5F2 C035      RJMP	0x0628
(0670) 	else if (bRecipient == (uchar)0x01) 
     5F3 3041      CPI	R20,1
     5F4 F439      BNE	0x05FC
(0671) 	{//获取接口状态
(0672) 		txdat[0]=0;
     5F5 2422      CLR	R2
     5F6 8228      STD	Y+0,R2
(0673) 		txdat[1]=0;
     5F7 8229      STD	Y+1,R2
(0674) 		single_transmit(txdat, 2);      //从端点1发送2个字节的数据
     5F8 E022      LDI	R18,2
     5F9 018E      MOVW	R16,R28
     5FA D410      RCALL	_single_transmit
(0675) 	} 
     5FB C02C      RJMP	0x0628
(0676) 	else if (bRecipient == (uchar)0x02) 
     5FC 3042      CPI	R20,2
     5FD F521      BNE	0x0622
(0677) 	{//获取端点状态
(0678) 		endp = (uchar)(ControlData.DeviceRequest.wIndex & (uchar)0x3);
     5FE 9180 035D LDS	R24,0x035D
     600 9190 035E LDS	R25,0x035E
     602 7083      ANDI	R24,3
     603 7090      ANDI	R25,0
     604 2EC8      MOV	R12,R24
(0679) 		if (ControlData.DeviceRequest.wIndex & 0x80)
     605 9020 035D LDS	R2,0x035D
     607 9030 035E LDS	R3,0x035E
     609 FE27      SBRS	R2,7
     60A C006      RJMP	0x0611
(0680) 			c = D12_SelectEndpoint(endp*2 + 1);	//控制输入
     60B 2F08      MOV	R16,R24
     60C 0F00      LSL	R16
     60D 5F0F      SUBI	R16,0xFF
     60E DEDC      RCALL	_D12_SelectEndpoint
     60F 2EA0      MOV	R10,R16
     610 C004      RJMP	0x0615
(0681) 		else
(0682) 			c = D12_SelectEndpoint(endp*2);	//控制输出
     611 2D0C      MOV	R16,R12
     612 0F00      LSL	R16
     613 DED7      RCALL	_D12_SelectEndpoint
     614 2EA0      MOV	R10,R16
(0683) 		if(c & 0x02)
     615 FEA1      SBRS	R10,1
     616 C003      RJMP	0x061A
(0684) 			txdat[0] = 1;
     617 E081      LDI	R24,1
     618 8388      STD	Y+0,R24
     619 C002      RJMP	0x061C
(0685) 		else
(0686) 			txdat[0] = 0;
     61A 2422      CLR	R2
     61B 8228      STD	Y+0,R2
(0687) 		txdat[1] = 0;
     61C 2422      CLR	R2
     61D 8229      STD	Y+1,R2
(0688) 		single_transmit(txdat, 2);      
     61E E022      LDI	R18,2
     61F 018E      MOVW	R16,R28
     620 D3EA      RCALL	_single_transmit
(0689) 	} 
     621 C006      RJMP	0x0628
(0690) 	else
(0691) 	{
(0692) 		D12_SetEndpointStatus(0, 1);      //端点01数据发送成功
     622 E021      LDI	R18,1
     623 2700      CLR	R16
     624 DEE2      RCALL	_D12_SetEndpointStatus
(0693) 		D12_SetEndpointStatus(1, 1);
     625 E021      LDI	R18,1
     626 E001      LDI	R16,1
     627 DEDF      RCALL	_D12_SetEndpointStatus
(0694) 	}
     628 9622      ADIW	R28,2
     629 940C 1775 JMP	pop_xgset303C
_clear_feature:
  endp                 --> R10
  bRecipient           --> R20
     62B 92AA      ST	R10,-Y
     62C 934A      ST	R20,-Y
(0695) }
(0696) 
(0697) //特性清除
(0698) void clear_feature(void)
(0699) {
(0700) 	uchar endp;
(0701) 	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & (uchar)0x1F;
     62D 9140 0359 LDS	R20,ControlData
     62F 714F      ANDI	R20,0x1F
(0702) 	
(0703) 	if (bRecipient == (uchar)0x00
     630 F499      BNE	0x0644
     631 9180 035B LDS	R24,ControlData+2
     633 9190 035C LDS	R25,ControlData+3
     635 3081      CPI	R24,1
     636 E0E0      LDI	R30,0
     637 079E      CPC	R25,R30
     638 F459      BNE	0x0644
(0704) 		&& ControlData.DeviceRequest.wValue == 0x0001) 
(0705) 	{//清除远程唤醒功能
(0706) 		EIMSK=0x00;
     639 2422      CLR	R2
     63A BE29      OUT	0x39,R2
(0707) 		remote_wakeup = 0;
     63B 9220 038A STS	remote_wakeup,R2
(0708) 		EIMSK=0x01;
     63D E081      LDI	R24,1
     63E BF89      OUT	0x39,R24
(0709) 		single_transmit(0, 0);
     63F 2722      CLR	R18
     640 2700      CLR	R16
     641 2711      CLR	R17
     642 D3C8      RCALL	_single_transmit
(0710) 	}
     643 C02C      RJMP	0x0670
(0711) 	else if (bRecipient == (uchar)0x02
     644 3042      CPI	R20,2
     645 F521      BNE	0x066A
     646 9020 035B LDS	R2,ControlData+2
     648 9030 035C LDS	R3,ControlData+3
     64A 2022      TST	R2
     64B F4F1      BNE	0x066A
     64C 2033      TST	R3
     64D F4E1      BNE	0x066A
(0712) 		&& ControlData.DeviceRequest.wValue == 0x0000) 
(0713) 	{//清除端点stall
(0714) 		endp = (uchar)(ControlData.DeviceRequest.wIndex & (uchar)0x3);
     64E 9180 035D LDS	R24,0x035D
     650 9190 035E LDS	R25,0x035E
     652 7083      ANDI	R24,3
     653 7090      ANDI	R25,0
     654 2EA8      MOV	R10,R24
(0715) 		if (ControlData.DeviceRequest.wIndex & 0x80)
     655 9020 035D LDS	R2,0x035D
     657 9030 035E LDS	R3,0x035E
     659 FE27      SBRS	R2,7
     65A C006      RJMP	0x0661
(0716) 			D12_SetEndpointStatus(endp*2 + 1, 0);
     65B 2722      CLR	R18
     65C 2F08      MOV	R16,R24
     65D 0F00      LSL	R16
     65E 5F0F      SUBI	R16,0xFF
     65F DEA7      RCALL	_D12_SetEndpointStatus
     660 C004      RJMP	0x0665
(0717) 		else
(0718) 			D12_SetEndpointStatus(endp*2, 0);
     661 2722      CLR	R18
     662 2D0A      MOV	R16,R10
     663 0F00      LSL	R16
     664 DEA2      RCALL	_D12_SetEndpointStatus
(0719) 		single_transmit(0, 0);
     665 2722      CLR	R18
     666 2700      CLR	R16
     667 2711      CLR	R17
     668 D3A2      RCALL	_single_transmit
(0720) 	} 
     669 C006      RJMP	0x0670
(0721) 	else
(0722) 	{
(0723) 		D12_SetEndpointStatus(0, 1);
     66A E021      LDI	R18,1
     66B 2700      CLR	R16
     66C DE9A      RCALL	_D12_SetEndpointStatus
(0724) 		D12_SetEndpointStatus(1, 1);
     66D E021      LDI	R18,1
     66E E001      LDI	R16,1
     66F DE97      RCALL	_D12_SetEndpointStatus
(0725) 	}
     670 9149      LD	R20,Y+
     671 90A9      LD	R10,Y+
     672 9508      RET
_set_feature:
  endp                 --> R10
  bRecipient           --> R20
     673 92AA      ST	R10,-Y
     674 934A      ST	R20,-Y
(0726) }
(0727) 
(0728) //特性设置
(0729) void set_feature(void)
(0730) {
(0731) 	uchar endp;
(0732) 	uchar bRecipient = ControlData.DeviceRequest.bmRequestType & (uchar)0x1F;
     675 9140 0359 LDS	R20,ControlData
     677 714F      ANDI	R20,0x1F
(0733) 		
(0734) 	if (bRecipient == (uchar)0x00
     678 F499      BNE	0x068C
     679 9180 035B LDS	R24,ControlData+2
     67B 9190 035C LDS	R25,ControlData+3
     67D 3081      CPI	R24,1
     67E E0E0      LDI	R30,0
     67F 079E      CPC	R25,R30
     680 F459      BNE	0x068C
(0735) 		&& ControlData.DeviceRequest.wValue == 0x0001) 
(0736) 	{//设置远程唤醒功能
(0737) 		EIMSK=0x00;
     681 2422      CLR	R2
     682 BE29      OUT	0x39,R2
(0738) 		remote_wakeup = 1;
     683 E081      LDI	R24,1
     684 9380 038A STS	remote_wakeup,R24
(0739) 		EIMSK=0x01;
     686 BF89      OUT	0x39,R24
(0740) 		single_transmit(0, 0);
     687 2722      CLR	R18
     688 2700      CLR	R16
     689 2711      CLR	R17
     68A D380      RCALL	_single_transmit
(0741) 	}
     68B C02C      RJMP	0x06B8
(0742) 	else if (bRecipient == (uchar)0x02
     68C 3042      CPI	R20,2
     68D F521      BNE	0x06B2
     68E 9020 035B LDS	R2,ControlData+2
     690 9030 035C LDS	R3,ControlData+3
     692 2022      TST	R2
     693 F4F1      BNE	0x06B2
     694 2033      TST	R3
     695 F4E1      BNE	0x06B2
(0743) 		&& ControlData.DeviceRequest.wValue == 0x0000) 
(0744) 	{//设置端点stall
(0745) 		endp = (uchar)(ControlData.DeviceRequest.wIndex & (uchar)0x3);
     696 9180 035D LDS	R24,0x035D
     698 9190 035E LDS	R25,0x035E
     69A 7083      ANDI	R24,3
     69B 7090      ANDI	R25,0
     69C 2EA8      MOV	R10,R24
(0746) 		if (ControlData.DeviceRequest.wIndex & 0x80)
     69D 9020 035D LDS	R2,0x035D
     69F 9030 035E LDS	R3,0x035E
     6A1 FE27      SBRS	R2,7
     6A2 C006      RJMP	0x06A9
(0747) 			D12_SetEndpointStatus(endp*2 + 1, 1);
     6A3 E021      LDI	R18,1
     6A4 2F08      MOV	R16,R24
     6A5 0F00      LSL	R16
     6A6 5F0F      SUBI	R16,0xFF
     6A7 DE5F      RCALL	_D12_SetEndpointStatus
     6A8 C004      RJMP	0x06AD
(0748) 		else
(0749) 			D12_SetEndpointStatus(endp*2, 1);
     6A9 E021      LDI	R18,1
     6AA 2D0A      MOV	R16,R10
     6AB 0F00      LSL	R16
     6AC DE5A      RCALL	_D12_SetEndpointStatus
(0750) 		single_transmit(0, 0);
     6AD 2722      CLR	R18
     6AE 2700      CLR	R16
     6AF 2711      CLR	R17
     6B0 D35A      RCALL	_single_transmit
(0

⌨️ 快捷键说明

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