![]() |
|
![]() |
|
|
Thread Tools | Display Modes |
|
|
|
|
#1 |
|
Hobbyist Programmer
Join Date: Mar 2006
Location: Lebanon
Posts: 148
Rep Power: 3
![]() |
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 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.. |
|
|
|
|
|
#2 |
|
Hobbyist Programmer
Join Date: Mar 2006
Location: Lebanon
Posts: 148
Rep Power: 3
![]() |
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# |
|
|
|
![]() |
| Bookmarks |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|