codelock with touch screen Pixxi25P4CT and PIC18F26K22


+ Reply to Thread
Results 1 to 4 of 4
  1. #1
    Join Date
    Oct 2010
    Posts
    413

    Default codelock with touch screen Pixxi25P4CT and PIC18F26K22

    Dear all its being long time since my last post. I had so many things lately. Just realised that i had a small project that i havent completed.

    Not this is almost done and working up to now.

    Take your time to check it out if you have a PixxiLCD25P4CT together with a PIC18F26K22.

    Code:
    '******************************************************************
    '*  Name    : CODELOCK.BAS                                         *
    '*  Author  : [LB]                                                 *
    '*  Notice  : Copyright (c) 2024 [14 April 2024]                   *
    '*          : All Rights Reserved                                  *
    '*  Date    : 14-Apr-24                                            *
    '*  Version : 1.0                                                  *
    '*  Notes   : This is a codelock based on the following components *                                                 
    '*          : PIC18F26K22 @ 64Mhz                                  *
    '*          : 4D Systems Pixxi LCD 25P4                            *
    
    ' ======= Key Mapping (last 4 bytes of response codes) =======
    'NUM_KEYS CON 12
    
    ' Hex Codes & Corresponding Key Values
    'keyCodes DATA $313A, 1  ' Number 1 "07 0D 01 00 31 3A"
    'keyCodes DATA $3239, 2  ' Number 2 "07 0D 01 00 32 39"
    'keyCodes DATA $3338, 3  ' Number 3 "07 0D 01 00 33 38"
    'keyCodes DATA $343F, 4  ' Number 4 "07 0D 01 00 34 3F"
    'keyCodes DATA $353E, 5  ' Number 5 "07 0D 01 00 35 3E"
    'keyCodes DATA $363D, 6  ' Number 6 "07 0D 01 00 36 3D"
    'keyCodes DATA $373C, 7  ' Number 7 "07 0D 01 00 37 3C"
    'keyCodes DATA $3833, 8  ' Number 8 "07 0D 01 00 38 33"
    'keyCodes DATA $3932, 9  ' Number 9 "07 0D 01 00 39 32"
    'keyCodes DATA $2A21, 10 ' Number * "07 0D 01 00 2A 21"  (unused)
    'keyCodes DATA $303B, 0  ' Number 0 "07 0D 01 00 30 3B"
    'keyCodes DATA $0803, 11 ' Go     # "07 0D 01 00 08 03"
    
    '*********************************************************************************
    '                                                                                *
    #IF __PROCESSOR__ = "18F26k22"
    @ ERRORLEVEL -306 ; this command prevents the compiler to give you a notice of   *
                      ; crossing page boundary - make sure bits are set              *  
    '********************************************************************************* 
    ;                                                                                *
      #CONFIG       ; The PBP configuration for the PIC18F26K22 is:                  *
    ;                                                                                *
    ;*********************************************************************************
      CONFIG  FOSC=INTIO67, PLLCFG=ON, PRICLKEN=OFF, FCMEN=OFF, IESO=OFF
      CONFIG  PWRTEN=OFF, BOREN=SBORDIS, BORV=190, WDTEN=ON, WDTPS=32768
      CONFIG  CCP2MX=PORTC1, PBADEN=OFF, CCP3MX=PORTB5, HFOFST=ON, T3CMX=PORTC0
      CONFIG  P2BMX=PORTB5, MCLRE=EXTMCLR, STVREN=ON, LVP=OFF, XINST=OFF, DEBUG=OFF
      CONFIG  CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF, CPB=OFF, CPD=OFF, WRT0=OFF
      CONFIG  WRT1=OFF, WRT2=OFF, WRT3=OFF, WRTC=OFF, WRTB=OFF, WRTD=OFF, EBTR0=OFF
      CONFIG  EBTR1=OFF, EBTR2=OFF, EBTR3=OFF, EBTRB=OFF 
      #ENDCONFIG
      #ELSE
        #MSG "Wrong Processor selected!"
      #ENDIF
    
    define  OSC 64 
            INCLUDE "modedefs.bas"
            INCLUDE "ALLDIGITAL.pbp"
    OSCCON    = %01110000   ; 16Mhz
    OSCTUNE.6 = 1     ; Enable 4x PLL
    
    '*-----------------------------------------------------------------------------|
    '*                        |  --------------------- |                           |
    '*----------------------- | EUART 2 Configuration  | --------------------------|
    '*                        |  --------------------- |                           |
    '*-----------------------------------------------------------------------------|
    ' for debuging PLL if it is ready or not 
    ' EUART 1 is configured later in the code
    
            DEFINE HSER2_RCSTA 90h ' Enable serial port & continuous receive
            DEFINE HSER2_TXSTA 24h ' Enable transmit, BRGH = 1
            DEFINE HSER2_CLROERR 1 ' Clear overflow automatically
            DEFINE HSER2_SPBRG 160 ' 38400 Baud @ 64MHz, -0.08%
            SPBRGH2 = 1
            BAUDCON2.3 = 1         ' Enable 16 bit baudrate generator
            
    ' Debug loop to check PLLRDY status
    WHILE !OSCCON2.7           ' Wait until PLL is stable
        pause 500
        HSEROUT2 ["PLL not ready...", 13, 10]  ' Send message to terminal
        PAUSE 500              ' Wait 500ms before checking again
    WEND
        pause 500
        HSEROUT2 ["PLL is ready!", 13, 10]  ' Confirm PLL is stable
    '------------------------------------------------------------------------------|
    '                            INITIALIZE RAM                                    |
    '------------------------------------------------------------------------------|
    initialize:
    	CLEAR                   
    '------------------------------------------------------------------------------|
    '-------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    TRISA = %00000000   'use TRISA to specify which pin is (1 = input) and which (0 = output)  (ALL pins are output)
    TRISB = %10000000   'use TRISB to specify which pin is (1 = input) and which (0 = output)  (RB7 PORTB.7 is the RX input pin of the EUART, the rest are output)
    TRISC = %10000000   'use TRISC to specify which pin is (1 = input) and which (0 = output)  (RC7 PORTC.7 is the RX input pin of the EUART, the rest are output)
                        'in PORTC the RC3 attached is an LED. 
    
    '------------------------------------------------------------------------|
    '--------------------------- TRIS A B C ---------------------------------|
    '------------------------------------------------------------------------|
    ' PORTA.7  PORTA.6  PORTA.5  PORTA.4  PORTA.3  PORTA.2  PORTA.1  PORTA.0 |
    '  bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0   |
    '   1        0        0        0        0        0        0        0     |
    '------------------------------------------------------------------------|
    '------------------------------------------------------------------------|
    ' PORTB.7  PORTB.6  PORTB.5  PORTB.4  PORTB.3  PORTB.2  PORTB.1  PORTB.0 |
    '  bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0   |
    '   0        0        0        0        0        0        0        0     |
    '------------------------------------------------------------------------|
    '------------------------------------------------------------------------|
    ' PORTC.7  PORTC.6  PORTC.5  PORTC.4  PORTC.3  PORTC.2  PORTC.1  PORTC.0 |
    '  bit7     bit6     bit5     bit4     bit3     bit2     bit1     bit0   |
    '   1        0        0        0        0        0        0        0     |
    '------------------------------------------------------------------------| 
    '------------------------------------------------------------------------|
    '----------------------- At start all PORTS LOW -------------------------|
    '------------------------------------------------------------------------|
    PORTA = 0            'make low all ports at A range                      |
    PORTB = 0            'make low all ports at B range                      |
    PORTC = 0            'make low all ports at C range                      |
    '------------------------------------------------------------------------|
    '------------------------------------------------------------------------|
    '-------------------------- COMPARATORS OFF -----------------------------|
    '------------------------------------------------------------------------|
    CM1CON0.7 = 0 'Disable comparator1                                       |
    CM2CON0.7 = 0 'Disable comparator2                                       |
    '------------------------------------------------------------------------|
    
    '*-----------------------------------------------------------------------------|
    '*                        |  --------------------- |                           |
    '*----------------------- | EUART 1 Configuration  | --------------------------|
    '*                        |  --------------------- |                           |
    '*-----------------------------------------------------------------------------|
    
            DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
            DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
            DEFINE HSER_CLROERR 1 ' Clear overflow automatically
            DEFINE HSER_SPBRG 160 ' 38400 Baud @ 64MHz, -0.08%
            SPBRGH = 1
            BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
    
    '*-----------------------------------------------------------------------------|
    '*-----------------------------------------------------------------------------| 
    
    Red           var LATC.3
    Blue          var LATA.2
    Green         var LATC.1
    ' ======= Buffers and Variables =======
    passcode VAR BYTE[4]       ' Stores the correct passcode
    inputCode VAR BYTE[4]      ' Stores user input
    passIndex VAR BYTE         ' Index for passcode entry
    receivedByte VAR BYTE[6]   ' Array to store received bytes from LCD
    keyCode VAR BYTE           ' Stores the decoded key value
    keyCodeHigh VAR BYTE       ' High byte of the key code
    keyCodeLow VAR BYTE        ' Low byte of the key code
    keyCodeCombined VAR WORD   ' Combined 16-bit key code
    i VAR BYTE                 ' Loop counter
    
    ' Initialize Variables
    passIndex = 0              ' Initialize passcode index
    keyCode = $FF              ' Initialize keyCode as undefined
    
    failCount VAR BYTE  ' Tracks failed attempts
    MAX_FAILS CON 5     ' Maximum allowed failed attempts before lockout
    Timeout VAR WORD     ' Timeout counter for automatic reset
    CurrentIndex VAR BYTE
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '                            VAR for Contrast                                  '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    command     var byte
    contrast    var byte
    CS          var byte
    '================================================================================================
    
    NUM_KEYS CON 5  
    
    ' Corrected Key Mapping
    keyCodes VAR WORD[NUM_KEYS]  ' Store received hex codes
    keyValues VAR BYTE[NUM_KEYS] ' Corresponding key values
    
    ' Initialize keyCodes and keyValues arrays
    FOR i = 0 TO NUM_KEYS - 1
        READ keyCodes[i], keyValues[i]
    NEXT i
    
    ' Manually define keys (matching Pixxi LCD response)
    keyCodes[0] = $3239  ' Number 2
    keyValues[0] = "2"
    
    keyCodes[1] = $373C  ' Number 7
    keyValues[1] = "7"
    
    keyCodes[2] = $3833  ' Number 8
    keyValues[2] = "8"
    
    keyCodes[3] = $343F  ' Number 4
    keyValues[3] = "4"
    
    keyCodes[4] = $0803  ' Go button
    keyValues[4] = "G"
    
    ' ==== Set Correct Passcode ====                        
    passcode[0] = "2"   ' Passcode digit 2                
    passcode[1] = "7"   ' Passcode digit 7 
    passcode[2] = "8"   ' Passcode digit 8 
    passcode[3] = "4"   ' Passcode digit 4
    
    ' Debugging: Print the contents of keyCodes and keyValues arrays
    FOR i = 0 TO NUM_KEYS - 1
        hserout2 ["Key Code ", DEC i, ": ", HEX keyCodes[i], " | Key Value: ", keyValues[i], 13,10]
    NEXT i
    
    'checking the LEDs.
    
    high red
    pause 500
    low RED
    high Green
    hserout2 ["Red LED flashes once", 13,10]
    hserout2 ["Green LED shows that PIC is powered up", 13,10]
    pause 3000  ' wait for the LCD to power up. 
    '=========================== CONTRAST checksum commands=====================
    '===========================================================================
    gosub checksum
    hserout [command,contrast,CS]      ' Contrast settings
    hserin  [wait(6)]
    pause 100
    '*********************************************************************************
    ' Main Program
    '*********************************************************************************
    ' ==== Main Program ====
    START:
        LOW Blue
        LOW Red
        GOSUB ReadKey                           ' Read key pressed
        hserout2 ["Key Read Complete", 13, 10]  ' debug serial out on 2 via PICKIT2
        IF keyCode <> "G" THEN                  ' this operator <> checks If not equal to the Go button
            IF passIndex < 4 THEN
                inputCode[passIndex] = keyCode  ' Store key in inputCode
                passIndex = passIndex + 1       ' Increment index
            ENDIF
        ELSE
            ' If "Go" button pressed, check passcode
            IF passIndex = 4 THEN
                GOSUB CheckPasscode
            ENDIF
        ENDIF
        GOTO START
    
    ' ==== Read Key ====
    ReadKey:
        ' Ensure buffer is cleared before receiving new data
        FOR i = 0 TO 5
            receivedByte[i] = 0
        NEXT i
    
        HSERIN [receivedByte[0], receivedByte[1], receivedByte[2], receivedByte[3], receivedByte[4], receivedByte[5]]
        'debug serial out on 2 via PICKIT2
        hserout2 ["Packet: ", HEX receivedByte[0], " ", HEX receivedByte[1], " ", HEX receivedByte[2], " ", HEX receivedByte[3], " ", HEX receivedByte[4], " ", HEX receivedByte[5],13,10]
    
        ' Extract the key code (last 2 bytes from the received data)
        keyCodeHigh = receivedByte[4]  ' Get the high byte of the key code from the received data
        keyCodeLow = receivedByte[5]   ' Get the low byte of the key code from the received data
    
        ' Combine the high and low bytes into a single 16-bit value
        keyCodeCombined = (keyCodeHigh << 8) | keyCodeLow  
        ' (keyCodeHigh << 8)Shift the high byte 8 bits to the left making room for the lowbyte and (| keyCodeLow) perform a bitwise OR with the low byte.
        ' This forms a 16-bit value where keyCodeHigh is the upper 8 bits and keyCodeLow is the lower 8 bits.
    
        
        ' Debugging: Print the combined key code
        hserout2 ["Combined Key Code: ", HEX keyCodeCombined, 13, 10]
    
        ' Look up the combined key code in the keyCodes table
        keyCode = "?"  ' Default to undefined keycode for debugging
    
        ' Debugging: Output the keycodes and compare
        FOR i = 0 TO NUM_KEYS - 1
            hserout2 ["Checking: ", HEX keyCodeCombined, " against ", HEX keyCodes[i], 13, 10]
            IF keyCodeCombined = keyCodes[i] THEN
                keyCode = keyValues[i]  'Retrieve corresponding key value
                hserout2 ["Match Found: ", keyCode, 13, 10]
                EXIT
            ENDIF
        NEXT i
    
        ' Debugging: Output the detected key value
        hserout2 ["Key Value: ", keyCode, 13, 10]
    
        RETURN
        
    ' ==== Check Passcode ====
    CheckPasscode:
        'debug serial out on 2 via PICKIT2: Print the inputCode array
        hserout2 ["Input Code: ", inputCode[0], inputCode[1], inputCode[2], inputCode[3], 13, 10]
    
        FOR i = 0 TO 3
            IF inputCode[i] <> passcode[i] THEN
            'debug serial out on 2 via PICKIT2
                hserout2 ["Passcode Mismatch at Index ", DEC i, 13, 10] ' Debugging mismatch
                GOSUB Fail
                RETURN
            ENDIF
        NEXT i
         ' If all characters match, passcode is correct
        'debug serial out on 2 via PICKIT2
        hserout2 ["Passcode is Correct open the door ", 13, 10] 
        GOSUB Unlocked
        RETURN
        
    ' ======= Passcode Unlocked =======
    Unlocked:
        ' Reset failed attempts counter
        failCount = 0  
    
        ' Blink Blue LED to indicate success
        FOR i = 1 TO 3
            HIGH Blue
            PAUSE 100
            LOW Blue
            PAUSE 50
        NEXT i
    
        GOSUB ResetInputCode  ; Reset input code
    RETURN
    ' ======= Passcode Failed =======
    Fail:
        failCount = failCount + 1
        'debug serial out on 2 via PICKIT2
        hserout2 ["Incorrect code. Attempts: ", DEC failCount, 13, 10]
    
        ' Lockout check
        IF failCount >= MAX_FAILS THEN
        'debug serial out on 2 via PICKIT2
            hserout2 ["LOCKED OUT! Too many failed attempts.", 13, 10]
            GOSUB Lockout
            RETURN
        ENDIF
    
        ' Blink Red LED
            HIGH Red
            PAUSE 100
            LOW Red
            PAUSE 50
    
        GOSUB ResetInputCode
        RETURN
    ' ======= System Lockout =======
    Lockout:
        FOR i = 1 TO 10
            HIGH Red
            HIGH Blue
            PAUSE 50
            LOW Red
            LOW Blue
            PAUSE 50
        NEXT i
        
        ' Disable Serial Reception
        RCSTA.4 = 0  ' Disable continuous receive
        'debug serial out on 2 via PICKIT2
        hserout2 ["System Serial port is disabled.", 13, 10]
        hserout2 ["System in Lockout Mode. Auto-reset in 60 seconds.", 13, 10]
    
        ' Automatic timeout reset (wait 60s)
        FOR Timeout = 1 TO 60
            PAUSE 1000
        NEXT Timeout
    
        ' Reset failed attempts counter
        failCount = 0
    
        ' Clear the entered code buffer
        FOR i = 0 TO 3
            InputCode[i] = 0
        NEXT i
    
        ' Reset input index
        CurrentIndex = 0
    
        ' Enable Serial Reception again
        RCSTA.4 = 1  ' Re-enable continuous receive
        'debug serial out on 2 via PICKIT2
        hserout2 ["System Serial port is enabled.", 13, 10]
        hserout2 ["Lockout reset. You may try again.", 13, 10]
        RETURN
    ' ======= Reset Input Code =======
    ResetInputCode:
        FOR i = 0 TO 3
            inputCode[i] = 0   ; Reset input code array
        NEXT i
        passIndex = 0         ; Reset passIndex
        keyCode = $FF         ; Reset keyCode
    RETURN
    '========== Contrast Checksum commmands ============
    checksum:
    command = $04
    contrast = $01
    cs = 0
    cs = cs ^command ^ contrast 
    return
    ' ======= End of Program =======
    END

  2. #2


    Did you find this post helpful? Yes | No

    Default Re: codelock with touch screen Pixxi25P4CT and PIC18F26K22

    Thanks for posting. I have been playing with the 4D systems ulcd-32ptu. Which method are you programming the display with? ViSi-Genie? Another question. Is your pic18f26k22 running on 3.3v or 5v? I have been learning the display setup with Visi-Genie and communicating with a terminal. Now I want to connect it to a 5V processor. Apparently you can put a 330ohm resistor in series with the pic Tx pin and the display Rx is 5v tolerant. Any thoughts

  3. #3
    Join Date
    Oct 2010
    Posts
    413


    Did you find this post helpful? Yes | No

    Default Re: codelock with touch screen Pixxi25P4CT and PIC18F26K22

    im using Visi Genie for this particular setup. No other coding in 4D Systems's platoform.

    Also im using the PIC18F265K22 at 5V. I do not use any resistor in betten as the circuit board is coming with the 4D Systems display has the resistors in on board.

    Name:  Screenshot 2025-02-23 000710.png
Views: 323
Size:  509.2 KB

    I will also try to impove the code as i just found a small bug. (not really a bug but just needs a fine tune)

  4. #4


    Did you find this post helpful? Yes | No

    Default Re: codelock with touch screen Pixxi25P4CT and PIC18F26K22

    Thanks, I will study your code.

Similar Threads

  1. Digital touch Screen Combination lock
    By astanapane in forum PBP3
    Replies: 41
    Last Post: - 19th August 2020, 14:41
  2. 4 Wire resistive touch screen, Need help
    By Megahertz in forum mel PIC BASIC Pro
    Replies: 16
    Last Post: - 16th February 2012, 17:28
  3. Touch screen 4-wire interface
    By Demon in forum General
    Replies: 6
    Last Post: - 31st December 2011, 18:02
  4. touch screen
    By micro in forum General
    Replies: 1
    Last Post: - 13th January 2006, 03:39
  5. Touch Screen Wish List!!!
    By Amity in forum PBP Wish List
    Replies: 2
    Last Post: - 15th September 2005, 14:40

Members who have read this thread : 9

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts