PIC Microcontroler based Keyboard

3x4 Keypad Lock w/ 4 bit LCD

by Bert Botha [bert at itsserv,co,za]

;*************************************************************************************
;Program that communicates with a keypad and displays only * to mask the number.     *
;This display indicates the mode that it is in. The six digit code is input and a    *
;calculation is done to determine if the code is correct.                            *
;*********02/12/2003*****************15H15**********************************BJB*******




;*************************************************************************************
;                                       Setup                                        *
;*************************************************************************************
                LIST        P=16F84A              ;Processor type
                ERRORLEVEL  -302                  ;Suppress warning of bank 1 operands
                INCLUDE     "P16F84A.INC"         ;
MYREG           EQU         0X20                  ;
OUTPUT          EQU         0X21                  ;This reg for data reading to out pin
MYREG1          EQU         0X22                  ;
MYREG2          EQU         0X23                  ;
COUNTER         EQU         0X24                  ;
DIGITS          EQU         0X25                  ;
FLASH1          EQU         0X28                  ;
DELAY2          EQU         0X29                  ;
DELAY3          EQU         0X2A                  ;
COUNTER1        EQU         0X2B                  ;
NUMBER1         EQU         0X2C                  ;
NUMBER2         EQU         0X2D                  ;
NUMBER3         EQU         0X2E                  ;
NUMBER4         EQU         0X2F                  ;
NUMBER5         EQU         0X30                  ;
NUMBER6         EQU         0X31                  ;
CODEDATA        EQU         0X32                  ;
                CLRF        CODEDATA              ;
                CLRF        NUMBER1               ;
                CLRF        NUMBER2               ;
                CLRF        NUMBER3               ;
                CLRF        NUMBER4               ;
                CLRF        NUMBER5               ;
                CLRF        NUMBER6               ;
                CLRF        COUNTER               ;
                CLRF        OUTPUT                ;
                CLRF        MYREG                 ;
                CLRF        MYREG1                ;
                CLRF        MYREG2                ;
                CLRF        DIGITS                ;
                CLRF        FLASH1                ;
                CLRF        COUNTER1              ;
                BSF         STATUS,5              ;Select bank 1
                MOVLW       0X00                  ;All outputs
                MOVWF       TRISA                 ;Ditto
                MOVLW       0X0F                  ;Lower nibble is inputs
                MOVWF       TRISB                 ;Ditto
                BCF         STATUS,5              ;Back to bank 0
                BCF         PORTB,7               ;R/S Set to zero- command mode
                CLRF        PORTA                 ;Ensure all outputs are at zero
                GOTO        START                 ;






;*************************************************************************************
;                                   Pinout use                                       *
;*************************************************************************************
;PORTA , 0  is column 1
;PORTA , 1  is column 2
;PORTA , 2  is column 3
;PORTB , 0  is scanning row 1
;PORTB , 1  is scanning row 2
;PORTB , 2  is scanning row 3
;PORTB , 3  is scanning row 4       
;PORTB , 4  is clock output
;PORTB , 5  is serial output pin
;PORTB , 6  is enable
;PORTB , 7  is R/S pin
 
;*************************************************************************************
;                                   Subroutines                                      *
;*************************************************************************************
ENABLE          BSF         PORTB,6               ;Set ENABLE pin high
                CALL        DELAY                 ;Minimum setup time for the LCD
                BCF         PORTB,6               ;Falling edge needed to trigger LCD
                CALL        DELAY                 ;Kill some time
                RETURN                            ;


DELAY           MOVLW       0xFF                  ;Load 255 into W-register
                MOVWF       MYREG                 ;Move this data into MYREG
LOOP            DECFSZ      MYREG,1               ;Decrement MYREG, ans into MYREG
                GOTO        LOOP                  ;Loop program till MYREG = 0
                RETURN                            ;


LONGDELAY       MOVLW       0XFF                  ;
                MOVWF       DELAY2                ;
