This web site uses cookies. By continuing to browse the site you are agreeing to our use of cookies. Find out more.

Picmicro and keypads 4x3

Last update: 31/07/2015

The use of a numeric keypad with a microcontroller (16F87x) is a trivial task especially using compilers like mikroC because it offers all libraries necessary for the purpose.

Sometimes it is difficult to find the right pin and make connections being sold as they are, without any indication.

In the picture below, one of the most common keypads, object of our example, the 4x3 keypad. We have to pay attention to the connection of such keypad with the pins of a microcontroller especially as per the fact that there are on the market a couple of versions using different pin dispositions:

 

Kepypad 3x4 4x3

This is the most common keypad (4x3 or 4x4) and it has such a configuration (to be checked by a tester):

Key1: pin 2-3
Key2: pin 1-2
Key3: pin 2-5
Key4: pin 3-7
Key5: pin 1-7
Key6: pin 5-7
Key7: pin 3-6
Key8: pin 1-6
Key9: pin 5-6
Key0: pin 1-4
Key*:  pin 3-4
Key#: pin 5-4

Such configuration can be considered valid even if (like in the picture) there are more pins available. The pins not connected can be simply ignored.

This kind of keypad is much more rare (typically used for telephone or intercom systems - see Ak207 Keypad) but they have a better quality being arranged to operate in open air and, sometimes, even backlighted. Unfortunately it has a different pin arrangement.

This fact does not alter the functionality of the project, we have simply to consider the different connections.


.

207

In principle, most of the numeric keypads commercially distribuited follow this pinout (and it is difficult that a connection error could damage a picmicro, anyway).

At this point, directly taking advantage of an example of mikroC Library, we can test the keypad using the following program for a picmicro (16F88x), even using an lcd:

 

unsigned short kp, cnt, oldstate = 0;
char txt[6];

// Keypad module connections
char  keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

void main() {
  cnt = 0;                                 // Reset counter
  Keypad_Init();                           // Initialize Keypad                              
  ANSEL  = 0;                              // Configure AN pins as digital I/O
  ANSELH = 0;
  Lcd_Init();                              // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                     // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
  Lcd_Out(1, 1, "1");
  Lcd_Out(1, 1, "Key  :");                 // Write message text on LCD
  Lcd_Out(2, 1, "Times:");

  do {
    kp = 0;                                // Reset key code variable

    // Wait for key to be pressed and released
    do
      // kp = Keypad_Key_Press();          // Store key code in kp variable
      kp = Keypad_Key_Click();             // Store key code in kp variable
    while (!kp);
   // Prepare value for output, transform key to it's ASCII value
    switch (kp) {
      //case 10: kp = 42; break;  // '*'   // Uncomment this block for keypad4x3
      //case 11: kp = 48; break;  // '0'   
      //case 12: kp = 35; break;  // '#'
      //default: kp += 48;

      case  1: kp = 49; break; // 1        // Uncomment this block for keypad4x4
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  4: kp = 65; break; // A
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  8: kp = 66; break; // B        
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 12: kp = 67; break; // C
      case 13: kp = 42; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 35; break; // #
      case 16: kp = 68; break; // D

    }

    if (kp != oldstate) {                  // Pressed key differs from previous
      cnt = 1;
      oldstate = kp;
      }
    else {                                 // Pressed key is same as previous
      cnt++;
      }

    Lcd_Chr(1, 10, kp);                    // Print key ASCII value on LCD

    if (cnt == 255) {                      // If counter varialble overflow
      cnt = 0;
      Lcd_Out(2, 10, "   ");
      }

    WordToStr(cnt, txt);                   // Transform counter value to string
    Lcd_Out(2, 10, txt);                   // Display counter value on LCD
  } while (1);
}

Nothing will change using a 4x4 Keypad, we have to connect pin column (Col3), missing in a 4x3 keypad. You will notice that the pressure of one of the letters (ABCD) on the keypad will be recognized by the microcontroller (modifying the program as indicated).

Diritti riservati Cuteminds.com 2008-2015. Tutti i marchi riportati sono detenuti dai legittimi proprietari. Tutto il materiale e` liberamente utilizzabile ma non per scopi commerciali. Non si assume alcuna responsabilita` sul materiale pubblicato per eventuali danni diretti o indiretti che possano derivare dall`utilizzo di schemi, progetti o altro materiale presente nel sito. Inviare una mail a: remove-admin@cuteminds.com (contenuti) remove-webmaster@cuteminds.com (webserver) per domande e/o suggerimenti.