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

📄 offickbd.asm

📁 以台湾CHESEN公司的CSC0108实现多媒体USB键盘的功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        DB      <SET_REPORT             ;;9
        DB      <SET_IDLE               ;;10
        DB      <SET_PROTOCOL           ;;11
CLASS_REQ_TABLE_END:

CLASS_REQ_TABLE1:
        DB      >NO_SUPPORT_REQ         ;;
        DB      >GET_REPORT             ;;1
        DB      >GET_IDLE               ;;2
        DB      >GET_PROTOCOL           ;;3
        DB      >NO_SUPPORT_REQ         ;;
        DB      >NO_SUPPORT_REQ         ;;
        DB      >NO_SUPPORT_REQ         ;;
        DB      >NO_SUPPORT_REQ         ;;
        DB      >NO_SUPPORT_REQ         ;;
        DB      >SET_REPORT             ;;9
        DB      >SET_IDLE               ;;10
        DB      >SET_PROTOCOL           ;;11

DEVICE_CLASS_REQUEST:                   ;;command is class command
        LDA     bReq
        CMP     #CLASS_REQ_TABLE_END-CLASS_REQ_TABLE_START
        BCC     $+4
        LDA     #0
;$+4:
        TAX
        ORA     #10H                    ;;class command
        STA     REQUEST_BUF
        LDA     CLASS_REQ_TABLE,X
        STA     TABLE_ADDR0
        LDA     CLASS_REQ_TABLE1,X
        STA     TABLE_ADDR1
        JMP     (TABLE_ADDR)
;---------------------------------------
GET_REPORT:
        LDA     wIndex
        BEQ     Interface0
        CMP     #01                     ;;interface 1
        BEQ     Interface1
        BRA     NO_SUPPORT_REQ

Interface0:
        LDX     #8
        BRA     AA
Interface1:
        LDX     #4
AA:
        STZ     TXDAT0
        DEX
        BNE     AA
        BRA     VALIDATE_BUFFER
;---------------------------------------
GET_IDLE:
        LDA     wIndex
Get_Interface0_Idle:
        CMP     #0
        BNE     Get_Interface1_Idle
        LDA     EP1_IDLE_RATE           ;;EP1 idle rate
        STA     TXDAT0
        JMP     VALIDATE_BUFFER         ;;validated buffer
Get_Interface1_Idle:
        CMP     #1
        BEQ     $+5
        JMP     NO_SUPPORT_REQ
;$+5:
        LDA     EP2_IDLE_RATE           ;;EP2 idle rate
        STA     TXDAT0
        JMP     VALIDATE_BUFFER         ;;validated buffer
;---------------------------------------
GET_PROTOCOL:
        LDA     wIndex
Get_Interface0_Protocol:
        CMP     #0
        BNE     Get_Interface1_Protocol
        LDA     PROTOCOL0
        STA     TXDAT0
        JMP     VALIDATE_BUFFER
Get_Interface1_Protocol:
        CMP     #1
        BEQ     $+5
        JMP     NO_SUPPORT_REQ
;$-5:
        LDA     PROTOCOL1
        STA     TXDAT0
        JMP     VALIDATE_BUFFER
;---------------------------------------
SET_REPORT:
End_SET_Report:
        RTS
;---------------------------------------
SET_IDLE:
        LDA     wIndex
Set_Interface0_Idle:
        CMP     #0
        BNE     Set_Interface1_Idle
        LDA     wValue+1
        STA     EP1_IDLE_RATE
        STZ     EP1_IDLE_TIME
        JMP     VALIDATE_BUFFER         ;;validated buffer
Set_Interface1_Idle:
        CMP     #1
        BEQ     $+5
        JMP     NO_SUPPORT_REQ
;$+5:
        LDA     wValue+1
        STA     EP2_IDLE_RATE
        STZ     EP2_IDLE_TIME
        JMP     VALIDATE_BUFFER         ;;validated buffer
