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

📄 keypad.asm

📁 6502bios,关于6502的sbc,有lcd,time,irq,模块
💻 ASM
字号:
; 16-way keypad support
; Chris Ward, 22/12/1999

; *** KEYSCAN: Keypad matrix scanning routine
; A,X,Y preserved
KEYSCAN	PHA
	LDA KEYTIMER
	BEQ KEYSCAN1
	DEC KEYTIMER
KEYSCAN1	LDA KEYNEW
	BEQ KEYSCAN2	;only continue if key press flag is cleared
	PLA
	RTS
KEYSCAN2	TXA
	PHA
	LDA #$EF		;init variables
	STA KEYCOL
	LDA #$04
	STA KEYCOLN
NEXTCOL	DEC KEYCOLN	;next column
	LDA KEYCOLN
	CMP #$FF
	BNE TESTCOL
	PLA		;if we get here then no key was pressed
	TAX
	PLA
	RTS
TESTCOL	LSR KEYCOL	;rotate column-test bit pattern
	LDA KEYCOL
	STA KEYPORT
	LDA KEYPORT
	AND #$F0		;select top 4 bits from port (rows)
	EOR #$F0		;invert top 4 bits
	BEQ NEXTCOL	;no keys pressed in this column
	STA KEYROW
	AND #$10		;test row 0
	BEQ KEYROW1
	LDA #$00
	JMP KEYCODE
KEYROW1	LDA KEYROW
	AND #$20		;test row 1
	BEQ KEYROW2
	LDA #$04
	JMP KEYCODE
KEYROW2	LDA KEYROW
	AND #$40		;test row 2
	BEQ KEYROW3
	LDA #$08
	JMP KEYCODE
KEYROW3	LDA #$0C		;must be row 3
KEYCODE	CLC
	ADC KEYCOLN	;scancode = (row * 4) + column
	TAX
	LDA KEYTAB,X	;convert scancode to key value
	CMP KEYVAL	;same as last key?
	BNE KEYCODE1	; no - OK
	LDX KEYTIMER	; yes - only accept if timer has run down
	BNE KEYSCANX
KEYCODE1	STA KEYVAL
	INC KEYNEW	;set 'new key available' flag
	LDA #$40		;set key repeat timer
	STA KEYTIMER
KEYSCANX	PLA
	TAX
	PLA
	RTS

KEYTAB	.byte $0C, $0B, $00, $0A	;scancode to key value table
	.byte $0D, $09, $08, $07
	.byte $0E, $06, $05, $04
	.byte $0F, $03, $02, $01

; *** WAITKEY: Wait for a keypress, don't return it
; A,X,Y preserved
WAITKEY	PHA
WAITKEY0	LDA KEYNEW
	BEQ WAITKEY0
	DEC KEYNEW
	PLA
	RTS

; *** GETKEY: Get a keypress
; output: A = key value
; X,Y preserved
GETKEY	LDA KEYNEW
	BEQ GETKEY
	DEC KEYNEW
	LDA KEYVAL
	RTS

; *** GETNUM: Get single-digit number from keypad
; input: A = max number (0-F)
; output: A = number received
; X,Y preserved
GETNUM	PHA
GETNUM0	JSR GETKEY
	PLA		;retrieve max value
	CMP KEYVAL	;entered value > max value?
	BMI GETNUM	; yes - scan again
	LDA KEYVAL	; no - return value
	RTS

; *** GETHEX: Get 2-digit hex number from keypad
; output: A = number received (00-FF)
; X,Y preserved
; uses ZTMP0
GETHEX	JSR GETKEY
	ASL A
	ASL A
	ASL A
	ASL A
	STA ZTMP0
	JSR GETKEY
	ORA ZTMP0
	RTS

⌨️ 快捷键说明

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