|
|
View previous topic :: View next topic |
Author |
Message |
cfernandez
Joined: 18 Oct 2003 Posts: 145
|
Keypad Problem in 18F8720 |
Posted: Tue Mar 23, 2004 2:41 pm |
|
|
In my circuit I connect a keypad (4x3) on PORT E and not is possible to work.
The pinout is:
E0 NC
E1 COL0
E2 COL1
E3 COL2
E4 ROW0
E5 ROW1
E6 ROW2
E7 ROW3
In the circuit i connect pull up resistor the 10 k value.
Is possible that the PORT E is not use for this job?? or which is the solution for my problem.
Thank you very much |
|
|
mystery Guest
|
port e |
Posted: Tue Mar 23, 2004 3:14 pm |
|
|
having looked at the datasheet, port e is the data bus for external memory.
if you want to use port e as normal pins you need to:
set bit 7 of memcon register!!!!!!!!! |
|
|
picker
Joined: 07 Sep 2003 Posts: 19 Location: South Africa
|
Keypad and 18F8720 |
Posted: Wed Mar 24, 2004 11:20 am |
|
|
Did you use the CCS driver for a keypad? If you did, you have run into the same problem that I had some months ago. It has something to do with the driver. I ended up writing a much simpler driver which might use more program memory but it works!
Picker |
|
|
cfernandez
Joined: 18 Oct 2003 Posts: 145
|
|
Posted: Wed Mar 24, 2004 5:59 pm |
|
|
Hi,
I modify KBD.C from CCS drivers and put in the kbd_init() set_bit( MEMCOM, 7), previous declare #byte MEMCOM= 0xF9C and not WORK!!
This the KBD.C code
Code: |
///////////////////////////////////////////////////////////////////////////
//// 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
#byte kbd = 0xF84 // This puts the entire structure
#byte MEMCOM = 0xF9C
#define set_tris_kbd(x) set_tris_e(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)
#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() {
bit_set( MEMCOM, 7)
}
char kbd_getc( ) {
static BYTE kbd_call_count;
static short int 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);
}
|
ANY SOLUTION?????????
Thanks, |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|