Programming problem while interfacing keypad with pic 16f877a


Closed Thread
Results 1 to 1 of 1
  1. #1
    Join Date
    May 2010
    Posts
    19

    Default Programming problem while interfacing keypad with pic 16f877a

    Hey guys,
    I am trying to interface 4x4 keypad with my pic and lcd. Everything is working fine except the last row of my keypad (i.e keys from 13-16) is not displayed on lcd. There is no problem in the hardware as i checked the keypad replacing rows with columns. I think there is some problem in the program. Can you guys help me out with this?

    Regards.

    Below is the program which i used:


    Code:
    ' Define LCD connections
    DEFINE OSC 20
    DEFINE LCD_DREG PORTD
    define LCD_DBIT 0
    DEFINE LCD_RSREG PORTE
    DEFINE LCD_RSBIT 0
    DEFINE LCD_EREG PORTE
    DEFINE LCD_EBIT 1
    DEFINE LCD_RWREG PORTE
    DEFINE LCD_RWBIT 2
    DEFINE LCD_BITS 8
    DEFINE LCD_LINES 2
    DEFINE LCD_COMMANDUS 2000
    DEFINE LCD_DATAUS 50
    ' Define program variables
    col var byte ' Keypad column
    row var byte ' Keypad row
    key var byte ' Key value
     
    OPTION_REG.7 = 0 ' Enable PORTB pullups
    ADCON1 = 7 ' Make PORTA and PORTE digital
     
    Low PORTE.2 ' LCD R/W low (write)
     
    Pause 500 ' Wait for LCD to start
     
    Lcdout $fe, 1
    pause 250
    lcdout "Press any key" ' Display sign on message
     
    loop: Gosub getkey ' Get a key from the keypad
    Lcdout $fe, 1, #key ' Display ASCII key number
    Goto loop ' Do it forever
     
    ' Subroutine to get a key from keypad
    getkey: 
    PAUSE 50 'Debounce key-input
    getkeyu:' Wait for all keys up
    PORTB = 0 ' All output-pins low
    TRISB = $f0 ' Bottom 4-pins out, top 4-pins in
    IF ((PORTB >> 4) != $f) THEN getkeyu'If keys down, loop
    PAUSE 50 ' Debounce key-input
     
    getkeyp:' Wait for keypress
    FOR col = 0 TO 3 ' 4 rows in keypad
    PORTB = 0 ' All output-pins low
    TRISB = (DCD col) ^ $ff ' Set one row pin to output
    row = PORTB >> 4 ' Read columns
    IF row != $f THEN gotkey' If any keydown, exit
    NEXT col
    GOTO getkeyp ' No keys down, go look again
     
    gotkey: ' Change row and column to key number 1 - 16 
    key = (col * 4) + (NCD (row ^ $f))
    'NOTE: for 12-key keypad, change to key = (row * 3)
    RETURN ' Subroutine over
     
    END
    Last edited by ScaleRobotics; - 20th July 2010 at 18:03. Reason: added code tags

Members who have read this thread : 0

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