📄 hidkb_2313.lst
字号:
0003be 2808 .DB tab,dash,sp,SH+F,l,e,kx,i,b,l,e,enter
0003bf 2d2b
0003c0 972c
0003c1 131c
0003c2 1608
0003c3 8c2c
0003c4 1617
0003c5 922c
0003c6 111a
0003c7 872c
0003c8 1704
0003c9 2c04
0003ca 0b96
0003cb 0808
0003cc 2817 .DB tab,dash,sp,SH+T,ky,p,e,s,sp,SH+i,t,s,sp,SH+O,w,n,sp,SH+d,a,t,a,sp,SH+s,h,e,e,t,enter
0003cd 2d2b
0003ce 982c
0003cf 0816
0003d0 9c2c
0003d1 1812
0003d2 2c15
0003d3 1b88
0003d4 160c
0003d5 0c17
0003d6 0a11
0003d7 182c
0003d8 2c93
0003d9 2ca4
0003da 1297
0003db 0f12
0003dc 2816
C:\AVR Projects\MAX3420E_EVKIT2_Code\HID_KB_2313_Descriptors_and_Data.inc(153): warning: .cseg .db misalignment - padding zero byte
C:\AVR Projects\MAX3420E_EVKIT2_Code\MAX3420E_EVKIT2_DemoCode.asm(54): 'C:\AVR Projects\MAX3420E_EVKIT2_Code\HID_KB_2313_Descriptors_and_Data.inc' included form here
0003dd 00ff .DB tab,dash,sp,SH+u,s,e,sp,SH+ky,o,u,r,sp,SH+e,kx,i,s,t,i,n,g,sp,u,SH+p,sp,ampersand,sp,SH+t,o,o,l,s,enter,0xFF
Message_End:
.include "MAX3420E_Macros.inc"
.MACRO SCK_LO
cbi PORTB,SCK
.ENDMACRO
.MACRO SCK_HI
sbi PORTB,SCK
.ENDMACRO
.MACRO SS_LO
cbi PORTB,SSN
.ENDMACRO
.MACRO SS_HI
sbi PORTB,SSN
.ENDMACRO
.MACRO MOSI_LO
cbi PORTB,MOSI
.ENDMACRO
.MACRO MOSI_HI
sbi PORTB,MOSI
.ENDMACRO
.MACRO WRISRAM ; WRITE IMMEDIATE to SRAM. WRISRAM addr, const
ldi r25,@1
sts @0,r25
.ENDMACRO
.MACRO TSTSRAM ; TEST a byte in SRAM, set flags. TSTSRAM addr
lds r25,@0
tst r25
.ENDMACRO
.MACRO SETFLAG ; args: @0=bit name
set ; T=1
bld flags,@0 ; T -> reg bit
.ENDMACRO
.MACRO CLRFLAG
clt
bld flags,@0
.ENDMACRO
.MACRO SKIP_ON_FLAG ; usage SKIP_ON_FLAG flagname (in flags register)
sbrs flags,@0 ; skip if this flag = 1
.ENDMACRO
.MACRO mWREG ; usage: mWREG(register,register)
ldi MAX_Reg,@0
mov MAX_Dat,@1
rcall wreg
.ENDMACRO
.MACRO WREGI ; usage: WREGI(register, immediate value)
ldi MAX_Reg,@0
ldi MAX_Dat,@1
rcall wreg
.ENDMACRO
.MACRO WREG_AS ; usage: WREG(register, data(in register))
ldi MAX_Reg,@0
mov MAX_Dat,@1
rcall wregAS
.ENDMACRO
.MACRO WREGI_AS ; usage: WREGI(register, immediate value)
ldi MAX_Reg,@0
ldi MAX_Dat,@1
rcall wregAS
.ENDMACRO
.MACRO mRREG
ldi MAX_Reg,@0
rcall rreg
.ENDMACRO
.MACRO RREG_AS
ldi MAX_Reg,@0
rcall rregAS
.ENDMACRO
.MACRO STALL_EP0
ldi MAX_Reg,rEPSTALLS
ldi MAX_Dat,0x23
rcall wreg
.ENDMACRO
.MACRO BRLTE ; Branch if op1 LTE op2. Usage: BRLTE op1, op2, branch label.
cp @1,@0
BRSH @2
.ENDMACRO
;
; AtTiny2313 PORT B bit assignments
;
.EQU MOSI = 5 ; out
.EQU MISO = 6 ; in
.EQU SCK = 7 ; out
.EQU INTR = 3 ; in
.EQU SSN = 4 ; out
;
.EQU BUTTC = 250 ; time constant to check pushbuttons
.EQU BLINKTC = 150 ; decremented every buttime
; Assign names to registers. R0-R15 for variables that are not loaded with immediate values.
.DEF configval = R0 ; Initialize to 0, set to contents of host Set_Config request
.DEF dat = R3
.DEF rval = R4
.DEF desclen = R5 ; descriptor length, read from ROM
; Registers that require load-immediate addressing
.DEF flags = R16; ; flags b7=inhibit_send, b6=RWU_enabled, b5=Suspended, b4=ep3stall
.equ Send_Flag = 7
.equ bmSend_Flag = 0b10000000 ; for eor instruction
.equ RWU_enabled = 6
.equ Suspended = 5
.equ ep3stall = 4
.equ setclrfeature = 3
.equ UNIflag = 2 ; Unicode string descriptor requested
.equ butstate = 1 ; send/stop button state
.equ keyupflag = 0 ; send keys-up after every keystroke
.DEF button_time = R17 ; Time delay for polling the pushbuttons. 0-255.
.DEF MAX_Reg = R18 ; Used by rreg and wreg
.DEF MAX_Dat = R19 ; Used by rreg and wreg
.DEF bitcount = R20 ; used by rreg & wreg
.DEF temp = R21 ; ditto
.DEF pMessage = R22 ; Message pointer
.DEF reqlen = R23 ; Requested length
.DEF blink_time = R24 ; Time between light blinks. This 8 bit timer runs 0-255
;
; R25 is reserved for SRAM macros.
; R26 is reserved for the WAIT_TICK macro (not used in this app)
; Note: R26-27=X, R28-29=Y, R30-31=Z
; This program uses only Z as an index register, so R26-R29 are free.
;
.DSEG
000060 SUD: .BYTE 8 ; 8 setup bytes
.CSEG
.ORG 0 ; Interrupt Vectors
000000 c00b rjmp RESET ; RESET
000001 9518 reti ; INT0
000002 9518 reti ; INT1
000003 9518 reti ; TIM1_CAPT
000004 9518 reti ; TIM1_COMPA
000005 9518 reti ; TIM1_OVF
000006 9518 reti ; TIM0_OVF
000007 9518 reti ; USART0_RXC
000008 9518 reti ; USART0_DRE
000009 9518 reti ; USART0_TXC
00000a 9518 reti ; ANA_COMP
00000b 9518 reti ; PCINT (8 more interrupt vectors but we aren't using them)
;
;------------------------------------------------------
RESET:
;
00000c ed0f ldi R16,LOW(RAMEND)
00000d bf0d out SPL,r16 ; set stack pointer to top of RAM
00000e 2700 clr flags ; initalze all flag bits
00000f 2400 clr configval ; we're initially unconfigured
;
000010 98c7 SCK_LO ; initialize the SPI outputs before enabling them as outputs
000011 9ac4 SS_HI
000012 98c5 MOSI_LO
000013 eb40 ldi r20,0b10110000 ; AtTiny2313: bits 7,5,4 are SPI outputs, bits 6 (MISO),3 (INT) are inputs
000014 bb47 out DDRB,r20 ; make them so
000015 e121
000016 e135
000017 d195 WREGI rPINCTL,(bmFDUPSPI+bmPOSINT+1) ; Must do this to set up SPI full duplex before accessing any regs. GPX = VBDetect
000018 d07b rcall Reset_MAX
;
; At power on, check for any button press. If so, enter a test loop that copies button states to the
; four LEDS attached to the MAX3420E GP0 pins. If not, proceed directly to the HID Keyboard application.
;
000019 e124
00001a d17e mRREG rIOPINS ; GPIN3 GPIN2 GPIN1 GPIN0 GPOUT3 GPOUT2 GPOUT1 GPOUT0
00001b 7f30 andi MAX_dat,0b11110000 ; consider only the input pins
00001c 3f30 cpi MAX_dat,0b11110000 ; all up?
00001d f049 breq doApp ; go right to the app if nothing pressed. Otherwise, drop thru to button/light test.
;
testbuts:
00001e e124
00001f d179 mRREG rIOPINS
000020 9532 swap MAX_dat
000021 e124
000022 2f33
000023 d189 mWREG rIOPINS,MAX_dat ; PB's & LEDS: 1=off, 0=on
000024 703f andi MAX_dat,0b00001111
000025 3036 cpi MAX_dat,0b00000110 ; pressing both (active low) buttons 0 & 3 stop this test
000026 f7b9 brne testbuts
;
doApp:
000027 e124
000028 e030
000029 d183 WREGI rIOPINS,0x00 ; all lights off
00002a e02f
00002b e038
00002c d180 WREGI rUSBCTL,bmCONNECT
;
Initialize:
00002d e02c
00002e e330
00002f d17d WREGI rEPIEN,(bmSUDAVIE+bmIN3BAVIE)
000030 e02e
000031 e038
000032 d17a WREGI rUSBIEN,(bmUSBRESIE) ; NOTE: The suspend interrupt is enabled when we are configured as a USB device (Set_Configuration)
000033 e120
000034 e031
000035 d177 WREGI rCPUCTL,bmIE ; enable the INT output pin
000036 e986 ldi blink_time,BLINKTC
;
000037 e060 ldi pMessage,LOW(KB_Message*2); Initialize a pointer to the message to type
000038 d139 rcall send_keystroke ; preload the first KB bytes to clear the IN3BAVIRQ
;
; ******************************************************************************
; Endless loop to check for blink timer, suspend interrupt, and any USB requests
;
mainloop:
000039 9bb3 sbis pinb,3 ; MAX3420E INT bit tied to PORTB.3 & configured for pos edge
00003a c027 rjmp L5
; Check for Setup Data Available IRQ
00003b e02b
00003c d15c mRREG rEPIRQ
00003d 2e43 mov rval,MAX_Dat
00003e fe45 sbrs rval,5 ; EPIRQ reg bit 5 is SUDAVIRQ
00003f c004 rjmp L2
000040 e02b
000041 e230
000042 d16a WREGI rEPIRQ,bmSUDAVIRQ ; clear the IRQ bit
000043 d05d rcall Do_SETUP
; Check for EP3 Buffer Available IRQ
000044 fe44 L2: sbrs rval,4 ; EPIRQ reg bit 4 is IN3BAVIRQ
000045 c001 rjmp L3
000046 d12b rcall send_keystroke
; Check for USB reset IRQ
000047 e02d
000048 d150 L3: mRREG rUSBIRQ
000049 2e43 mov rval,MAX_Dat
00004a fe43 sbrs rval,3 ; USBIRQ reg bit 3 is URESIRQ
00004b c011 rjmp L4
00004c e02d
00004d e038
00004e d15e WREGI rUSBIRQ,bmUSBRESIRQ ; clear the IRQ bit
00004f e124
000050 e032
000051 d15b WREGI rIOPINS,0x02 ; L1 on
000052 e02d ldi MAX_Reg,rUSBIRQ
000053 d145 LR1:rcall rreg
000054 7830 andi MAX_Dat,bmUSBRESDNIRQ ; check for reset done
000055 f3e9 breq LR1
000056 e02d
000057 e830
000058 d154 WREGI rUSBIRQ,bmUSBRESDNIRQ ; clear the IRQ
000059 e124
00005a e030
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -