Agora Cart SHULTZ ELECTRONICS
58 Smokey Crest Dr. Morgantown, WV 26508 1-888-474-8589
     Home | Return Policy | About Us | Contact Us | Online Scanner | terms of service

Search:


Search by Price

Search Between:

$ &




3X4 Diode Matrix Keypad

This information is based on works by Mike Rigby-Jones. I have rewritten the code just a little to allow 
 a better understanding of code writing for the beginner. This routine proves invaluable when I/O pins are 
 in short supply. I see no reason why this same technique of scanning cannot be used on most any
 micro. Care should be taken when using it with another micro. The PIC 16F84 has weak pullup 
 resistors allowing this program to scan as it is written. This is also compatible with the 16F628.
This code may need some work. This is a piece of code from a larger project.
As with any code from the internet, test it completely before using!!!!
We provide this code as an example.
It is written so it is obvious to see the flow of the code.
***** CODE BEGINS CUT HERE *****
 

Filename: Keypdex.asm
Date:        11-28-02
File Version:1.1

Author:  N8HKI
Company: Shultz Electronics

Files Required:  p16f628.inc


	LIST      P=16F84             ; LIST DIRECTIVE TO DEFINE PROCESSOR
	#INCLUDE <P16F84.INC>         ; PROCESSOR SPECIFIC VARIABLE DEFINITIONS

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

 ; '__CONFIG' DIRECTIVE IS USED TO EMBED CONFIGURATION DATA WITHIN .ASM FILE.
 ; THE LABLES FOLLOWING THE DIRECTIVE ARE LOCATED IN THE RESPECTIVE .INC FILE.
 ; SEE RESPECTIVE DATA SHEET FOR ADDITIONAL INFORMATION ON CONFIGURATION WORD.


;***** VARIABLE DEFINITIONS
W_TEMP       	EQU     0X0C        ; VARIABLE USED FOR CONTEXT SAVING 
STATUS_TEMP   	EQU     0X0D        ; VARIABLE USED FOR CONTEXT SAVING
KEY		EQU	0X0E    ;You may find variables that are not in use!!!!!
CODENO		EQU	0X11
DIGONE		EQU	0X12
DIGTWO		EQU	0X13
DIGTHREE	EQU	0X14
DIGFOUR		EQU	0X15
KEYNO		EQU	0X16
SHIFT		EQU	0X17
COUNT		EQU	0X18
CNTA		EQU	0X19
CNTB		EQU	0X1A
PINONE		EQU	0X1B
PINTWO		EQU	0X1C
PINTHREE	EQU	0X1D
PINFOUR		EQU	0X1E


;**********************************************************************
		ORG     0X000             ; PROCESSOR RESET VECTOR
  		GOTO    SETUP             ; GO TO BEGINNING OF PROGRAM


		ORG     0X004             ; INTERRUPT VECTOR LOCATION
		MOVWF   W_TEMP            ; SAVE OFF CURRENT W REGISTER CONTENTS
		MOVF	STATUS,W          ; MOVE STATUS REGISTER INTO W REGISTER
		MOVWF	STATUS_TEMP       ; SAVE OFF CONTENTS OF STATUS REGISTER


; ISR CODE CAN GO HERE OR BE LOCATED AS A CALL SUBROUTINE ELSEWHERE


		MOVF    STATUS_TEMP,W     ; RETRIEVE COPY OF STATUS REGISTER
		MOVWF	STATUS            ; RESTORE PRE-ISR STATUS REGISTER CONTENTS
		SWAPF   W_TEMP,F
		SWAPF   W_TEMP,W          ; RESTORE PRE-ISR W REGISTER CONTENTS
		RETFIE                    ; RETURN FROM INTERRUPT

SETUP
		CLRF	PORTA
		CLRF	PORTB
		MOVLW	B'00000000'
		TRIS	PORTB		
		MOVLW	B'11111111'
		TRIS	PORTA
		MOVLW	0X00
		MOVWF	COUNT
		CALL	DELAY
		BSF	PORTB,7 ;PIEZO BEEPER ON AND OFF
		CALL	DELAY
		BCF	PORTB,7
		CALL	DELAY
		BSF	PORTB,7
		CALL	DELAY
		BCF	PORTB,7
		CALL	DELAY
		MOVLW	D'1'  ;SET FIRST DIG. OF CODE HERE PUNCH IN 1,2,3,4 TO GET GOODCHECK
		MOVWF	PINONE
		MOVLW	D'2'  ;SET SECOND DIG.
		MOVWF	PINTWO
		MOVLW	D'3'  ;SET THIRD DIG
		MOVWF	PINTHREE
		MOVLW	D'4'  ;SET FOURTH DIG
		MOVWF	PINFOUR
		GOTO	MAIN

