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

📄 usblib1.asm

📁 基于HT82K96E的usb鼠标实现源程序
💻 ASM
字号:
include		ht82k96e.inc
;include    	usbrf.inc
include		usbfifo.inc



extern		stall			:byte
extern		FIFO_Type		:byte
extern		FIFO_OUT1 		:byte
extern		int_temp1		:byte
extern		int_temp2		:byte
extern		fifo_sendlen	:byte
extern		bhas_len0		:bit
extern		wr_NO			:byte
extern		kywr_NO			:byte


FIFO_temp		equ			int_temp1
fifo_no			equ			int_temp2



USBlib		.Section	AT 270H 'code'   ;AT	USBlib_ADDRESS
LEN0_Rd_Check:
	            MOV     A,USB_MISC				;		
                MOV     MP1,A
				mov		a,11100000b
				andm	a,r1
				nop
				nop
                SET     R1.@USB_Req         	;Set request
				nop
				nop
				nop
				nop
				nop
				nop
                MOV     A,(01H SHL @USB_Len0)  	;Len0 ready flag
                JMP     Check           		;Z=0:Len0 ready/1:Len0 not ready

;----------------------------------------------------------------------------
;FIFO 0 ready to read ?

FIFO0_Rd_Check:
				mov		a,00000000b
				jmp		FIFO_Check

FIFO1_RD_check:
				mov		a,00001000b
				jmp		FIFO_Check
FIFO2_RD_check:
				mov		a,00010000b
				jmp		FIFO_Check
FIFO3_RD_check:
				mov		a,00011000b
				jmp		FIFO_Check

				
;----------------------------------------------------------------------------
;Len 0 ready to write ?
LEN0_Wr_Check:
;FIFO 0 ready to write ?
FIFO0_Wr_Check:
				mov		a,00000010b
				jmp		FIFO_Check
FIFO1_Wr_check:
				mov		a,00001010b
				jmp		FIFO_Check
FIFO2_Wr_check:
				mov		a,00010010b
				jmp		FIFO_Check
FIFO3_Wr_check:
				mov		a,00011010b
				jmp		FIFO_Check
				
FIFO_Check:
				mov		FIFO_temp,a
                MOV     A,USB_MISC
                MOV     MP1,A
				mov		a,r1
				and		a,11100000b
				or		a,fifo_temp		;清misc的低3位,选择相应的Endpoint
				mov		r1,a
				nop
				nop
                SET     R1.@USB_Req         	;Set request
				nop
				nop
;				mov		a,40h
                MOV     A,(01H SHL @USB_Ready) 	;access ready flag
Check:
                NOP                 			;min delay 3 instruction cycle
                NOP 
				nop
				nop
				nop
				nop
;				AND		A,41H
                AND     A,R1        			;Z=0:ready/1:not ready
                RET

;----------------------------------------------------------------------------
;----BEGIN (Read FIFO)
ReadLen0:
                MOV     A,USB_FIFO0             ;dummy read
                MOV     MP1,A                   ;
                MOV     A,R1                    ;
				nop
                JMP     E1ND_Request             ;
ReadFIFO0:
                MOV     A,USB_FIFO0
                JMP     ReadFIFO
ReadFIFO1:
                MOV     A,USB_FIFO1
				JMP		ReadFIFO	
ReadFIFO2:
                MOV     A,USB_FIFO2
				JMP		ReadFIFO	
ReadFIFO3:
                MOV     A,USB_FIFO3
				JMP		ReadFIFO	

ReadFIFO:
                MOV     FIFO_NO,A             	;FIFO NO.
                CLR     FIFO_SendLen            ;Initial length to 0
                MOV     A,OFFSET FIFO_Type      ;set input FIFO buffer pointer
                MOV     MP0,A                   ;