LOOP2           DECFSZ      DELAY2,1              ;
                GOTO        LDELAY                ;
                RETURN                            ;
LDELAY          MOVLW       0XFF                  ;
                MOVWF       DELAY3                ;
LOOP3           DECFSZ      DELAY3,1              ;
                GOTO        LOOP3                 ;
                GOTO        LOOP2                 ;


DELAY1          MOVLW       0x60                  ;Load 96 into W-register
                MOVWF       MYREG2                ;Move this data into MYREG
LOOP1           DECFSZ      MYREG2,1              ;Decrement MYREG, ans into MYREG
                GOTO        LOOP1                 ;Loop program till MYREG = 0
                RETURN                            


CLOCK           BCF         PORTB,4               ;Ensure that *Clock starts at 0
                BSF         PORTB,4               ;Clock value HIGH
                CALL        DELAY                 ;Kill some time
                BCF         PORTB,4               ;Falling edge *Clock
                CALL        DELAY                 ;Kill some time
                RETURN                            ;


SERIAL          MOVWF       OUTPUT                ;Moved data from W to OUTPUT reg
SERIAL1         BCF         PORTB,5               ;Ensure that SERIAL pin starts @ 0
                MOVLW       0x04                  ;There are 4 bits to a nibble
                MOVWF       MYREG1                ;Nibble control for escape
TEST            BTFSC       OUTPUT,7              ;Test data bit 7
                BSF         PORTB,5               ;SET SERIAL pin to 1
                CALL        CLOCK                 ;Clock the data to shift register
                BCF         PORTB,5               ;Reset SERIAL pin for next test
                RLF         OUTPUT,1              ;Rotate the OUTPUT register left
                DECFSZ      MYREG1,1              ;Decrement MYREG1, ans into MYREG1
                GOTO        TEST                  ;Do next bit of the word till all done
                CALL        ENABLE                ;Enable the LCD to read the data             
                RETURN                            ;Escape after the word is output


EX1             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER1               ;Move to number1 reg
                RETURN                            ;
EX2             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER2               ;Move to number2 reg
                RETURN                            ;
EX3             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER3               ;Move to number3 reg
                RETURN                            ;
EX4             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER4               ;Move to number4 reg
                RETURN                            ;
EX5             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER5               ;Move to number5 reg
                RETURN                            ;
EX6             MOVF        CODEDATA,0            ;Move data to w_reg
                MOVWF       NUMBER6               ;Move to number6 reg
                GOTO        CHECK                 ;






;*************************************************************************************
;                                   LCD Initialise                                   *
;*************************************************************************************
START           MOVLW       0x20                  ;4 bit 
                CALL        SERIAL                ;Move this data to the shift register
                MOVLW       0x28                  ;4 bit, 2 line, 7x5 matrix
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0x0C                  ;Disp ON, no cursor 
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0x02                  ;Display & curser home
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0x01                  ;Clear display
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0XC0                  ;Address 40
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
;
;*************************************************************************************
;                                       INTRO                                        *
;*************************************************************************************
                MOVLW       0X03                  ;This is for three tries
                MOVWF       COUNTER1              ;Counter for amount of attempts
ZERO            BSF         PORTB,7               ;Character mode
                MOVLW       'D'                   ;D
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'i'                   ;i
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       's'                   ;s
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       '-'                   ;-
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'a'                   ;a
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'r'                   ;r
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'm'                   ;m
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'i'                   ;i
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'n'                   ;n
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'g'                   ;g
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       ' '                   ;
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'C'                   ;C
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'o'                   ;o
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'd'                   ;d
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       '?'                   ;?
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BCF         PORTB,7               ;Command mode
                MOVLW       0X85                  ;Address
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot




;*************************************************************************************
;                                       MAIN                                         *
;*************************************************************************************


CLEARS          MOVLW       0X06                  ;Setup maximum digits used
                MOVWF       DIGITS                ;This is the max digit used reg
