📄 li_jyq.lst
字号:
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 + -