ReadFIFOLoop:
                MOV     A,FIFO_NO              	;FIFO NO.
                MOV     MP1,A                   ;
                MOV     A,R1                    ;Read FIFO data
				nop
                MOV     R0,A                    ;
                INC     FIFO_SendLen            ;Getting data length++
                INC     MP0                     ;Update to next pointer
                MOV     A,FIFO_SIZE             ;FIFO full ?
                XOR     A,FIFO_SendLen          ;
                SZ      Z                       ;
                JMP     E1ND_Request             ;Yes
                MOV     A,USB_MISC              ;Check ready ?
                MOV     MP1,A                   ;
				nop
				nop
				nop
				nop
				nop
				nop
                SZ      R1.@USB_Ready           ;
                JMP     ReadFIFOLoop            ;Yes


                JMP     E1ND_Request             ;No Exit for not 8 bytes data
;----END (Read FIFO)

;----------------------------------------------------------------------------
;----BEGIN (Write FIFO)
;Write FIFO_OUT1 Data to FIFO Buffer 
WriteFIFO0:
				inc		wr_no
				mov		a, wr_no
				sub		a, 02h
				sz		acc
				jmp		$+2
				nop
                MOV     A,USB_FIFO0
			    JMP     WriteFIFO
WriteFIFO1:
				inc		kywr_no
				mov		a, kywr_no
				sub		a, 02h
				sz		acc
				jmp		$+2
				nop
			    MOV     A,USB_FIFO1
				JMP		WriteFIFO
WriteFIFO2:
                MOV     A,USB_FIFO2
				JMP		WriteFIFO
WriteFIFO3:
                MOV     A,USB_FIFO3
				JMP		WriteFIFO

WriteFIFO:
                MOV     FIFO_NO,A             	;FIFO NO.
                MOV     A,OFFSET FIFO_OUT1      ;set output FIFO buffer pointer
                MOV     MP0,A                   ;


WriteFIFOLoop:
                SZ      FIFO_SendLen           	;Any data to write ?
                JMP     WriteFIFOTag            ;Yes
                JMP     EndWrite                ;No
WriteFIFOTag:
                MOV     A,FIFO_NO              	;FIFO NO.
                MOV     MP1,A                   ;
				
				SET		FIFO_w_c_b
                MOV     A,R0                    ;Write data to FIFO
                MOV     R1,A                    ;
				CLR		FIFO_w_c_b				

                DEC     FIFO_SendLen           	;Getting data length++
                INC     MP0                     ;Update to next pointer
                MOV     A,USB_MISC              ;End of FIFO ?
                MOV     MP1,A                   ;
				nop
				nop
				nop
				nop
				nop
				nop
                SZ      R1.@USB_Ready           ;
                JMP     WriteFIFOLoop           ;No
WriteLen0:
EndWrite:
;----------------------------------------------------------------------------
;----BEGIN (End request)
E1ND_Request:
                MOV     A,USB_MISC
                MOV     MP1,A
                MOV     A,(01H SHL @USB_Tx) ;Change Tx state
                XORM    A,R1                ;
				nop
				nop
				nop
				nop
				nop
				nop
                CLR     R1.@USB_Req         ;End request
                RET
;----END (End request)

;----END (Write FIFO)

;----------------------------------------------------------------------------
;----BEGIN (Clear FIFO)
ClearFIFO1:
				set		r1.@USB_Clear
				clr		r1.@USB_Tx
				nop
				nop
                CLR     R1.@USB_Clear       ;Disable Clear
                CLR     R1.@USB_Req         ;End request
                RET



;                MOV     A,USB_MISC
;                MOV     MP1,A
;				mov		a,11110000b
;				and		a,r1
;                or     	A,((1 SHL @USB_Tx)+(1 SHL @USB_SelP)+(1 SHL @USB_Clear)+ (01H shl @USB_Req))
;                                            ;set Tx, Pipe & Clear state
;;				JMP		ClearFIFO
;ClearFIFO:
;                MOV     R1,A                ;
;;                JMP     END_Clear_Request
;END_Clear_Request:
;                MOV     A,USB_MISC
;                MOV     MP1,A
;                MOV     A,(01H SHL @USB_Tx) ;Change Tx state
;                XORM    A,R1                ;
;				nop
;				nop
;                CLR     R1.@USB_Clear       ;Disable Clear
;                CLR     R1.@USB_Req         ;End request
;                RET

