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

📄 li_jyq.lst

📁 这段程序是步进电机的细分驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
     47D C006      RJMP	0x0484
(0494)    else if(Addr==D12_COMMAND)
     47E 3001      CPI	R16,1
     47F E0E0      LDI	R30,0
     480 071E      CPC	R17,R30
     481 F411      BNE	0x0484
(0495)    {
(0496)        Data = USB_COMMAND;  
     482 90A0 F001 LDS	R10,0xF001
(0497)    }
(0498)    
(0499)    return Data;
     484 2D0A      MOV	R16,R10
     485 90A9      LD	R10,Y+
     486 9508      RET
_D12_SetAddressEnable:
  bEnable              --> R10
  bAddress             --> R20
     487 92AA      ST	R10,-Y
     488 934A      ST	R20,-Y
     489 2EA2      MOV	R10,R18
     48A 2F40      MOV	R20,R16
(0500) }
(0501) 
(0502) //设置地址使能
(0503) void D12_SetAddressEnable(uchar bAddress, uchar bEnable)
(0504) {
(0505) 	EIMSK=0x00;
     48B 2422      CLR	R2
     48C BE29      OUT	0x39,R2
(0506) 	outportb(D12_COMMAND, 0xD0);//输出指令
     48D ED20      LDI	R18,0xD0
     48E E001      LDI	R16,1
     48F E010      LDI	R17,0
     490 DFD9      RCALL	_outportb
(0507) 	if(bEnable)
     491 20AA      TST	R10
     492 F009      BEQ	0x0494
(0508) 		bAddress |= 0x80;
     493 6840      ORI	R20,0x80
(0509) 	outportb(D12_DATA, bAddress);//设置地址
     494 2F24      MOV	R18,R20
     495 2700      CLR	R16
     496 2711      CLR	R17
     497 DFD2      RCALL	_outportb
(0510) 	EIMSK=0x01;
     498 E081      LDI	R24,1
     499 BF89      OUT	0x39,R24
     49A 9149      LD	R20,Y+
     49B 90A9      LD	R10,Y+
     49C 9508      RET
_D12_SetEndpointEnable:
  bEnable              --> R10
     49D 92AA      ST	R10,-Y
     49E 2EA0      MOV	R10,R16
(0511) }
(0512) 
(0513) //设置端点使能
(0514) void D12_SetEndpointEnable(uchar bEnable)
(0515) {	
(0516) 	EIMSK=0x00;
     49F 2422      CLR	R2
     4A0 BE29      OUT	0x39,R2
(0517) 	outportb(D12_COMMAND, 0xD8);//输出指令
     4A1 ED28      LDI	R18,0xD8
     4A2 E001      LDI	R16,1
     4A3 E010      LDI	R17,0
     4A4 DFC5      RCALL	_outportb
(0518) 	if(bEnable)
     4A5 20AA      TST	R10
     4A6 F029      BEQ	0x04AC
(0519) 		outportb(D12_DATA, 1);//设置端点允许
     4A7 E021      LDI	R18,1
     4A8 2700      CLR	R16
     4A9 2711      CLR	R17
     4AA DFBF      RCALL	_outportb
     4AB C004      RJMP	0x04B0
(0520) 	else
(0521) 		outportb(D12_DATA, 0);//设置端点禁止
     4AC 2722      CLR	R18
     4AD 2700      CLR	R16
     4AE 2711      CLR	R17
     4AF DFBA      RCALL	_outportb
(0522) 	EIMSK=0x01;
     4B0 E081      LDI	R24,1
     4B1 BF89      OUT	0x39,R24
     4B2 90A9      LD	R10,Y+
     4B3 9508      RET
_D12_SetMode:
  bClkDiv              --> R10
  bConfig              --> R12
     4B4 92AA      ST	R10,-Y
     4B5 92CA      ST	R12,-Y
     4B6 2EA2      MOV	R10,R18
     4B7 2EC0      MOV	R12,R16
(0523) }
(0524) 
(0525) //模式设置
(0526) void D12_SetMode(uchar bConfig, uchar bClkDiv)
(0527) {
(0528) 	outportb(D12_COMMAND, 0xF3);//设置模式
     4B8 EF23      LDI	R18,0xF3
     4B9 E001      LDI	R16,1
     4BA E010      LDI	R17,0
     4BB DFAE      RCALL	_outportb
(0529) 	outportb(D12_DATA, bConfig);
     4BC 2D2C      MOV	R18,R12
     4BD 2700      CLR	R16
     4BE 2711      CLR	R17
     4BF DFAA      RCALL	_outportb
(0530) 	outportb(D12_DATA, bClkDiv);
     4C0 2D2A      MOV	R18,R10
     4C1 2700      CLR	R16
     4C2 2711      CLR	R17
     4C3 DFA6      RCALL	_outportb
     4C4 90C9      LD	R12,Y+
     4C5 90A9      LD	R10,Y+
     4C6 9508      RET
_D12_SetDMA:
  bMode                --> R10
     4C7 92AA      ST	R10,-Y
     4C8 2EA0      MOV	R10,R16
(0531) }
(0532) 
(0533) //DMA工作方式设置
(0534) void D12_SetDMA(uchar bMode)
(0535) {
(0536)  	outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
     4C9 EF2B      LDI	R18,0xFB
     4CA E001      LDI	R16,1
     4CB E010      LDI	R17,0
     4CC DF9D      RCALL	_outportb
(0537) 	outportb(D12_DATA, bMode);
     4CD 2D2A      MOV	R18,R10
     4CE 2700      CLR	R16
     4CF 2711      CLR	R17
     4D0 DF99      RCALL	_outportb
     4D1 90A9      LD	R10,Y+
     4D2 9508      RET
_D12_ReadInterruptRegister:
  b1                   --> R12
  j                    --> R10
     4D3 940E 1747 CALL	push_xgset003C
(0538) }
(0539) 
(0540) //读取中断寄存器
(0541) ushort D12_ReadInterruptRegister(void)
(0542) {
(0543) 	uchar b1;
(0544) 	uint j;
(0545) 	
(0546) 	outportb(D12_COMMAND, 0xF4);//读取中断寄存器
     4D5 EF24      LDI	R18,0xF4
     4D6 E001      LDI	R16,1
     4D7 E010      LDI	R17,0
     4D8 DF91      RCALL	_outportb
(0547) 	b1 = inportb(D12_DATA);
     4D9 2700      CLR	R16
     4DA 2711      CLR	R17
     4DB DF9B      RCALL	_inportb
     4DC 2EC0      MOV	R12,R16
(0548) 	j = inportb(D12_DATA);
     4DD 2700      CLR	R16
     4DE 2711      CLR	R17
     4DF DF97      RCALL	_inportb
     4E0 2EA0      MOV	R10,R16
     4E1 24BB      CLR	R11
(0549) 	j <<= 8;
     4E2 2CBA      MOV	R11,R10
     4E3 24AA      CLR	R10
(0550) 	j += b1;
     4E4 2C2C      MOV	R2,R12
     4E5 2433      CLR	R3
     4E6 0CA2      ADD	R10,R2
     4E7 1CB3      ADC	R11,R3
(0551) 	return j;
     4E8 0185      MOVW	R16,R10
     4E9 940C 172A JMP	pop_xgset003C
_D12_SelectEndpoint:
  c                    --> R10
  bEndp                --> R10
     4EB 92AA      ST	R10,-Y
     4EC 2EA0      MOV	R10,R16
(0552) }
(0553) 
(0554) //端点选择
(0555) uchar D12_SelectEndpoint(uchar bEndp)
(0556) {
(0557) 	uchar c;
(0558) 	
(0559) 	EIMSK=0x00;
     4ED 2422      CLR	R2
     4EE BE29      OUT	0x39,R2
(0560)  	outportb(D12_COMMAND, bEndp);//端点选择
     4EF 2D2A      MOV	R18,R10
     4F0 E001      LDI	R16,1
     4F1 E010      LDI	R17,0
     4F2 DF77      RCALL	_outportb
(0561) 	c = inportb(D12_DATA);
     4F3 2700      CLR	R16
     4F4 2711      CLR	R17
     4F5 DF81      RCALL	_inportb
     4F6 2EA0      MOV	R10,R16
(0562)  	EIMSK=0x01;
     4F7 E081      LDI	R24,1
     4F8 BF89      OUT	0x39,R24
(0563)   	return c;
     4F9 90A9      LD	R10,Y+
     4FA 9508      RET
_D12_ReadLastTransactionStatus:
  bEndp                --> R20
     4FB 934A      ST	R20,-Y
     4FC 2F40      MOV	R20,R16
(0564) }
(0565) 
(0566) //读取最后传输状态
(0567) uchar D12_ReadLastTransactionStatus(uchar bEndp)
(0568) {
(0569) 	outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
     4FD 2F24      MOV	R18,R20
     4FE 5C20      SUBI	R18,0xC0
     4FF E001      LDI	R16,1
     500 E010      LDI	R17,0
     501 DF68      RCALL	_outportb
(0570) 	return inportb(D12_DATA);
     502 2700      CLR	R16
     503 2711      CLR	R17
     504 DF72      RCALL	_inportb
     505 9149      LD	R20,Y+
     506 9508      RET
_D12_SetEndpointStatus:
  bStalled             --> R10
  bEndp                --> R20
     507 92AA      ST	R10,-Y
     508 934A      ST	R20,-Y
     509 2EA2      MOV	R10,R18
     50A 2F40      MOV	R20,R16
(0571) }
(0572) 
(0573) //设置端点状态
(0574) void D12_SetEndpointStatus(uchar bEndp, uchar bStalled)
(0575) {
(0576) 	EIMSK=0x00;
     50B 2422      CLR	R2
     50C BE29      OUT	0x39,R2
(0577)  	outportb(D12_COMMAND, 0x40 + bEndp);//设置端点状态
     50D 2F24      MOV	R18,R20
     50E 5C20      SUBI	R18,0xC0
     50F E001      LDI	R16,1
     510 E010      LDI	R17,0
     511 DF58      RCALL	_outportb
(0578) 	outportb(D12_DATA, bStalled);
     512 2D2A      MOV	R18,R10
     513 2700      CLR	R16
     514 2711      CLR	R17
     515 DF54      RCALL	_outportb
(0579) 	EIMSK=0x01;
     516 E081      LDI	R24,1
     517 BF89      OUT	0x39,R24
     518 9149      LD	R20,Y+
     519 90A9      LD	R10,Y+
     51A 9508      RET
_D12_ReadEndpoint:
  j                    --> R10
  i                    --> R12
  buf                  --> Y,+6
  len                  --> R12
  endp                 --> R10
     51B 940E 1745 CALL	push_xgset00FC
     51D 2EC2      MOV	R12,R18
     51E 2EA0      MOV	R10,R16
(0580) }
(0581) 
(0582) //读取端点数据
(0583) uchar D12_ReadEndpoint(uchar endp, uchar len, uchar * buf)
(0584) {                                        //端点号  长度  缓冲区
(0585) 	unsigned char i, j;
(0586) 	EIMSK=0x00;
     51F 2422      CLR	R2
     520 BE29      OUT	0x39,R2
(0587) 	outportb(D12_COMMAND, endp);
     521 2D2A      MOV	R18,R10
     522 E001      LDI	R16,1
     523 E010      LDI	R17,0
     524 DF45      RCALL	_outportb
(0588) 	if((inportb(D12_DATA) & 0x01) == 0)   //读缓冲区是否为空
     525 2700      CLR	R16
     526 2711      CLR	R17
     527 DF4F      RCALL	_inportb
     528 FD00      SBRC	R16,0
     529 C004      RJMP	0x052E
(0589) 	{
(0590) 		EIMSK=0x01;
     52A E081      LDI	R24,1
     52B BF89      OUT	0x39,R24
(0591) 		return 0;
     52C 2700      CLR	R16
     52D C029      RJMP	0x0557
(0592) 	}
(0593)  	outportb(D12_COMMAND, 0xF0);          //读缓冲区指针自动加1
     52E EF20      LDI	R18,0xF0
     52F E001      LDI	R16,1
     530 E010      LDI	R17,0
     531 DF38      RCALL	_outportb
(0594) 	j = inportb(D12_DATA);
     532 2700      CLR	R16
     533 2711      CLR	R17
     534 DF42      RCALL	_inportb
(0595) 	j = inportb(D12_DATA);
     535 2700      CLR	R16
     536 2711      CLR	R17
     537 DF3F      RCALL	_inportb
     538 2EE0      MOV	R14,R16
     539 2CAE      MOV	R10,R14
(0596)  	if(j > len)                           //最大长度
     53A 2C2C      MOV	R2,R12
     53B 2433      CLR	R3
     53C 2C4A      MOV	R4,R10
     53D 2455      CLR	R5
     53E 1424      CP	R2,R4
     53F 0435      CPC	R3,R5
     540 F40C      BGE	0x0542
(0597) 		j = len;
     541 2CA2      MOV	R10,R2
(0598)  	for(i=0; i<j; i++)
     542 24CC      CLR	R12
     543 C00C      RJMP	0x0550
(0599) 		*(buf+i) = inportb(D12_DATA);     //数据送入缓冲区
     544 2700      CLR	R16
     545 2711      CLR	R17
     546 DF30      RCALL	_inportb
     547 2EE0      MOV	R14,R16
     548 2DEC      MOV	R30,R12
     549 27FF      CLR	R31
     54A 800E      LDD	R0,Y+6
     54B 801F      LDD	R1,Y+7
     54C 0DE0      ADD	R30,R0
     54D 1DF1      ADC	R31,R1
     54E 82E0      STD	Z+0,R14
     54F 94C3      INC	R12
     550 14CA      CP	R12,R10
     551 F390      BCS	0x0544
(0600) 	outportb(D12_COMMAND, 0xF2);          //清缓冲区
     552 EF22      LDI	R18,0xF2
     553 E001      LDI	R16,1
     554 E010      LDI	R17,0
     555 DF14      RCALL	_outportb
(0601)  	return j;
     556 2D0A      MOV	R16,R10
     557 940C 172F JMP	pop_xgset00FC
_Isr_D12_ReadEndpoint:
  j                    --> R10
  i                    --> R12
  buf                  --> Y,+6
  len                  --> R12
  endp                 --> R10
     559 940E 1745 CALL	push_xgset00FC
     55B 2EC2      MOV	R12,R18
     55C 2EA0      MOV	R10,R16
(0602) }
(0603) //----------------------------------------------------------------------------
(0604) uchar Isr_D12_ReadEndpoint(uchar endp, uchar len, uchar * buf)  //读取双缓冲区数据
(0605) {                             
(0606) 	unsigned char i, j;
(0607) 	
(0608) 	EIMSK=0x00;
     55D 2422      CLR	R2
     55E BE29      OUT	0x39,R2
(0609) 	outportb(D12_COMMAND, endp);
     55F 2D2A      MOV	R18,R10
     560 E001      LDI	R16,1
     561 E010      LDI	R17,0
     562 DF07      RCALL	_outportb
(0610) 	if((inportb(D12_DATA) & 0x01) == 0) 
     563 2700      CLR	R16
     564 2711      CLR	R17
     565 DF11      RCALL	_inportb
     566 FD00      SBRC	R16,0
     567 C004      RJMP	0x056C
(0611) 	{
(0612) 		EIMSK=0x01;
     568 E081      LDI	R24,1
     569 BF89      OUT	0x39,R24
(0613) 		return 0;
     56A 2700      CLR	R16
     56B C02B      RJMP	0x0597
(0614) 	}
(0615)  	outportb(D12_COMMAND, 0xF0);
     56C EF20      LDI	R18,0xF0
     56D E001      LDI	R16,1
     56E E010      LDI	R17,0
     56F DEFA      RCALL	_outportb
(0616) 	j = inportb(D12_DATA);
     570 2700      CLR	R16
     571 2711      CLR	R17
     572 DF04      RCALL	_inportb
(0617) 	j = inportb(D12_DATA);
     573 2700      CLR	R16
     574 2711      CLR	R17
     575 DF01      RCALL	_inportb
     576 2EE0      MOV	R14,R16
     577 2CAE      MOV	R10,R14
(0618)  	if(j > len)
     578 2C2C      MOV	R2,R12
     579 2433      CLR	R3
     57A 2C4A      MOV	R4,R10
     57B 2455      CLR	R5
     57C 1424      CP	R2,R4
     57D 0435      CPC	R3,R5
     57E F40C      BGE	0x0580
(0619) 		j = len;
     57F 2CA2      MOV	R10,R2
(0620)  	for(i=0; i<j; i++)
     580 24CC      CLR	R12
     581 C00C      RJMP	0x058E
(0621) 		*(buf+i) = inportb(D12_DATA);
     582 2700      CLR	R16
     583 2711      CLR	R17
     584 DEF2      RCALL	_inportb

⌨️ 快捷键说明

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