Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Ur help is needed in interfacing 4x4 keypad

Status
Not open for further replies.

praveen_palaparthi

Full Member level 1
Joined
Feb 15, 2008
Messages
98
Helped
3
Reputation
6
Reaction score
2
Trophy points
1,288
Activity points
2,214
hi friends i tried to interface 4x4 matrix keypad to pic 16f877 can any give me the source code in C to check which key is pressed


this is the code i have tried in hitech pic C complier
/*****************MAIN PROGRAM*****************/
main()
{
unsigned char i;
unsigned char key_pad[4][4]={ {'D','E','F',0},{9,'A','B','C'},{5,6,7,8},{1,2,3,4} };
OPTION=0x00; //enable pull up resistors by individual latch values
INTCON=0xC8; // enable Port B change interrupt
lcd(); //LCD intialization
keypad_matrix(); //4x4 matrix keypad intialization
while(1)
{
PORTB=0xF0; //All inputs are pulled to high
RA4=1;
PORTE= 0x07; // All outputs are pulled high
for(i=0;i<=3;i++)
{
switch(i)
{
case 0:
RA4=0;
if(RB4==0) //checking input is low
lcd_display(key_pad[0][0]);
else if(RB5==0)
lcd_display(key_pad[1][0]);
else if(RB6==0)
lcd_display(key_pad[2][0]);
if(RB7==0)
lcd_display(key_pad[3][0]);

break;
case 1:
RE0=0;
if(RB4==0) //checking input is low
lcd_display(key_pad[0][1]);
else if(RB5==0)
lcd_display(key_pad[1][1]);
else if(RB6==0)
lcd_display(key_pad[2][1]);
if(RB7==0)
lcd_display(key_pad[3][1]); //checking input is low
break;
case 2:
RE1=0;
if(RB4==0) //checking input is low
lcd_display(key_pad[0][2]);
else if(RB5==0)
lcd_display(key_pad[1][2]);
else if(RB6==0)
lcd_display(key_pad[2][2]);
if(RB7==0)
lcd_display(key_pad[3][2]); //checking input is low
break;
case 3:
RE2=0;
if(RB4==0) //checking input is low
lcd_display(key_pad[0][3]);
else if(RB5==0)
lcd_display(key_pad[1][3]);
else if(RB6==0)
lcd_display(key_pad[2][3]);
if(RB7==0)
lcd_display(key_pad[3][3]); //checking input is low
break;
}

}
}
}


void interrupt portb_change(void)
{
if(RBIF)
{
RBIF=0;
PORTB=0xF0; //All inputs are pulled to high
RA4=1;
PORTE= 0x07; // All outputs are pulled high
}
}

/************ROUTINES*********************************/

#include<pic.h>
#include "key.h"
#include "delay.h"
#define LCD_RS RB4
#define LCD_RW RB5
#define LCD_E RA2
#define LCD_DATA PORTB
#define LCD_STROBE ((LCD_E=1),(LCD_E=0))

__CONFIG(XT & WDTDIS & LVPDIS & UNPROTECT);

void lcd(void)
{
TRISB=0xC0;
PORTB=0;
lcd_init();
lcd_clear();
}
void lcd_init(void)
{

LCD_RS=0;
LCD_RW=0;
LCD_E=0;
DelayMs(40);
LCD_DATA=0x03;
DelayMs(5);
LCD_DATA=0x03;
DelayUs(100);
LCD_DATA=0x03;
DelayUs(40);
LCD_DATA=0x02;
DelayUs(40);
lcd_write(0x20);
DelayUs(40);
lcd_write(0x08);
DelayUs(40);
lcd_write(0x0F);
lcd_write(0x06);
DelayUs(40);
}

void lcd_clear(void)
{
LCD_RS=0;
lcd_write(0x01);
LCD_STROBE;
}

void lcd_write(unsigned char c)
{
DelayUs(40);
LCD_DATA = ((c>>4) & 0x0F);
LCD_STROBE;
LCD_DATA = (c & 0x0F);
LCD_STROBE;
}

void keypad_matrix(void)
{
TRISB=0xF0; //RB7:RB4 are taken as input
TRISA=0xEF; //RA4 is taken as output
TRISE=0xF8; // RE2:RE0 is taken as output


}

void lcd_display(unsigned char c) // displays data on LCD
{
lcd_goto(0x07);
DelayMs(5);
LCD_DATA = 0;
LCD_RS = 1;
LCD_DATA |= ( ( c >> 4 ) & 0x0F );
LCD_STROBE; //high to low pulse must be applied in order for the LCD to latch in the data
LCD_DATA &= 0xF0;
LCD_DATA |= ( c & 0x0F );
LCD_STROBE;
LCD_RS=0;
}