TESTDATA        MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;After movf, leave a copy again in DIGITS
                XORLW       0X06                  ;Has a digit been input ?
                BTFSC       STATUS,Z              ;Well, has it
                CLRF        CODEDATA              ;Ensure that reg CODEDATA is empty
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X05                  ;2nd digit to follow ?
                BTFSC       STATUS,Z              ;Well, is it ?
                CALL        EX1                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X04                  ;3rd digit to follow ?
                BTFSC       STATUS,Z              ;Well, is it ?
                CALL        EX2                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X03                  ;4th digit to follow ?
                BTFSC       STATUS,Z              ;Well, is it ?
                CALL        EX3                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X02                  ;5th digit to follow ?
                BTFSC       STATUS,Z              ;Well, is it ?
                CALL        EX4                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X01                  ;6th digit to follow ?
                BTFSC       STATUS,Z              ;Well, is it ?
                CALL        EX5                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                MOVF        DIGITS,0              ;Re-input number of digits left into W
                MOVWF       DIGITS                ;Re-input number of digits left into W
                XORLW       0X00                  ;All six digits in ?
                BTFSC       STATUS,Z              ;Well, is it ?
                GOTO        EX6                   ;Put the numeric value into the correct
                                                  ;NUMBER register
                BSF         PORTA,0               ;Poke column 1 high
                CALL        DETERMINE             ;Check PORTB lower nibble for change
                BCF         PORTA,0               ;Clear column 1
                BSF         PORTA,1               ;Poke column 2 high
                CALL        DETERMINE             ;Check PORTB lower nibble for change
                BCF         PORTA,1               ;Clear column 2
                BSF         PORTA,2               ;Poke column 3 high
                CALL        DETERMINE             ;Check PORTB lower nibble for change
                BCF         PORTA,2               ;Clear column 3
                GOTO        TESTDATA              ;Loop, check everything again




;*************************************************************************************
;                                   CALCULATION                                      *
;*************************************************************************************


CHECK           MOVF        NUMBER1,0             ;Put numeric input 1 into W register
                XORLW       0X05                  ;Is the first saved value 5?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                MOVF        NUMBER2,0             ;Put numeric input 2 into W register
                XORLW       0X09                  ;Is the second saved value 9?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                MOVF        NUMBER3,0             ;Put numeric input 3 into W register
                XORLW       0X07                  ;Is the third saved value 7?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                MOVF        NUMBER4,0             ;Put numeric input 4 into W register
                XORLW       0X05                  ;Is the fourth saved value 5?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                MOVF        NUMBER5,0             ;Put numeric input 5 into W register
                XORLW       0X03                  ;Is the fifth saved value 3?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                MOVF        NUMBER6,0             ;Put numeric input 6 into W register
                XORLW       0X01                  ;Is the sixth saved value 1?
                BTFSS       STATUS,Z              ;Well, is it ?
                GOTO        LOCKED                ;No? start from scratch
                GOTO        TWO                   ;Good the code is correct




;*************************************************************************************
;                                   DETERMINATION                                    *
;*************************************************************************************                   


DETERMINE       BTFSC       PORTB,0               ;Check first row
                GOTO        DEBOUNCE              ;Run debounce subroutine
                BTFSC       PORTB,1               ;Check second row
                GOTO        DEBOUNCE1             ;Run debounce routine
                BTFSC       PORTB,2               ;Check third row
                GOTO        DEBOUNCE2             ;Run debounce routine
                BTFSC       PORTB,3               ;Check fouth row
                GOTO        DEBOUNCE3             ;Run debounce routine
                RETURN                            ;


DEBOUNCE        MOVLW       0X04                  ;The amount of samples
                MOVWF       COUNTER               ;The sample register
TESTING         CALL        DELAY1                ;Kill some time     
                BTFSS       PORTB,0               ;Re-check this bit
                GOTO        START                 ;False trigger, escape to start
                DECFSZ      COUNTER,1             ;Re-sample 4 times
                GOTO        TESTING               ;Ditto
