interface Keypad with PIC24F

Discussion in 'Embedded Systems and Microcontrollers' started by pic24fprogrammer, Feb 28, 2011.

  1. pic24fprogrammer

    Thread Starter New Member

    Feb 28, 2011

    Hi all,

    I want to interface my Keypad with the PIC24F microcontroller (PIC24FJ64GB002) with PIC PCWHD compiler. I have my lcd hooked up already and its working fine but now i cant seem to get the keypad working.

    This is how my LCD is configured,
    #define LCD_ENABLE_PIN PIN_B1 ////
    #define LCD_RS_PIN PIN_B0 ////
    #define LCD_RW_PIN PIN_B2 ////
    #define LCD_DATA4 PIN_B10 ////
    #define LCD_DATA5 PIN_B9 ////
    #define LCD_DATA6 PIN_B8 ////
    #define LCD_DATA7 PIN_B7

    Since my microcontroller doesn't have a port D... I have to use port B for connections. I am trying to use the KBD.c file provided by PCWcompiler. I don't have any I/O pins left except one more. I have interfaced Keypad with PIC18F before and for that purpose I connect keypad and LCD to the same I/O pins of the microcontroller. And it works perfectly fine as LCD replaces the required pull up resistors.

    Can I do the same for PIC24F and have LCD and Keypad connect to same points? Since I have to use port B and my chip is PCD (not PCH) I beleive I have make changes in the KBD.c file.

    This is what I've done
    Uncommented #define use_portb_kbd TRUE

    Changed the address
    #if defined use_portb_kbd
    #byte kbd = 0x02CA

    I think I am not doing the second part right. I gave the address of PortB but it is 16 bit not 8 bit unlike 18F. Am I on the right track. In the schematic the red crosses are where i can't connect anything. Port B doesn't have B6, B12 so i cant use continuous pins as well.

    Can someone give me the exact connections or any suggestions for what am I supposed to change in the KBD.c code and how my connections should be?

    This is the KBD.C file:

    //// KBDD.C ////
    //// Generic keypad scan driver ////
    //// ////
    //// kbd_init() Must be called before any other function. ////
    //// ////
    //// c = kbd_getc(c) Will return a key value if pressed or /0 if not ////
    //// This function should be called frequently so as ////
    //// not to miss a key press. ////
    //// ////
    //// (C) Copyright 1996,2003 Custom Computer Services ////
    //// This source code may only be used by licensed users of the CCS C ////
    //// compiler. This source code may only be distributed to other ////
    //// licensed users of the CCS C compiler. No other use, reproduction ////
    //// or distribution is permitted without written permission. ////
    //// Derivative programs created using this software in object code ////
    //// form are not restricted in any way. ////

    ////////////////// The following defines the keypad layout on port D

    // Un-comment the following define to use port B
    #define use_portb_kbd TRUE

    // Make sure the port used has pull-up resistors (or the LCD) on
    // the column pins

    #if defined(__PCH__)
    #if defined use_portb_kbd
    #byte kbd = 0xF81 // This puts the entire structure
    #byte kbd = 0xF83 // This puts the entire structure
    #if defined use_portb_kbd
    #byte kbd = 0x02CA // on to port B (at address 6)
    #byte kbd = 8 // on to port D (at address

    #if defined use_portb_kbd
    #define set_tris_kbd(x) set_tris_b(x)
    #define set_tris_kbd(x) set_tris_d(x)

    //Keypad connection: (for example column 0 is B2)
    // Bx:

    #ifdef blue_keypad ///////////////////////////////////// For the blue keypad
    #define COL0 (1 << 2)
    #define COL1 (1 << 3)
    #define COL2 (1 << 6)

    #define ROW0 (1 << 4)
    #define ROW1 (1 << 7)
    #define ROW2 (1 << 1)
    #define ROW3 (1 << 5)

    #else ////////////////////////////////////////////////// For the black keypad
    #define COL0 (1 << 5)
    #define COL1 (1 << 6)
    #define COL2 (1 << 7)

    #define ROW0 (1 << 1)
    #define ROW1 (1 << 2)
    #define ROW2 (1 << 3)
    #define ROW3 (1 << 4)


    #define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
    #define ALL_PINS (ALL_ROWS|COL0|COL1|COL2)

    // Keypad layout:
    char const KEYS[4][3] = {{'1','2','3'},

    #define KBD_DEBOUNCE_FACTOR 33 // Set this number to apx n/333 where
    // n is the number of times you expect
    // to call kbd_getc each second

    void kbd_init() {

    char kbd_getc( ) {
    static BYTE kbd_call_count;
    static int1 kbd_down;
    static char last_key;
    static BYTE col;

    BYTE kchar;
    BYTE row;

    if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
    switch (col) {
    case 0 : set_tris_kbd(ALL_PINS&~COL0);
    case 1 : set_tris_kbd(ALL_PINS&~COL1);
    case 2 : set_tris_kbd(ALL_PINS&~COL2);

    if(kbd_down) {
    if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
    } else {
    if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
    if((kbd & ROW0)==0)
    else if((kbd & ROW1)==0)
    else if((kbd & ROW2)==0)
    else if((kbd & ROW3)==0)
    last_key =KEYS[row][col];
    kbd_down = TRUE;
    } else {