;---------------------------------------
SET_PROTOCOL:
        LDA     wIndex
Set_Interface0_Protocol:
        CMP     #0
        BNE     Set_Interface1_Protocol
        LDA     wValue
        STA     PROTOCOL0
        JMP     VALIDATE_BUFFER
Set_Interface1_Protocol:
        CMP     #1
        BEQ     $+5
        JMP     NO_SUPPORT_REQ
;$-5:
        LDA     wValue
        STA     PROTOCOL1
        JMP     VALIDATE_BUFFER
;;----------------------------------------------------------------------------
ENDPOINT0_IN:                           ;;ENDPOINT0 in
        BBS0    TXFLG0,END_EP0_TOKEN
        SMB0    IRQCLRU
        LDA     bReq
        CMP     #REQ_SET_ADDRESS
        BEQ     USB_SET_ADDRESS
        CMP     #REQ_GET_DESCRIP
        BNE     END_EP0_TOKEN
        STZ     TXCNT0                  ;;clear count register
        JMP     SEND_DESCRIPTOR1

USB_SET_ADDRESS:
        LDA     DEV_ADR
        STA     DA
        STZ     bReq                    ;;end data transmit
END_EP0_TOKEN:
        RTS
;---------------------------------------
END_EP0_TOKEN1:
        STZ     RXFLG0                  ;;clear full flag
        RTS

ENDPOINT0_OUT:                          ;;ENDPOINT0 out
        LDA     REQUEST_BUF
        CMP     #REQ_SET_REPORT
        BNE     END_EP0_TOKEN1          ;;only SET_REPORT is valid,other ack only
        LDY     RXCNT0                  ;;count register
        LDX     #0
EP0_OUT1:
        LDA     RXDAT0
        STA     BUFFER,X
        INX
        DEY
        BNE     EP0_OUT1

        LDA     BUFFER                  ;;?change LED
        CLC                             ;;?
        
        BBR2    BUFFER,$+4              ;;?
        
        SEC                             ;;?

;$+4:                                   ;;?
        
	ROL     A                       ;;?
        
	AND     #00000111B              ;;?
        
	EOR     #00000111B              ;;?
                
	STA     LED                     ;;?
        
	STA     LED_REG                 ;;?

	LDA	MM_LED_FLAGS		;;MM_LED
	CMP	#FFH
	BNE	MMLED_APP_OVER1
	RMB3	LED
	JMP	OK_MMLED_LAMP1
MMLED_APP_OVER1:
	SMB3	LED
OK_MMLED_LAMP1:

        STZ     REQUEST_BUF
        STZ     RXFLG0                  ;;clear full flag
        JMP     VALIDATE_BUFFER

;---------------------------------------
ENDPOINT1_IN:                           ;;ENDPOINT1 in
        BBS0    TXFLG1,EP1_IN_RET
        SMB2    IRQCLRU
        BRA     EP1_IN_RET


OUT_EP1_DATA:
        STZ     EP1_IDLE_TIME           ;;clear idle time
        LDA     TXFLG1
        ORA     #00000001B
        EOR     #00000100B              ;;validated buffer
        STA     TXFLG1

EP1_IN_RET:
        RTS

;---------------------------------------
ENDPOINT2_IN:                           ;;ENDPOINT2 in
        BBS0    TXFLG2,EP2_IN_RET
        SMB3    IRQCLRU
        BRA	EP2_IN_RET
        BBR6    DEV_STATUS,EP2_IN_RET   ;;device be configured
        ;STZ     TXCNT2                  ;;clear count register
        ;STZ     TXDAT2                  ;;?
        ;STZ     TXDAT2                  ;;?
        ;STZ     TXDAT2                  ;;?
        ;STZ     TXDAT2                  ;;?
OUT_EP2_DATA:
        STZ     EP2_IDLE_TIME           ;;clear idle time
        LDA     TXFLG2
        ORA     #00000001B
        EOR     #00000100B              ;;validated buffer
        STA     TXFLG2
        
