Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

PIC24f (PIC24fJ64GB002) keypad interface with LCD

Status
Not open for further replies.

pic24fprogrammer

Newbie level 3
Joined
Feb 27, 2011
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,353
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. I have connected Db7-Db4 from B7-B3 (since this microchip doesn't have B6) and RS,RW,E to B2,B1,B0.

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 8)
#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);
}
 

hi
can you add your circuit diagram ?
it can help
 

schematic.jpg

Here is the schematic.... The ones with Red crosses on them I cannot use them for Keypad..... Port B pin Rb5 is not remappable pin so cant be used for motor but can be used as I/O pin....

All the information regarding the microcontroller can be loooked at its datasheet please can you give some idea how to connect the keypad to microcontroller at same I/o pins used by LCD and what should be changed in the KBD.c code???

Thank you!!!
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top