CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

problem with flex_kbd ???

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
omid_juve



Joined: 25 Oct 2012
Posts: 8

View user's profile Send private message

problem with flex_kbd ???
PostPosted: Tue Oct 30, 2012 8:52 am     Reply with quote

dear sir
Please read my easy program. I want to show a key pressed by keypad
on lcd with flex_kbd.c but it doesn't write anything. But when i use kbd.c driver and put the keypad on PortB everything is fine, so i think something is wrong with the driver. Can you please check it.

Code:

#include <flex_kbd.c>
#define LCD_ENABLE_PIN  PIN_E3                                   
#define LCD_RS_PIN      PIN_E2
#define LCD_RW_PIN      PIN_F1
#define LCD_DATA4       PIN_D3                                    ////
#define LCD_DATA5       PIN_D2                                    ////
#define LCD_DATA6       PIN_D1                                   ////
#define LCD_DATA7       PIN_D0                                    ////
#include <lcd.c>

void main()
{
char c;
port_b_pullups(0XFF);

lcd_init();
kbd_init();
lcd_putc("ready");

while(TRUE)
 {
  c = kbd_getc();
  if (c!='\0')
     lcd_putc(c);
 }


///////////////////////////////////////////////////////////////////////////
////                             Flex_KBD.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.                        ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////


//Keypad connection: 

#define col0 PIN_c2
#define col1 PIN_c3
#define col2 PIN_c4
#define row0 PIN_c5
#define row1 PIN_b7
#define row2 PIN_b6
#define row3 PIN_b5

// 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() {
}


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);
                    break;
         case 1   : output_high(col0);
               output_low(col1);
               output_high(col2);
                    break;
         case 2   : output_high(col0);
               output_high(col1);
               output_low(col2);
                    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==3)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  return(kchar);
}
temtronic



Joined: 01 Jul 2010
Posts: 9241
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Oct 30, 2012 11:03 am     Reply with quote

First. Please do not post any CCS programs or drivers. It's against forum policy and everyone who bought the compiler has copies.

2nd. The driver does work fine,has for years.

3rd. Your program is not complete, we don't know the PIC you're using.There could easily be a conflict with the pins you've chosen with other peripherals( say the ADC,UART,etc.) that requires you to disable those devices.

4th. It's a good idea to toggle an LED in these simpler programs to verify the PIC is running as you could have an LCD wiring problem or other issue.

hth
jay
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Oct 30, 2012 11:47 am     Reply with quote

Actually the flex_kbd driver was posted by Ahmed in the code library.
It's not CCS code.


The most common problem with keypad driver is that you forgot to put
pull-up resistors on the row pins. Each row pin must have this circuit:
Code:

             10K
    +5v ---/\/\/\/---
                    |
                    |
PIC pin ------------o---------- Keypad row pin
 

That requires a total of 4 pull-up resistors. You can also use 4.7K phms
or some other value.

You might say that you have enabled PortB pull-ups, but one of your
row pins is on Port C, so you still need to add a pull-up to Pin C5:
Code:

#define row0 PIN_c5
#define row1 PIN_b7
#define row2 PIN_b6
#define row3 PIN_b5
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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