interface Keypad with PIC24F

Thread Starter

pic24fprogrammer

Joined Feb 28, 2011
1
schematic.jpg

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
#else
#byte kbd = 0xF83 // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
#byte kbd = 0x02CA // on to port B (at address 6)
#else
#byte kbd = 8 // on to port D (at address
#endif
#endif

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



//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)

#endif

#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'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}};

#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;

kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
}

if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==3)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}
 
Top