; KEYPAD.ASM
; READ A KEYPAD CONNECTED TO THE DIGITAL I/O

	ORG	8000H		;MUST ALWAYS BE ORG'ED AT 8000H FOR SBC-1
	CLR	C		;(C3 HEX) NEEDED FOR SBC-1 MACHINE CODE
REPEAT:	CALL	KEYPAD		;SEE IF KEYPAD HAS BEEN USED
	JZ	REPEAT		;NO KEY PRESSED, KEEP LOOKING
	PUSH	ACC		;SAVE KEY PRESSED
	CALL	TXHEX		;DISPLAY ACCUMULATOR AS 2 HEX DIGITS
	MOV	A,#' '		;SPACE
	CALL	3CH		;DISPLAY CHARACTER ROUTINE IN JUMP TABLE
	POP	ACC		;RESTORE KEY PRESSED
	CALL	3CH		;DISPLAY CHARACTER ROUTINE IN JUMP TABLE
	CALL	42H		;SEND CR/LF ROUTINE IN JUMP TABLE
	JMP	REPEAT



; READ A 4 BY 4 SWITCH MATRIX KEYPAD
; ASCII VALUE OF CHARACTER PRESSED IS RETURNED IN ACCUMULATOR
; USES ACC AND B

; ROW 1 IS I/O #5 AS OUTPUT --- 1 2 3 A
; ROW 2 IS I/O #6 AS OUTPUT --- 4 5 6 B
; ROW 3 IS I/O #7 AS OUTPUT --- 7 8 9 C
; ROW 4 IS I/O #8 AS OUTPUT --- * 0 # D
;                               | | | |
; COL 1 IS I/O #4 AS INPUT -----+ | | |
; COL 2 IS I/O #3 AS INPUT -------+ | |
; COL 3 IS I/O #2 AS INPUT ---------+ |
; COL 4 IS I/O #1 AS INPUT -----------+

KEYPAD:
KP10:	MOV	24H,#10H	;OUTPUTS 1-8 IN INTERNAL RAM SYSTEM AREA, 5 ON
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,#10		;NUMBER OF MILLISECONDS TO DELAY
	CALL	45H		;DELAY IN MILLISECONDS ROUTINE IN JUMP TABLE
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,21H		;GET INPUTS 1-8, IN INTERNAL RAM SYSTEM AREA

KP11:	MOV	B,A		;SAVE ACCUMULATOR
	ANL	A,#08H		;LOOK ONLY AT 1 BIT
	JNZ	KP12		;BIT STILL HIGH
	MOV	A,#49		;"1" KEY PRESSED
	RET

KP12:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#04H		;LOOK ONLY AT 1 BIT
	JNZ	KP13		;BIT STILL HIGH
	MOV	A,#50		;"2" KEY PRESSED
	RET

KP13:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#02H		;LOOK ONLY AT 1 BIT
	JNZ	KP14		;BIT STILL HIGH
	MOV	A,#51		;"3" KEY PRESSED
	RET

KP14:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#01H		;LOOK ONLY AT 1 BIT
	JNZ	KP20		;BIT STILL HIGH
	MOV	A,#65		;"A" KEY PRESSED
	RET

KP20:	MOV	24H,#20H	;OUTPUTS 1-8 IN INTERNAL RAM SYSTEM AREA, 6 ON
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,#10		;NUMBER OF MILLISECONDS TO DELAY
	CALL	45H		;DELAY IN MILLISECONDS ROUTINE IN JUMP TABLE
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,21H		;GET INPUTS 1-8, IN INTERNAL RAM SYSTEM AREA

KP21:	MOV	B,A		;SAVE ACCUMULATOR
	ANL	A,#08H		;LOOK ONLY AT 1 BIT
	JNZ	KP22		;BIT STILL HIGH
	MOV	A,#52		;"4" KEY PRESSED
	RET

KP22:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#04H		;LOOK ONLY AT 1 BIT
	JNZ	KP23		;BIT STILL HIGH
	MOV	A,#53		;"5" KEY PRESSED
	RET

