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:
|
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 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. . |
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).