A 4x4 keypad will require 8 i/o lines. the keypad is connected to the microcontroller (PIC18F45K22) as shown below in the Proteus Schematic:
Proteus Schematic |
Row pins is connected to D4-D7
Keypad scanning is done to determine which key is pressed.
A high signal is sent to one of the column lines: for instance, a logic high is given to col. 1 which is connected to PORT D0, the microcontroller reads the state of the row pins PORT D4 - D7, if the D-Row (PORT D7) is high, then the asterisk (*) button is pressed. A logic high signal is also applied to other columns through the microcontroller port and the rows are read again.
Assuming col 2 is high, the microcontroller reads the state of the row pins PORT D4 - D7, if Row C (PORT D6) is high, then 8 button is pressed.
This procedure is repeated for all the columns continuously.
MikroC has library functions for keypad inputs, go to the MikroC help files and search for Keypad. The library routines are:
- keypad_Init()
- keypad_Key_Press()
- keypad_Key_Click()
MikroC Code:
/**********************************
Project Name :
Interfacing keypad with PIC 18F45k22
Author : Promise
Description :
This project demonstrate how to interface A MATRIX keypad with PIC 18F45K22. The keypad is connected to PORTD, and the LCD PORTB
Test configuration:
MCU: PIC18F45K22
http://ww1.microchip.com/downloads/en/DeviceDoc/41412D.pdf
Dev.Board: EasyPIC7
http://www.mikroe.com/easypic/
Oscillator: 16.00000 MHz
SW: mikroC PRO for PIC
http://www.mikroe.com/mikroc/pic/
* NOTES:
- Pull-down PORTD (PortD three-state switch).
- Turn on LCD backlight SW4.6 (board specific)
***********************************/
unsigned short kp, count, 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() {
count = 0; // Reset counter
Keypad_Init(); // Initialize Keypad
ANSELB = 0; // Configure AN pins as digital I/O
ANSELD = 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1, 1, "Press any Key"); // Write message text on LCD
Lcd_Out(2, 1, "After 2 secs");
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
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
}
Lcd_Chr(1,++count, kp); // Print key ASCII value on LCD
if (count == 16) { // If counter variable overflow
Lcd_Out(2, 1, "Wait for 2 secs");
delay_ms(2000);
count = 0; //Reset counter
Lcd_Cmd(_LCD_CLEAR); // Clear display
}
} while (1);
}
No comments:
Post a Comment