EP2_IN_RET:
        RTS
;;----------------------------------------------------------------------------
Given_Time:
        LDA     EP1_IDLE_RATE           ;;?idle rate = 0
        BEQ     End_EP1_Given_time      ;;?
        
        LDA     EP1_IDLE_TIME           ;;?idle rate > 0
        CMP     EP1_IDLE_RATE           ;;?
        
        BCC     End_EP1_Given_time      ;;?
        
        STZ     EP1_IDLE_TIME           ;;?
        
        BBS0    TXFLG1,End_EP1_Given_time;;
        SMB2    IRQCLRU                 ;;?
        
	STZ     TXCNT1                  ;;clear count register
        STZ     TXDAT1                  ;;?        
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        STZ     TXDAT1                  ;;?
        JSR     OUT_EP1_DATA            ;;?

End_EP1_Given_time:
        LDA     EP2_IDLE_RATE           ;;?idle rate = 0
        BEQ     End_EP2_Given_time      ;;?
        
        LDA     EP2_IDLE_TIME           ;;?idle rate > 0
        CMP     EP2_IDLE_RATE           ;;?
        
        BCC     End_EP2_Given_time      ;;?
        
        STZ     EP2_IDLE_TIME           ;;?
        
        BBS0    TXFLG2,End_EP2_Given_time;;
        SMB3    IRQCLRU                 ;;?
        STZ     TXCNT2                  ;;clear count register
        STZ     TXDAT2                  ;;?
        STZ     TXDAT2                  ;;?
        STZ     TXDAT2                  ;;?
        STZ     TXDAT2                  ;;?
        JSR     OUT_EP2_DATA            ;;?

End_EP2_Given_time:
        RTS
;;----------------------------------------------------------------------------
Delay_500ms:                            ;;delay 500ms
        LDX     #40
Decrease_X:
        TXA
        PHA
        JSR     Delay
        PLA
        TAX
        DEX
        BNE     Decrease_X
        RTS
;-----------------------------------------------------------------------------
Delay:                                  ;;delay 12.5ms
        LDX     #28
Delay_loop2:
        LDY     #0
Delay_loop1:
        DEY
        BNE     Delay_loop1
        LDA     #01010101B
        STA     CLRWDT
        DEX
        BNE     Delay_loop2
        RTS
;-----------------------------------------------------------------------------
Delay_5ms:                              ;;delay 5ms
        TXA
        PHA
        LDX     #50
Decrease_X_ms:
        JSR     Delay_100us
        DEX
        BNE     Decrease_X_ms
        PLA
        TAX
        RTS
;-----------------------------------------------------------------------------
Delay_100us:                            ;;delay 100us
        TXA
        PHA
        LDX     #52
;-----------------------------------------------------------------------------
Decrease_X_us:
        DEX
        BNE     Decrease_X_us
        PLA
        TAX
        RTS
;;---------------------------------------------------------------------------
Delay_10us:                            ;;delay 100us
	PHA
        TXA
        PHA
        LDX     #5
;-----------------------------------------------------------------------------
Decrease_X_us5:
        DEX
        BNE     Decrease_X_us5
        PLA
        TAX
        PLA
        RTS
        
NMI_vector:
        RTI
;----------------------------------------------------------------------------
IRQ_vector:                             ;;IRQ start location
        BBR6    TCON,Normal_IRQ_vector
      ;  JMP     Test_Mode_IRQ_vector
Normal_IRQ_vector:
        PHA
        TXA
        PHA

INT0_Int:        
        BBR1    IRQFUNC,INT1_Int
        SMB1    IRQCLRF                 ;;clear INT0 interrupt flag
        BBR1    IE_FUNC,INT1_Int
        BRA     End_IRQ_vector
;---------------------------------------
INT1_Int:
        BBR2    IRQFUNC,TMR_Int
        SMB2    IRQCLRF                 ;;clear INT1 interrupt flag
        BBR2    IE_FUNC,TMR_Int
        BRA     End_IRQ_vector