;----END (Clear FIFO)




;----------------------------------------------------------------------------
;----BEGIN (Check setup)
;Output: Z = 0:Setup/1:None
;CheckSetup:
;                MOV     A,USB_MISC          	;MP1 point to Misc. register
;                MOV     MP1,A               	;
;                MOV     A,(01H SHL @USB_Setup)  ;Misc. Register Setup flag
;                JMP     Check

;----------------------------------------------------------------------------
;----BEGIN (Get pipe bit)
;Input : ACC pipe number
;Output: ACC pip bit (D0:pipe 0, D1:pipe 1...)
GetPipeBit:
                INC     ACC
                MOV     FIFO_TEMP,A
                MOV     A,80H
GetPipeBitLoop:
                RL      ACC
                SDZ     FIFO_TEMP 
                JMP     GetPipeBitLoop
                RET
;----END (Get pipe bit)

;----------------------------------------------------------------------------
;----BEGIN (Set Stall)
;Input : ACC = Pipe number
SetStall:
                MOV     FIFO_TEMP ,A   	;
                MOV     A,USB_STALL     ;MP1 point to Stall register (Read Only)
                MOV     MP1,A           ;
                MOV     A,FIFO_TEMP 
                OR      A,STALL        	;Set stall bit
                JMP     SetStallTag
;----END (Set Stall)


;----------------------------------------------------------------------------
;----BEGIN (Clear Stall)
;Input : ACC = Pipe number
ClearStall:
                MOV     FIFO_TEMP,A         ;
                MOV     A,USB_STALL         ;MP1 point to Stall register
                MOV     MP1,A               ;
                MOV     A,FIFO_TEMP 
                CPL     ACC                 ;Clear stall bit
                AND     A,STALL            	;
SetStallTag:
                MOV     STALL,A       		;Update Satll buffer
                MOV     R1,A            	;Update Stall register
                RET
;----END (Clear Sta

;----------------------------------------------------------------------------
;----BEGIN (Set Address)
;Input : ACC = Address
;SetAddress:
;                RL      ACC                 	;Shift address to D1
;                AND     A,0FEH              	;& save it
;                MOV     FIFO_ADDR,A       		;Move address to adress buffer
;                SZ      STD_FLAG.@RmtWakeup 	;Remote wakeup exist ?
;                SET     FIFO_ADDR.@ADDR_Wake	;Yes:Set remote wakeup flag
;                MOV     A,USB_ADDR_WAKE     	;MP1 point to Address register
;                MOV     MP1,A               	;
;                MOV     A,FIFO_ADDR        		;Write to Address Register
;                MOV     R1,A                	;
;                RET



;----- END (USB function) --------------------------------------------------


public	LEN0_Rd_Check
public	LEN0_Wr_Check
public	FIFO0_Rd_Check
;public	FIFO0_Rd_Check1
public	FIFO1_Rd_Check
public	FIFO2_Rd_Check
public	FIFO3_Rd_Check
public	FIFO0_Wr_Check
public	FIFO1_Wr_Check
public	FIFO2_Wr_Check
public	FIFO3_Wr_Check
public	ReadLen0
public	ReadFIFO0
public	ReadFIFO1
public	ReadFIFO2
public	ReadFIFO3
public	WriteLen0
public	WriteFIFO0
public	WriteFIFO1
public	WriteFIFO2
;public	ClearFIFO0
public	ClearFIFO1
;public	ClearFIFO2
;public	CheckSetup
;public	CheckPipe
public	GetPipeBit
public	SetStall
public	ClearStall
;public	SetAddress
;public	SetRemoteFun
;public	END_Request
END

⌨️ 快捷键说明

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