Programming Forums
User Name Password Register
 

RSS Feed
FORUM INDEX | TODAY'S POSTS | UNANSWERED THREADS | ADVANCED SEARCH

Reply
 
Thread Tools Display Modes
Old Apr 17th, 2006, 6:58 PM   #1
hbe02
Hobbyist Programmer
 
hbe02's Avatar
 
Join Date: Mar 2006
Location: Lebanon
Posts: 148
Rep Power: 3 hbe02 is on a distinguished road
PIC16F84 & KEYPAD

so im wrote the assembly code for an electronic lock door opener which takes a 3 digit input form a keypad, displays the input on a LED and then through an FSM if the correct 3 digit passcode is entered followed by a # a signal will be sent on portA(4) to open a relay. i also optimized my code for accepting a change of pass word. for example if the passcode is 000 and you want to change it to 111. you type "000*111*111#" .. alright now the code is complete and tested and all works. but as it is too late to enquire about this now... i want to make sure that how i think the keypad works on processors is corerct.
i know that a 4x4 keypad is a 2D array of switches, so 4 have 4 inputs which are the rows from the pic to the keypad and 4 outputs from the keypad to the pic. i assumed on my own that i could set each row to one then zero in sequential order and have an interrupt if any of the columns gives a one. thing is , i kind of came up with this on my own and im not sure it works on hardware. here's what my main looks like... so does this work??
MAIN
			BCF		PORTB,3

			BSF		PORTB,0
			BCF		PORTB,0

			BSF		PORTB,1
			BCF		PORTB,1

			BSF		PORTB,2
			BCF		PORTB,2

			BSF		PORTB,3

			GOTO	MAIN
