|
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
|
|
|