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