TABLEONE	ADDWF	PCL,F
		RETLW	0XFF ;FAKE SHOULD NEVER GET HERE!!!
		RETLW	0X0B
		RETLW	0X0A
		RETLW	0X00
		

TABLETWO	ADDWF	PCL,F
		RETLW	0X08
		RETLW	0XFF ;FAKE SHOULD NEVER GET HERE!!!
		RETLW	0X07
		RETLW	0X09
		

TABLETHREE	ADDWF	PCL,F
		RETLW	0X05
		RETLW	0X06
		RETLW	0XFF ;FAKE SHOULD NEVER GET HERE!!!
		RETLW	0X04
		

TABLEFOUR	ADDWF	PCL,F
		RETLW	0X02
		RETLW	0X03
		RETLW	0X01

VERIFY
		MOVF	DIGONE,W
		SUBWF	PINONE,W
		BTFSS	STATUS,Z
		GOTO	CHECKBAD
		MOVF	DIGTWO,W
		SUBWF	PINTWO,W
		BTFSS	STATUS,Z
		GOTO	CHECKBAD
		MOVF	DIGTHREE,W
		SUBWF	PINTHREE,W
		BTFSS	STATUS,Z
		GOTO	CHECKBAD
		MOVF	DIGFOUR,W
		SUBWF	PINFOUR,W
		BTFSS	STATUS,Z
		GOTO	CHECKBAD
		GOTO	GOODCHECK

MAIN
		;PLACE CODE TO DO OTHER THINGS HERE!
		GOTO	SCAN

SCAN
		                     
		MOVLW	B'00100000' ;SCAN BUTTON ROW1 *,0,#
		TRIS	PORTB
		MOVLW	B'11111110'
		TRIS	PORTA
		BCF	PORTA,0
		MOVF	PORTA,W
		MOVWF	KEY
		SUBLW	B'00011110'     ;TESTING TO SEE IF BUTTON HAS BEEN PRESSED IN THE ROW
		BTFSS	STATUS,Z
		GOTO	OFFONE
		GOTO	ROWTWO
OFFONE		CALL	DELAY
LOOPONE	MOVF	PORTA,W     ;THIS LOOP IS WAITING FOR THE BUTTON TO BE RELEASED
		SUBLW	B'00011110'
		BTFSS	STATUS,Z
		GOTO	LOOPONE
		CALL	CALC
		MOVF	SHIFT,W
		CALL	TABLEONE
		MOVWF	KEY
		GOTO	KEYLOAD
ROWTWO
		BSF	PORTA,0     ;SCAN BUTTON ROW2 7,8,9
		MOVLW	B'11111101'
		TRIS 	PORTA
		BCF	PORTA,1
		MOVF	PORTA,W
		MOVWF	KEY
		SUBLW	B'00011101'
		BTFSS	STATUS,Z
		GOTO	OFFTWO
		GOTO	ROWTHREE
OFFTWO		CALL	DELAY
LOOPTWO		MOVF	PORTA,W
		SUBLW	B'00011101'
		BTFSS	STATUS,Z
		GOTO	LOOPTWO
		CALL	CALC
		MOVF	SHIFT,W
		CALL	TABLETWO
		MOVWF	KEY
		GOTO	KEYLOAD
ROWTHREE
		BSF	PORTA,1     ;SCAN BUTTON ROW 4,5,6
		MOVLW	B'11111011'
		TRIS	PORTA
		BCF	PORTA,2
		MOVF	PORTA,W
		MOVWF	KEY
		SUBLW	B'00011011'
		BTFSS	STATUS,Z
		GOTO	OFFTHREE
		GOTO	ROWFOUR