;---------------------------------------
TMR_Int:
        BBR0    IRQFUNC,KBD_Int
        SMB0    IRQCLRF                 ;;clear TMR interrupt flag
        LDA     #01010101B              ;;?clear watch dog
        STA     CLRWDT                  ;;?

End_IRQ_vector:
        PLA
        TAX
        PLA
        RTI
;---------------------------------------
KBD_Int:
        BBR3    IRQFUNC,P2_Int
        SMB3    IRQCLRF                 ;;clear KBD interrupt flag
        INC     EP1_IDLE_TIME
        INC     EP2_IDLE_TIME
        JSR	KeyScan
        LDA	TIMER_COUNT
        CMP	#00H
        BEQ	NON_SUB_0
        DEC	TIMER_COUNT
NON_SUB_0:
        BRA     End_IRQ_vector
;---------------------------------------
P2_Int:
        BBR4    IRQFUNC,End_IRQ_vector
        SMB4    IRQCLRF                 ;;clear PORT2 interrupt flag
        BRA     End_IRQ_vector
;---------------------------------------

;=================================================================================
;This is the main entry point for the start of key scanning
;=================================================================================
KeyScan:
	JSR	KSC_DEBOUNCE_TASK		;task for debounce处理弹跳任务
	STZ	KSC_PHANTOM			;init phantom key flag to false
	STZ	KSC_COL_HITS			;
	STZ	KSC_ROW_HITS
	STZ	KSC_CHANGES
	STZ	KSC_KEY_COUNT
	STZ	KSC_X_INDEX
	LDA	#FFH
	STA	PORT2
	LDX	#0				;18 column总共18行
	JSR	KSC_STARTSCAN			;write init scan pattern 
			
COLUMN_LOOP:					;scan key and process key
	LDA	PORT2
	EOR	#FFH				;~A
	STA	KSC_MOD1			;save port2 data to tempram
	BEQ	NOKEYDOWN    
	
	PHA	
	JSR	COUNT_ONES			;计算这行共有几个1
	CLC
	ADC	KSC_KEY_COUNT			;计算按键中总共有几个1
	STA	KSC_KEY_COUNT
	PLA
	ORA	KSC_ROW_HITS			;
	STA	KSC_ROW_HITS			;save keycode
	INC	KSC_COL_HITS			;and count of columns with a key down
	
NOKEYDOWN:
	LDA	KSC_CHANGES
	CMP	#00H
	BNE	KEY_HAS_CHANGED	
	LDA	KSC_IMAGE,X
	EOR	KSC_MOD1
	STA	KSC_CHANGES
	CMP	#00H
	BNE	KEY_HAS_CHANGED
	INC	KSC_X_INDEX
KEY_HAS_CHANGED:
	JSR	KSC_NEXTPATTERN
	INX
	CPX	#21	
	BNE	COLUMN_LOOP	
	LDA	KSC_CHANGES
	CMP	#00H
	BEQ	EXIT1
	JSR	CHECK_PHANTOM
	BCC	EXIT12
	
	LDX	KSC_X_INDEX	
	JSR	KSC_KEYCHANGED		;;KSC_KEYCHANGED(X)////X-->LAST KEY COLUMN NUMBER
	SEC
	JMP	EXIT1
EXIT12:
	LDA	#AAH			;;ERROR CODE
	STA	USB_TX_FLAGS
EXIT1:
	
	RTS
		
	
;=======================================================
;INITIALIZE ALL COLUMN TO BEGIN A KEYBOARD SCAN
;	0 IN C[0]
;	1 IN C[17:1]
;=======================================================
KSC_STARTSCAN:
	PHA	
	LDA	#0FEH
	STA	PORT0
	STA	KSC_P0OUT
	
	LDA	#0FFH
	STA	PORT1
	STA	KSC_P1OUT
	
	LDA	#0FFH
	STA	PORT3

⌨️ 快捷键说明

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