void lcd_goto(unsigned char pos)
{
LCD_RS=0;
lcd_write(0x80+pos);
}
 

//Keypad connection:
#define ROW0 PIN_A0
#define ROW1 PIN_A1
#define ROW2 PIN_A2
#define ROW3 PIN_A3
#define COL0 PIN_C0
#define COL1 PIN_C1
#define COL2 PIN_C2
#define COL3 PIN_C3

// Keypad layout:
int const KEYS[4][4] =
{{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};

#define KBD_DEBOUNCE_FACTOR 33

short int ROW_HIGH()
{
if(input (ROW0) || input (ROW1) || input (ROW2) || input (ROW3))
return (1);
else
{
return (0);
}
}

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_high(col0);
output_low(col1);
output_low(col2);
output_low(col3);
break;

case 1:
output_low(col0);
output_high(col1);
output_low(col2);
output_low(col3);
break;

case 2:
output_low(col0);
output_low(col1);
output_high(col2);
output_low(col3);
break;

case 3:
output_low(col0);
output_low(col1);
output_low(col2);
output_high(col3);
break;
}

if(kbd_down)
{
if(!ROW_HIGH())
{
kbd_down=false;
kchar=last_key;
last_key='\0';
}
}
else
{
if(ROW_HIGH())
{
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);
}

//===========================
void main()
{
char k;

printf("\r\Starting ...");

while(TRUE)
{
k=kbd_getc();
if(k!=0)
{
if(k=='*')
printf("%c", '*');
else
printf("%c", k);
}
}
}

Its CCS code
 

// program for 4x4 matrix. using 89c52. PLease confirm the portpins of the
//hardware before running it. using 4 bit LCD
#include<reg51.h>
#include<intrins.h>

sbit rs=P0^0;
sbit en=P0^1;

void cmdwrt();
void delay();
void datawrt();
void mdata();

unsigned char dis[8]={0x20,0x20,0x28,0x0f,0x01,0x06,0x80};
unsigned char a;

main()
{
int i;
for( i=0;i<8;i++)
{
a=dis;
cmdwrt();
delay(); delay();
}
while(1)
{
P1=0x78;
a=P1;
if(a == 0x70)
{
a='0';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0x74;
a=P1;
if(a == 0x70)
{
a='1';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0x72;
a=P1;
if(a == 0x70)
{
a='2';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0x71;
a=P1;
if(a == 0x70)
{
a='3';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xb8;
a=P1;
if(a == 0xb0)
{
a='4';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xb4;
a=P1;
if(a == 0xb0)
{
a='5';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xb2;
a=P1;
if(a == 0xb0)
{
a='6';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xb1;
a=P1;
if(a == 0xb0)
{
a='7';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xd8;
a=P1;
if(a == 0xd0)
{
a='8';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xd4;
a=P1;
if(a == 0xd0)
{
a='9';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xd2;
a=P1;
if(a == 0xd0)
{
a='A';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xd1;
a=P1;
if(a == 0xd0)
{
a='B';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xe8;
a=P1;
if(a == 0xe0)
{
a='C';
delay(); delay();
datawrt();
delay(); delay();
}

P1=0xe4;
a=P1;
if(a == 0xe0)
{
a='D';
delay(); delay();
datawrt();
delay(); delay();
}


P1=0xe2;
a=P1;
if(a == 0xe0)
{
a='E';
delay(); delay();
datawrt();
delay(); delay();
}


P1=0xe1;
a=P1;
if(a == 0xe0)
{
a='F';
delay(); delay();
datawrt();
delay(); delay();
}

}
}

void cmdwrt()
{
unsigned char s=0;
s=a;
a=a & 0xf0;
a=a>>2;
rs=0;
//mdata();
//delay(); delay();
P0=a;
rs=0;
en=1;
en=0;
a=s;
a=(a<<4);
a=a & 0xf0;
a=a>>2;
rs=0;
//mdata();
P0=a;
rs=0;
en=1;
en=0;
delay(); delay();
}

void datawrt()
{
unsigned char s=0;
s=a;
a=a & 0xf0;
a=a>>2;
rs=1;
//mdata();
//delay(); delay();
P0=a;
rs=1;
en=1;
en=0;
a=s;
a=a<<4;
a=a & 0xf0;
a=a>>2;
rs=1;
//mdata();
P0=a;
rs=1;
en=1;
en=0;
delay(); delay();
}





void delay()
{
int i;
for(i=0;i<9000;i++);
}
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top