OFFTHREE	CALL	DELAY
LOOPTHREE	MOVF	PORTA,W
		SUBLW	B'00011011'
		BTFSS	STATUS,Z
		GOTO	LOOPTHREE
		CALL	CALC
		MOVF	SHIFT,W
		CALL	TABLETHREE
		MOVWF	KEY
		GOTO	KEYLOAD
ROWFOUR
		BSF	PORTA,2     ;SCAN BUTTON ROW 1,2,3
		MOVLW	B'11110111'
		TRIS	PORTA
		BCF	PORTA,3
		MOVF	PORTA,W
		MOVWF	KEY
		SUBLW	B'00010111'
		BTFSS	STATUS,Z
		GOTO	OFFFOUR
		GOTO	MAIN
OFFFOUR		CALL	DELAY
LOOPFOUR	MOVF	PORTA,W    ;THIS LOOP IS WAITING FOR THE BUTTON TO BE RELEASED
		SUBLW	B'00010111'
		BTFSS	STATUS,Z
		GOTO	LOOPFOUR
		CALL	CALC
		MOVF	SHIFT,W
		CALL	TABLEFOUR
		MOVWF	KEY
		GOTO	KEYLOAD

KEYLOAD
		INCF	COUNT,1
		MOVF	COUNT,W
		SUBLW	0X01
		BTFSC	STATUS,Z
		GOTO	LOADONE
		MOVF	COUNT,W
		SUBLW	0X02
		BTFSC	STATUS,Z
		GOTO	LOADTWO
		MOVF	COUNT,W
		SUBLW	0X03
		BTFSC	STATUS,Z
		GOTO	LOADTHREE
		MOVF	COUNT,W
		SUBLW	0X04
		BTFSC	STATUS,Z
		GOTO	LOADFOUR
		GOTO	CHECKBAD
		

LOADONE
		MOVF	KEY,W
		MOVWF	DIGONE
		MOVWF	PORTB
		BSF	PORTB,7
		CALL	DELAY
		BCF	PORTB,7
		GOTO	MAIN
LOADTWO	
		MOVF	KEY,W
		MOVWF	DIGTWO
		MOVWF	PORTB
		BSF	PORTB,7
		CALL	DELAY
		BCF	PORTB,7
		GOTO	MAIN
LOADTHREE	
		MOVF	KEY,W
		MOVWF	DIGTHREE
		MOVWF	PORTB
		BSF	PORTB,7
		CALL	DELAY
		BCF	PORTB,7
		GOTO	MAIN
LOADFOUR
		MOVF	KEY,W
		MOVWF	DIGFOUR
		MOVWF	PORTB
		BSF	PORTB,7
		CALL	DELAY
		BCF	PORTB,7
		MOVLW	0X00
		MOVWF	COUNT
		GOTO	VERIFY
		
CALC
		CLRF	SHIFT
LOOP		BTFSC	KEY,0
		RETURN
		INCF	SHIFT,1
		RRF	KEY,1
		GOTO	LOOP
GOODCHECK
		BSF	PORTB,7
		CALL	DELAY
		CALL	DELAY
		CALL	DELAY
		CALL	DELAY
		BCF	PORTB,7
		GOTO	MAIN

DELAY
		MOVLW	0XFF
		MOVWF	CNTA
LOOPY		MOVLW	0XFF
		MOVWF	CNTB
DEC		DECFSZ	CNTB
		GOTO	DEC
		DECFSZ	CNTA
		GOTO	LOOPY
		RETURN

CHECKBAD
		BSF	PORTB,7
		CALL	DELAY
		CALL	DELAY
		BCF	PORTB,7
		CALL	DELAY
		CALL	DELAY
		BSF	PORTB,7
		CALL 	DELAY
		CALL	DELAY
		BCF	PORTB,7
		CALL	DELAY
		CALL	DELAY
		BSF	PORTB,7
		CALL	DELAY
		CALL	DELAY
		BCF	PORTB,7
		GOTO	MAIN

	END

Schematic of diode matrix for keypad. Diodes are 1N4148

We receive many requests to assist students and others with their code.
We do try to provide help but can only do so as time allows.
Click the "ASK A QUESTION" button above.

SHULTZ ELECTRONICS
58 Smokey Crest Dr.
Morgantown, WV 26508
PHONE: 1-888-474-8589

email: sales@shultzie.com

Featured Product

featured product

VHF Marine Band Antenna Model 1600
No ground plane design.
$ 24.95