portB from 0 to 3 are inputs to the keypad ... and once a key is pressed, the corresponding switch will close and the corresponding column will give an interupt (portB(4) - portB(7) ...
i assumed that delay of setting and clearing would be too small to the human hand so the interrupt will be generated correctly...
thanks for the help...
ow btw .. if you want to take a look at my code its in the reply below this..
hbe02 is offline   Reply With Quote
Old Apr 17th, 2006, 7:00 PM   #2
hbe02
Hobbyist Programmer
 
hbe02's Avatar
 
Join Date: Mar 2006
Location: Lebanon
Posts: 148
Rep Power: 3 hbe02 is on a distinguished road
this all is tested with the port watch and stimulus controller...

			list 		p=16f84				; Identifies device
			radix		hex					; Set default radix
			include 	"p16f84.inc"  		; Includes symbol definitions

PASS0		EQU		d'12'
PASS1		EQU		d'13'
PASS2		EQU		d'14'

TEST_PASS0	EQU		d'16'
TEST_PASS1	EQU		d'17'
TEST_PASS2	EQU		d'18'

TYPE_PASS	EQU		d'20'		;TYPED IN PASSWORD
STATE		EQU		d'21'		;4 STATES ON STATE(0) AND STATE(1)
PBCPY		EQU		d'22'
NEW_PASS0	EQU		d'23'
NEW_PASS1	EQU		d'24'
NEW_PASS2	EQU		d'25'

NEW_STATE	EQU		d'27'


			ORG		0x0
			GOTO	PRE_MAIN
			ORG		0X4
			MOVF	PORTB,0
			MOVWF	PBCPY		;COPY PORTB TO PBCPY NOT TO LOSE DATA

			BTFSC	INTCON,RBIF
			GOTO	INPUT
TIMEOUT		
			CLRF	STATE
			GOTO	ENDINTERRUPT0
INPUT
			BTFSC	PBCPY,7
			GOTO	COLUMN0
			BTFSC	PBCPY,6
			GOTO	COLUMN1
			BTFSC	PBCPY,5
			GOTO	COLUMN2
			BTFSC	PBCPY,4
			GOTO	COLUMN3
			GOTO    ENDINTERRUPT0

;ROW0 CORRESPOND TO PBCPY(0)
;      C0  C1  C2  C3
;ROW0 	1 	2 	3 	A
;ROW1 	4 	5 	6 	B
;ROW2 	7 	8 	9 	C
;ROW3 	*	0 	#	D

COLUMN0
			BTFSC	PBCPY,0
			GOTO	COLUMN0_ROW0
			BTFSC	PBCPY,1
			GOTO	COLUMN0_ROW1
			BTFSC	PBCPY,2
			GOTO	COLUMN0_ROW2
			BTFSC	PBCPY,3
			GOTO	COLUMN0_ROW3
			GOTO    ENDINTERRUPT0
COLUMN1
			BTFSC	PBCPY,0
			GOTO	COLUMN1_ROW0
			BTFSC	PBCPY,1
			GOTO	COLUMN1_ROW1
			BTFSC	PBCPY,2
			GOTO	COLUMN1_ROW2
			BTFSC	PBCPY,3
			GOTO	COLUMN1_ROW3

			GOTO    ENDINTERRUPT0
COLUMN2
			BTFSC	PBCPY,0
			GOTO	COLUMN2_ROW0
			BTFSC	PBCPY,1
			GOTO	COLUMN2_ROW1
			BTFSC	PBCPY,2
			GOTO	COLUMN2_ROW2
			BTFSC	PBCPY,3
			GOTO	COLUMN2_ROW3
			GOTO    ENDINTERRUPT0
COLUMN3
			BTFSC	PBCPY,0
			GOTO	COLUMN3_ROW0
			BTFSC	PBCPY,1
			GOTO	COLUMN3_ROW1
			BTFSC	PBCPY,2
			GOTO	COLUMN3_ROW2
			BTFSC	PBCPY,3
			GOTO	COLUMN3_ROW3
			GOTO    ENDINTERRUPT0

;ROW0 CORRESPOND TO PBCPY(0)
;      C0  C1  C2  C3 
;ROW0 	1 	2 	3 	A 
;ROW1 	4 	5 	6 	B 
;ROW2 	7 	8 	9 	C 
;ROW3 	*	0 	#	D

;FIND WHICH STATE, COPY CHARACTER TO TEST_PASS AND GO TO CORRESPONDING STATE LABEL TO COMPARE
COLUMN0_ROW0
			MOVLW	d'1'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		;TOCKI SHOULD NOT BE AFFECTED AND REMAINS ZERO		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN0_ROW1
			MOVLW	d'4'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN0_ROW2
			MOVLW	d'7'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN0_ROW3
			MOVLW	0xe			; e = *
			GOTO	CHANGEPASS?
			GOTO    ENDINTERRUPT0
;------------------------------------
COLUMN1_ROW0
			MOVLW	d'2'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN1_ROW1
			MOVLW	d'5'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN1_ROW2
			MOVLW	d'8'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN1_ROW3
			MOVLW	d'0'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
;------------------------------------
COLUMN2_ROW0
			MOVLW	d'3'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN2_ROW1
			MOVLW	d'6'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN2_ROW2
			MOVLW	d'9'
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN2_ROW3
			MOVLW	0xf			; f=#
			GOTO	ACTION?
			GOTO    ENDINTERRUPT0
;------------------------------------
COLUMN3_ROW0
			MOVLW	0xa
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN3_ROW1
			MOVLW	0xb
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN3_ROW2
			MOVLW	0xc
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
COLUMN3_ROW3
			MOVLW	0xd
			MOVWF	TYPE_PASS
			MOVWF	PORTA		
			GOTO 	STATE_TEST
			GOTO    ENDINTERRUPT0
;------------------------------------
STATE_TEST
			BTFSS	STATE,0
			GOTO	TEMP1			;STATE IS ??0
			GOTO 	TEMP2			;STATE IS ??1
TEMP1
			BTFSS	STATE,1
			GOTO	TEMP3			;STATE IS ?00
			GOTO	TEMP4			;STATE IS ?10	
TEMP2
			BTFSS	STATE,1
			GOTO	TEMP5			;STATE IS ?01
			GOTO	TEMP6			;STATE IS ?11
TEMP3
			BTFSS	STATE,2
			GOTO	TEST0			;STATE IS 000
			GOTO	NEW_TEST0		;STATE IS 100

TEMP4
			BTFSS	STATE,2
			GOTO	TEST2			;STATE IS 010
			GOTO	NEW_TEST2		;STATE IS 110
TEMP5
			BTFSS	STATE,2
			GOTO	TEST1			;STATE IS 001
			GOTO	NEW_TEST1		;STATE IS 101
TEMP6
			BTFSS	STATE,2
			GOTO	TEST3			;STATE IS 011
			GOTO	NEW_TEST3		;STATE IS 111
;---------------------------------------------------
TEST0
			MOVWF	TEST_PASS0
			MOVF	PASS0,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NOMATCH0
			INCF	STATE,1			;MATCH!!
			GOTO	OUT0
NOMATCH0
			
			CLRF	STATE
			GOTO	OUT0
OUT0		
			CLRF	TMR0			
			GOTO    ENDINTERRUPT0

;---------------------------------------------------
TEST1
			MOVWF	TEST_PASS1
			MOVF	PASS1,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NOMATCH1
			INCF	STATE,1			;MATCH!!
			GOTO	OUT1
NOMATCH1
			
			CLRF	STATE
			GOTO	OUT1
OUT1					
			CLRF	TMR0	
			GOTO    ENDINTERRUPT0

;---------------------------------------------------
TEST2		
			MOVWF	TEST_PASS2
			MOVF	PASS2,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NOMATCH2
			INCF	STATE,1			;MATCH!!
			GOTO	OUT2
NOMATCH2
			
			CLRF	STATE
			GOTO	OUT2
OUT2		
			CLRF	TMR0			
			GOTO    ENDINTERRUPT0
;---------------------------------------------------
TEST3	
			CLRF	STATE			
			CLRF	TMR0
			GOTO    ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------
NEW_TEST0
			BTFSS	STATE,3
			GOTO	COPY0

			MOVWF	TEST_PASS0
			MOVF	NEW_PASS0,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NEW_NOMATCH0
			INCF	STATE,1			;MATCH!!
			GOTO	NEW_OUT0
NEW_NOMATCH0
			
			CLRF	STATE
			GOTO	NEW_OUT0
COPY0
			INCF	STATE,1	
			MOVWF	NEW_PASS0
NEW_OUT0		
			CLRF	TMR0			
			GOTO    ENDINTERRUPT0

;---------------------------------------------------
NEW_TEST1
			BTFSS	STATE,3
			GOTO	COPY1
			
			MOVWF	TEST_PASS1
			MOVF	NEW_PASS1,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NEW_NOMATCH1
			INCF	STATE,1			;MATCH!!
			GOTO	NEW_OUT1
NEW_NOMATCH1
			
			CLRF	STATE
			GOTO	NEW_OUT1
COPY1
			INCF	STATE,1	
			MOVWF	NEW_PASS1
NEW_OUT1					
			CLRF	TMR0	
			GOTO    ENDINTERRUPT0

;---------------------------------------------------
NEW_TEST2		
			BTFSS	STATE,3
			GOTO	COPY2

			MOVWF	TEST_PASS2
			MOVF	NEW_PASS2,0
			XORWF	TYPE_PASS,1		;PASSTEST = ZERO IF MATCH
			INCF	TYPE_PASS,1		;PASSTEST = ONE IF MATCH
			DECFSZ	TYPE_PASS,1		
			GOTO    NEW_NOMATCH2
			INCF	STATE,1			;MATCH!!
			GOTO	NEW_OUT2
NEW_NOMATCH2
			
			CLRF	STATE
			GOTO	NEW_OUT2
COPY2
			INCF	STATE,1	
			MOVWF	NEW_PASS2
NEW_OUT2		
			CLRF	TMR0			
			GOTO    ENDINTERRUPT0
;---------------------------------------------------
NEW_TEST3
			CLRF	STATE			
			CLRF	TMR0
			GOTO    ENDINTERRUPT0

;---------------------------------------------------------
;---------------------------------------------------------
ACTION?
			BTFSC	STATE,0
			GOTO	MORETEST	;STATE IS ???1
			GOTO 	EXIT		
MORETEST
			BTFSC	STATE,1
			GOTO	MORETEST1	;STATE IS ??11
			GOTO	EXIT
MORETEST1
			BTFSC	STATE,2
			GOTO	MORETEST2	;STATE IS ?111
			GOTO	OPENTEST
MORETEST2
			BTFSC	STATE,3
			GOTO	CONFIRM_CHANGE;STATE IS 1111
			GOTO	EXIT
CONFIRM_CHANGE
			MOVF	NEW_PASS0,0
			MOVWF	PASS0
			MOVF	NEW_PASS0,1
			MOVWF	PASS1
			MOVF	NEW_PASS0,2
			MOVWF	PASS2
			GOTO 	EXIT

OPENTEST
			BTFSC	STATE,3
			GOTO	EXIT		;STATE IS 1111
			GOTO	OPENDOOR
OPENDOOR
			BSF		PORTA,4
			NOP
			NOP
			BCF		PORTA,4	
EXIT
			CLRF	STATE		
			GOTO    ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------------
CHANGEPASS?
			BTFSC	STATE,0
			GOTO	MORETST		;STATE IS ?1
			GOTO 	EXT		
MORETST
			BTFSC	STATE,1
			GOTO	TOCHANGE	;STATE IS 11
			GOTO	EXT
TOCHANGE
			BTFSS	STATE,2
			GOTO 	FIRST
			BSF		STATE,3		;SECOND TRIAL
			GOTO	EXT
FIRST
			BSF		STATE,2
EXT
			BCF		STATE,0
			BCF		STATE,1
			GOTO	ENDINTERRUPT0
;---------------------------------------------------------
;---------------------------------------------------------
ENDINTERRUPT0
			BCF		INTCON,T0IF
			BCF		INTCON,RBIF		;END INTERUPT SEQUENCE
			CLRF	PORTB
			RETFIE

PRE_MAIN
			CLRF	PORTA
			CLRF	PORTB
			CLRF	TEST_PASS0
			CLRF	TEST_PASS1
			CLRF	TEST_PASS2
			CLRF	TYPE_PASS
			CLRF	STATE
			CLRF	PASS0
			CLRF	PASS1
			CLRF	PASS2
			CLRF	NEW_PASS0
			CLRF	NEW_PASS1
			CLRF	NEW_PASS2
			CLRF	NEW_STATE
			CLRF	TMR0
			CLRF    PBCPY

			BSF		STATUS,RP0			;GOTO BANK 1
			MOVLW	B'00000000'
			MOVWF	TRISA
			MOVLW	B'11110000'
			MOVWF	TRISB

			MOVLW	B'01010000'
			MOVWF	OPTION_REG

			BCF		STATUS,RP0			;GOTO BANK 0

			MOVLW	B'00101000'
			MOVWF	INTCON

			BSF		INTCON,7			;SET GLOBAL INTERUPT
			GOTO	MAIN

MAIN
			BCF		PORTB,3

			BSF		PORTB,0
			BCF		PORTB,0

			BSF		PORTB,1
			BCF		PORTB,1

			BSF		PORTB,2
			BCF		PORTB,2

			BSF		PORTB,3

			GOTO	MAIN
	
;IN COMMENTS FOR TESTING
;			BSF		PORTB,3
;
;			NOP;BSF		PORTB,6
;			BSF		PORTB,3
;NOP
;			NOP;BSF		PORTB,5
;			BSF		PORTB,3
;NOP
;			NOP;BCF		PORTB,5
;			BSF		PORTB,3
;NOP
;			NOP;BSF		PORTB,7
;
;			BCF		PORTB,3
;			BSF		PORTB,2
;NOP
;			NOP;BCF		PORTB,7
;			BSF		PORTB,2
;NOP
;			NOP;BSF		PORTB,5
;			BSF		PORTB,2
;NOP
;			NOP;BCF		PORTB,5
;			BSF		PORTB,3
;			BCF		PORTB,2
;NOP
;			NOP;BSF		PORTB,7
;NOP
;			BSF		PORTB,2
;			BCF		PORTB,3
;
;			NOP;BCF		PORTB,7
;			BSF		PORTB,2
;NOP
;			NOP;BSF		PORTB,5
;			BSF		PORTB,2
;NOP
;			NOP;BCF		PORTB,5
;			
;			BCF		PORTB,2
;			BSF		PORTB,3
;
;			NOP;BSF		PORTB,7
;NOP
			
		

			END
;INTERRUPTS HAPPEN ON COLUMN STATE CHANGE. PORTA(4) IS THE OUTPUT TO DOOR
;TO CHANGE PASS, TYPE 000*111*111#
hbe02 is offline   Reply With Quote
Reply

Bookmarks

« Previous Thread in Forum | Next Thread in Forum »

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump




DaniWeb IT Discussion Community
All times are GMT -5. The time now is 12:43 PM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC