Programming Forums

Programming Forums (http://www.programmingforums.org/forumindex.php)
-   Assembly (http://www.programmingforums.org/forum20.html)
-   -   PIC16F84 & KEYPAD (http://www.programmingforums.org/showthread.php?t=9409)

hbe02 Apr 17th, 2006 6:58 PM

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 Apr 17th, 2006 7:00 PM

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#



All times are GMT -5. The time now is 4:48 PM.

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