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

📄 keypad.asm

📁 AT89C51开发例程 protues仿真 keil编程
💻 ASM
字号:
NAME    KEYPAD

?PR?input?KEYPAD               SEGMENT CODE
	PUBLIC input
	PUBLIC init
?DT?input?KEYPAD               SEGMENT DATA

RSEG  ?DT?input?KEYPAD
KEY_ROW0	equ	0F7h
KEY_ROW1	equ	0EFh
KEY_ROW2	equ	0DFh
KEY_ROW3	equ	0BFh
KEY_ROW4	equ	07Fh


keyflags:	ds	20

RSEG  ?PR?input?KEYPAD
init:
	ANL TMOD,#0F0H
	ORL TMOD,#01H
	MOV TH0,#0FFH
	MOV TL0,#0FFH
	SETB EA
	SETB ET0
	SETB TR0
	RET

input:

keyscan:
		push DPH
		push DPL
		
		mov R0,#keyflags 		; R0 addresses the key toggle bytes
		mov R1,#KEY_ROW0		; R1 address the keyboard row address
		mov R2,#5			; R2 counts rows
ksrow:
		mov P3,R1			; Set row address to port P3
		nop
		mov A,P1			; Read column data from port P1
		mov R3,#4			; R3 counts keys per row
		anl A,#3Fh
ks0:		rrc A				; Move next bit into carry
		mov R4,A			; R4 preserves the row data
		jc ks1				; Jump if key not pressed
		mov A,@R0			; Test if key already pressed
		mov @R0,#1			; Flag pressed anyway
		jz ksnew			; Jump if key newly pressed
		jmp ks2
ks1:
		mov @R0,#0			; Flag key as not pressed
ks2:
		inc R0				; Loop for next key in this row
		mov A,R4
		djnz R3,ks0

		mov A,R1			; Jiggle R1 to address next row
		rl A 
		mov R1,A
		djnz R2,ksrow

		clr A				
		mov R7,A			; Return zero - no (new) key press.	
		jmp ksend

						
ksnew:		mov DPTR,#keycodes		; We've found a new key since last time:
		mov A,R0			; The key flag address (ordinal) is in R0
		clr C
		subb A,#keyflags
		movc A,@A+DPTR
		mov R7,A			;返回值放入R7.
ksend:		mov P3,#0FFh
		pop DPL
		pop DPH
		ret

;Data tables for returned row bits
keycodes:
		db  'S',09h,08h,07h
		db 	07h,08h,09h, '/'
		db	04h,05h,06h, '*'
		db	01h,02h,03h, '-'
		db	'C','0','=', '+'


		END

⌨️ 快捷键说明

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