;*****************KEYPAD*****************
; by: Eng'r Roland Michael A. dela Peņa *
;****************************************
LIST P=16F84
ERRORLEVEL -302
#INCLUDE P16F84.INC
;************************************************************
; REGISTER DEFINITIONS
;************************************************************
CBLOCK 0CH
ROLAND ; VARIABLE REGISTER
VALUE ; DATA KEYPAD REGISTER
ENDC
;************************************************************
; BIT DEFINITIONS
;************************************************************
#DEFINE COL1 PORTB,1 ; KEYPAD'S COLUMN 1
#DEFINE COL2 PORTB,2 ; KEYPAD'S COLUMN 2
#DEFINE COL3 PORTB,3 ; KEYPAD'S COLUMN 3
#DEFINE ROW1 PORTB,4 ; KEYPAD'S ROW 1
#DEFINE ROW2 PORTB,5 ; KEYPAD'S ROW 2
#DEFINE ROW3 PORTB,6 ; KEYPAD'S ROW 3
#DEFINE ROW4 PORTB,7 ; KEYPAD'S ROW 4
;************************************************************************
; THIS PART INITIALIZES THE PORTS AND OTHER PHERIPERALS
; IN MICROCONTROLLER
;************************************************************************
ORG 0000h ; SET POWER ON RESET VECTOR.
CLRF PORTB
CLRF PORTA
GOTO INIT
INIT
BSF STATUS,RP0 ; SET BANK = 1.
BCF OPTION_REG,7 ; ENABLE BUILT-IN PULL-UP RESISTORS.
MOVLW b'00000000' ; SET PORTA TO ALL OUTPUT.
MOVWF TRISA
MOVLW b'00001110' ; SET RB0,RB4,RB5,RB6,RB7 TO OUTPUT
MOVWF TRISA ; AND RB1,RB2,RB3 TO INPUT.
BCF STATUS,RP0 ; SET BANK = 0.
;************************************************************************
; THIS SUBROUTINE MONITORS THE CONDITION OF THE KEYPAD
; THE DATA AQUIRED FROM THE KEYPAD WILL BE STORED IN "VALUE" REGISTER
;************************************************************************
MONITOR
CALL SCAN ; GET DATA FROM THE KEYPAD.
MOVF ROLAND
BTFSC STATUS,2 ; IS ANY BUTTON PRESSED?
GOTO MONITOR ; NO.
MOVFW ROLAND ; YES.
MOVWF VALUE ; THEN STORE IT ON VALUE REGISTER.
UNPRESS
CALL SCAN
MOVF ROLAND ; THEN WAIT UNTIL THIS BUTTON WAS UNPRESSED.
BTFSC STATUS,2 ; IS THIS BUTTON UNPRESSED?
GOTO UNPRESS ; NOPE.
RETLW d'0' ; YES.
;************************************************************************
; THIS PART SCANS EACH COLUMN OF THE KEYPAD
; (IT DETERMINES WHAT BUTTON OF THE KEYPAD WAS PRESSED)
;************************************************************************
SCAN
CLRF ROLAND
BCF COL1 ; SCAN COLUMN 1 OF THE KEYPAD.
BTFSS ROW1 ; IS ROW 1 CHANGED?
GOTO NO1 ; YO, THEN THE KEY 1 PRESSED.
BCF COL1 ; NOPE.
BTFSS ROW2 ; IS ROW 2 CHANGED?
GOTO NO4 ; YO, THEN THE KEY 4 PRESSED.
BCF COL1 ; NOPE.
BTFSS ROW3 ; IS ROW 3 CHANGED?
GOTO NO7 ; YO, THEN THE KEY 7 PRESSED.
BCF COL1 ; NOPE.
BTFSS ROW4 ; IS ROW 4 CHANGED?
GOTO NO11 ; YO, THEN THE KEY * PRESSED.
BCF COL2 ; SCAN COLUMN 2 OF THE KEYPAD.
BTFSS ROW1 ; IS ROW 1 CHANGED?
GOTO NO2 ; YO, THEN THE KEY 2 PRESSED.
BCF COL2 ; NOPE.
BTFSS ROW2 ; IS ROW 2 CHANGED?
GOTO NO5 ; YO, THEN THE KEY 5 PRESSED.
BCF COL2 ; NOPE.
BTFSS ROW3 ; IS ROW 3 CHANGED?
GOTO NO8 ; YO, THEN THE KEY 8 PRESSED.
BCF COL2 ; NOPE.
BTFSS ROW4 ; IS ROW 4 CHANGED?
GOTO NO10 ; YO, THEN THE KEY 0 PRESSED.
BCF COL3 ; SCAN COLUMN 3 OF THE KEYPAD.
BTFSS ROW1 ; IS ROW 1 CHANGED?
GOTO NO3 ; YO, THEN THE KEY 3 PRESSED.
BCF COL3 ; NOPE.
BTFSS ROW2 ; IS ROW 2 CHANGED?
GOTO NO6 ; YO, THEN THE KEY 6 PRESSED.
BCF COL3 ; NOPE.
BTFSS ROW3 ; IS ROW 3 CHANGED?
GOTO NO9 ; YO, THEN THE KEY 9 PRESSED.
BCF COL3 ; NOPE.
BTFSS ROW4 ; IS ROW 4 CHANGED?
GOTO NO12 ; YO, THEN THE KEY # PRESSED.
RETLW d'0'
NO1
MOVLW d'1'
MOVWF ROLAND
RETLW d'0'
NO2
MOVLW d'2'
MOVWF ROLAND
RETLW d'0'
NO3
MOVLW d'3'
MOVWF ROLAND
RETLW d'0'
NO4
MOVLW d'4'
MOVWF ROLAND
RETLW d'0'
NO5
MOVLW d'5'
MOVWF ROLAND
RETLW d'0'
NO6
MOVLW d'6'
MOVWF ROLAND
RETLW d'0'
NO7
MOVLW d'7'
MOVWF ROLAND
RETLW d'0'
NO8
MOVLW d'8'
MOVWF ROLAND
RETLW d'0'
NO9
MOVLW d'9'
MOVWF ROLAND
RETLW d'0'
NO10
MOVLW d'10'
MOVWF ROLAND
RETLW d'0'
NO11
MOVLW d'11'
MOVWF ROLAND
RETLW d'0'
NO12
MOVLW d'12'
MOVWF ROLAND
RETLW d'0'
END
               (
geocities.com/ece23314)