TEST1           BTFSC       PORTB,0               ;Wait for release
                GOTO        TEST1                 ;Ditto
                BSF         PORTB,7               ;R/S set to 1 for character display
                BTFSC       PORTA,0               ;Was it the first column?
                GOTO        i1                    ;This is the character (without i )
                BTFSC       PORTA,1               ;Was it the second column?
                GOTO        i2                    ;This is the character (without i )
                BTFSC       PORTA,2               ;Was it the third column?
                GOTO        i3                    ;This is the character (without i )
                GOTO        START                 ;
i1              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X01                  ;Numeric value 1
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i2              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X02                  ;Numeric value 2
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i3              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X03                  ;Numeric value 3
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
DEBOUNCE1       MOVLW       0X04                  ;The amount of samples
                MOVWF       COUNTER               ;The sample register
TESTING1        CALL        DELAY1                ;Kill some time
                BTFSS       PORTB,1               ;Re-check this bit
                GOTO        START                 ;False trigger, escape to start
                DECFSZ      COUNTER,1             ;Re-sample 4 times
                GOTO        TESTING1              ;Ditto
TEST2           BTFSC       PORTB,1               ;Wait for release
                GOTO        TEST2                 ;Ditto
                BSF         PORTB,7               ;R/S set to 1 for character display
                BTFSC       PORTA,0               ;Was it the first column?
                GOTO        i4                    ;This is the character (without i )
                BTFSC       PORTA,1               ;Was it the second column?
                GOTO        i5                    ;This is the character (without i )
                BTFSC       PORTA,2               ;Was it the third column?
                GOTO        i6                    ;This is the character (without i )
                GOTO        START                 ;
i4              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X04                  ;Numeric value 4
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i5              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X05                  ;Numeric value 5
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i6              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X06                  ;Numeric value 6
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
DEBOUNCE2       MOVLW       0X04                  ;The amount of samples
                MOVWF       COUNTER               ;The sample register
TESTING2        CALL        DELAY1                ;Kill some time
                BTFSS       PORTB,2               ;Re-check this bit
                GOTO        START                 ;False trigger, escape to start
                DECFSZ      COUNTER,1             ;Re-sample 4 times
                GOTO        TESTING2              ;Ditto
TEST3           BTFSC       PORTB,2               ;Wait for release
                GOTO        TEST3                 ;Ditto
                BSF         PORTB,7               ;R/S set to 1 for character display
                BTFSC       PORTA,0               ;Was it the first column?
                GOTO        i7                    ;This is the character (without i )
                BTFSC       PORTA,1               ;Was it the second column?
                GOTO        i8                    ;This is the character (without i )
                BTFSC       PORTA,2               ;Was it the third column?
                GOTO        i9                    ;This is the character (without i )
                GOTO        START                 ;
i7              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X07                  ;Numeric value 7
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i8              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X08                  ;Numeric value 8
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i9              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X09                  ;Numeric value 9
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
DEBOUNCE3       MOVLW       0X04                  ;The amount of samples
                MOVWF       COUNTER               ;The sample register
TESTING3        CALL        DELAY1                ;Kill some time
                BTFSS       PORTB,3               ;Re-check this bit
                GOTO        START                 ;False trigger, escape to start
                DECFSZ      COUNTER,1             ;Re-sample 4 times
                GOTO        TESTING3              ;Ditto
TEST4           BTFSC       PORTB,3               ;Wait for release
                GOTO        TEST4                 ;Ditto
                BSF         PORTB,7               ;R/S set to 1 for character display
                BTFSC       PORTA,0               ;Was it the first column?
                GOTO        ix                    ;This is the character (without i )
                BTFSC       PORTA,1               ;Was it the second column?
                GOTO        i0                    ;This is the character (without i )
                BTFSC       PORTA,2               ;Was it the third column?
                GOTO        i#                    ;This is the character (without i )
                GOTO        START                 ;Wasn't triggered,check again