KP23:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#02H		;LOOK ONLY AT 1 BIT
	JNZ	KP24		;BIT STILL HIGH
	MOV	A,#54		;"6" KEY PRESSED
	RET

KP24:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#01H		;LOOK ONLY AT 1 BIT
	JNZ	KP30		;BIT STILL HIGH
	MOV	A,#66		;"B" KEY PRESSED
	RET

KP30:	MOV	24H,#40H	;OUTPUTS 1-8 IN INTERNAL RAM SYSTEM AREA, 7 ON
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,#10		;NUMBER OF MILLISECONDS TO DELAY
	CALL	45H		;DELAY IN MILLISECONDS ROUTINE IN JUMP TABLE
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,21H		;GET INPUTS 1-8, IN INTERNAL RAM SYSTEM AREA

KP31:	MOV	B,A		;SAVE ACCUMULATOR
	ANL	A,#08H		;LOOK ONLY AT 1 BIT
	JNZ	KP32		;BIT STILL HIGH
	MOV	A,#55		;"7" KEY PRESSED
	RET

KP32:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#04H		;LOOK ONLY AT 1 BIT
	JNZ	KP33		;BIT STILL HIGH
	MOV	A,#56		;"8" KEY PRESSED
	RET

KP33:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#02H		;LOOK ONLY AT 1 BIT
	JNZ	KP34		;BIT STILL HIGH
	MOV	A,#57		;"9" KEY PRESSED
	RET

KP34:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#01H		;LOOK ONLY AT 1 BIT
	JNZ	KP40		;BIT STILL HIGH
	MOV	A,#67		;"C" KEY PRESSED
	RET

KP40:	MOV	24H,#80H	;OUTPUTS 1-8 IN INTERNAL RAM SYSTEM AREA, 8 ON
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,#10		;NUMBER OF MILLISECONDS TO DELAY
	CALL	45H		;DELAY IN MILLISECONDS ROUTINE IN JUMP TABLE
	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE, ACTIVATES BITS
	MOV	A,21H		;GET INPUTS 1-8, IN INTERNAL RAM SYSTEM AREA

KP41:	MOV	B,A		;SAVE ACCUMULATOR
	ANL	A,#08H		;LOOK ONLY AT 1 BIT
	JNZ	KP42		;BIT STILL HIGH
	MOV	A,#42		;"*" KEY PRESSED
	RET

KP42:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#04H		;LOOK ONLY AT 1 BIT
	JNZ	KP43		;BIT STILL HIGH
	MOV	A,#48		;"0" KEY PRESSED
	RET

KP43:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#02H		;LOOK ONLY AT 1 BIT
	JNZ	KP44		;BIT STILL HIGH
	MOV	A,#35		;"#" KEY PRESSED
	RET

KP44:	MOV	A,B		;RESTORE ACCUMULATOR
	ANL	A,#01H		;LOOK ONLY AT 1 BIT
	JNZ	KPX		;BIT STILL HIGH
	MOV	A,#68		;"D" KEY PRESSED
	RET

KPX:	MOV	A,#0
	RET




; SEND HEX VALUE IN ACC OUT THE SERIAL PORT AS 2 ASCII DIGITS

TXHEX:	PUSH	ACC		;SAVE VALUE
	SWAP	A		;SWAP NIBBLES
	CALL	HTOA		;CONVERT LOWER NIBBLE TO A HEX CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	ACC		;RESTORE VALUE
	PUSH	ACC		;SAVE IT AGAIN
	CALL	HTOA		;CONVERT LOWER NIBBLE TO A HEX CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	ACC		;SO THIS ROUTINE PRESERVES IT
	RET

; CONVERT HEX VALUE IN ACC TO ASCII CHARACTER IN ACC
; REMOVES ANY BITS ABOVE THE LOWER NIBBLE

HTOA:	ANL	A,#0FH
	MOV	DPTR,#HTOATBL
	MOVC	A,@A+DPTR
	RET

HTOATBL:	DB	'0123456789ABCDEF',0


	END

