View previous topic :: View next topic |
Author |
Message |
michaeltolini
Joined: 17 Nov 2014 Posts: 8
|
Driver kbd doesn't work [Solved] |
Posted: Sun Mar 31, 2019 10:19 am |
|
|
I have found the following driver on this forum but it doesn't work.
Does anybody have any idea where is the problem ?
Note, with the same keypad and the official kbd driver it works but i need 16 keys keypad.
Code: | //Keypad connection:
#define row0 PIN_B4
#define row1 PIN_B5
#define row2 PIN_B6
#define row3 PIN_B7
#define col0 PIN_B0
#define col1 PIN_B1
#define col2 PIN_B2
#define col3 PIN_B3
// Keypad layout:
char const KEYS[4][4] =
{{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};
#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()
{
//set_tris_b(0xF0);
//output_b(0xF0);
port_b_pullups(true);
}
short int ALL_ROWS (void)
{
if(input (row0) & input (row1) & input (row2) & input (row3))
return (0);
else
return (1);
}
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:
output_low(col0);
output_high(col1);
output_high(col2);
output_high(col3);
break;
case 1:
output_high(col0);
output_low(col1);
output_high(col2);
output_high(col3);
break;
case 2:
output_high(col0);
output_high(col1);
output_low(col2);
output_high(col3);
break;
case 3:
output_high(col0);
output_high(col1);
output_high(col2);
output_low(col3);
break;
}
if(kbd_down)
{
if(!ALL_ROWS())
{
kbd_down=false;
kchar=last_key;
last_key='\0';
}
}
else
{
if(ALL_ROWS())
{
if(!input (row0))
row=0;
else if(!input (row1))
row=1;
else if(!input (row2))
row=2;
else if(!input (row3))
row=3;
last_key =KEYS[row][col];
kbd_down = true;
}
else
{
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
return(kchar);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Mar 31, 2019 10:29 am |
|
|
Post a test program that uses this keypad driver.
Post the full test program, with:
#include for the PIC
#fuses
#use delay
#include for the keypad driver
main()
{
etc. |
|
|
michaeltolini
Joined: 17 Nov 2014 Posts: 8
|
|
Posted: Sun Mar 31, 2019 12:42 pm |
|
|
Code: |
#include <16F887.h>
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES NOWRT //Program memory not write protected
#use delay(internal=8000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#ZERO_RAM
#include <flex_full_lcd.c>
#include <kbd_16_keys.c>
char k;
///////////////////////////////MAIN MENU///////////////////////////////////////
void main()
{
lcd_init();
kbd_init();
port_b_pullups(1);
lcd_putc("\f TOOL LIFETIME");
lcd_putc("\n<#=ENTER *=SKIP>");
while(true)
{
k=kbd_getc();
if(k!=0)
if(k=='*')
lcd_putc("\f ");
else
lcd_putc(k);
}
}
|
|
|
|
michaeltolini
Joined: 17 Nov 2014 Posts: 8
|
|
Posted: Sun Mar 31, 2019 12:44 pm |
|
|
Thanks for noticing me |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19520
|
|
Posted: Sun Mar 31, 2019 12:46 pm |
|
|
and one critical thing. What processor.
The line that leaps out as possibly giving problems, is:
port_b_pullups(true);
Some chips require every pullup bit set separately, so would need
port_b_pullups(0b11110000;
rather than the simple 'true' value. This would stop the keypad from working. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Sun Mar 31, 2019 2:48 pm |
|
|
hmm..you got me confused... are you saying..
1) the CCS supplied driver works fine with a 12 key kpd.
2) the 'found' driver works fine with a 12 key kpd.
3) the 'found' driver does NOT work with 16 key kpd?
if #3, it might be wiring...
Jay |
|
|
michaeltolini
Joined: 17 Nov 2014 Posts: 8
|
|
Posted: Sun Mar 31, 2019 3:51 pm |
|
|
I mean the keypad works with kbc.c but doesn't with the driver i found here |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Sun Mar 31, 2019 4:30 pm |
|
|
The easy way would be to take the working kbd.c that CCS supplies, copy it, then using the CCS version, modify the copy to accept the 4th column. From a hardware aspect you're only adding one I/O line and maybe a resistor. Software is just the additional 4th column code.
If I had a 4x4 kpd, I'd do it but I only have 4x3 kpds here...
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Mar 31, 2019 5:23 pm |
|
|
michaeltolini wrote: | I mean the keypad works with kbc.c but doesn't with the driver i found here |
Did you modify the following line, like Ttelmah said:
Change this line in your program from this:
Quote: | port_b_pullups(1);
|
To this:
Code: | port_b_pullups(0xF0);
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Mon Apr 01, 2019 8:05 am |
|
|
curious.. I looked at the datasheet and that PIC has INDIVIDUAL pullups, so 'TRUE' will not work, you need to Mr. T's 0xF0 format.
Jay |
|
|
michaeltolini
Joined: 17 Nov 2014 Posts: 8
|
|
Posted: Mon Apr 01, 2019 3:27 pm |
|
|
Finally i modified the original kbd.c and added the 4th column
Thanks for your help |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9229 Location: Greensville,Ontario
|
|
Posted: Tue Apr 02, 2019 4:56 am |
|
|
I hope you really modified a COPY and not the original code...
There's nothing worse than taking good, working code...making 'one little' change' and then having to spend an entire weekend trying to get back to the original.....
Yeah , BTDT.....
I even make copies of copies now.....
Every project has it's own folder, copy of the device header and my library files,like kbd, LCD,etc. There can be 50-60-100 versions to the program, ALL are in the folder. HDs have LOTS of space and I have little time.
Jay |
|
|
|