ix              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X2A                  ;ASCII symbol *
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i0              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X00                  ;Numeric value 0
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning
i#              MOVLW       '*'                   ;*
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X23                  ;ASCII symbol #
                MOVWF       CODEDATA              ;Save data for manipulation
                DECF        DIGITS,1              ;Reduce digits register
                BCF         PORTB,7               ;Command mode
                GOTO        TESTDATA              ;Redo the keypad scanning




;*************************************************************************************
;                                     OUTCOMES                                       *
;*************************************************************************************


LOCKED          BCF         PORTB,7               ;Command mode
                BSF         PORTA,4               ;Red LED on
                MOVLW       0X01                  ;Clear display
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X06                  ;Increment display shift off
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X86                  ;Address 6
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BSF         PORTB,7               ;Character mode
                MOVLW       'W'                   ;W
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'R'                   ;R
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'O'                   ;O
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'N'                   ;N
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'G'                   ;G
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BCF         PORTB,7               ;Command mode
                MOVLW       0XC6                  ;Address 45
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BSF         PORTB,7               ;Character mode
                MOVLW       'C'                   ;C
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'O'                   ;O
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'D'                   ;D
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'E'                   ;E
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BCF         PORTB,7               ;Command mode
                MOVLW       0X0A                  ;Flash 10 times
                MOVWF       FLASH1                ;Flashing counter
FLASH           MOVLW       0X08                  ;Display off
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                CALL        LONGDELAY             ;Kill a long time
                MOVLW       0X0C                  ;Display on
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                CALL        LONGDELAY             ;Kill a long time
                DECFSZ      FLASH1,1              ;Reduce amount of flashes by 1
                GOTO        FLASH                 ;Make the display flash on and off
                BCF         PORTB,7               ;Command mode
                MOVLW       0X01                  ;Clear display
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0XC0                  ;Address 40
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BCF         PORTA,4               ;Red LED off
                DECFSZ      COUNTER1,1            ;Count if max attempt reached
                GOTO        ZERO                  ;Re-ask for the code
ONE             BSF         PORTA,4               ;Red LED on
                BCF         PORTB,7               ;Command mode
                MOVLW       0X01                  ;Clear display
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X85                  ;Address 05
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BSF         PORTB,7               ;Character mode
                MOVLW       'L'                   ;L
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'O'                   ;O
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'C'                   ;C
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'K'                   ;K
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'E'                   ;E
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'D'                   ;D
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BCF         PORTB,7               ;Command mode
                MOVLW       0XC0                  ;Address 40
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BSF         PORTB,7               ;Character mode
                MOVLW       'U'                   ;U
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       's'                   ;s
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       ' '                   ;
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'M'                   ;M
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'a'                   ;a
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       's'                   ;s
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       't'                   ;t
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'r'                   ;r
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       ' '                   ;
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'C'                   ;C
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'o'                   ;o
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'd'                   ;d
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                GOTO        $                     ;
TWO             BCF         PORTB,7               ;Command mode
                MOVLW       0X01                  ;Clear display
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       0X82                  ;Address 02
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                BSF         PORTA,3               ;Green LED on
                BSF         PORTB,7               ;Character mode
                MOVLW       'D'                   ;D
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       '-'                   ;-
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'A'                   ;a
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'c'                   ;c
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       't'                   ;t
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'i'                   ;i
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'v'                   ;v
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'a'                   ;a
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       't'                   ;t
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'e'                   ;e
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
                MOVLW       'd'                   ;d
                CALL        SERIAL                ;This will output 4 bits only
                CALL        SERIAL1               ;cause the low 4 are already high rot
;*************************************************************************************
                GOTO        $                     ;
                END
            
                
                    

Note that the four bits for reading in the keypad all have 1k resistors as passive pull down with a keystroke as active pull-up. This ensures that the otherwise floating input does not cause false code to be read in.

 

 

See:

Questions:

Comments: