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.

keypad program for PIC16F877A

Status
Not open for further replies.

rahulka

Newbie level 1
Joined
Jun 26, 2013
Messages
0
Helped
0
Reputation
0
Reaction score
0
Trophy points
0
Activity points
0
Hi, every one. I'm working on PIC16F877A micro-controller and I want to implement the full 4X4 keypad. I had tried number of times but it doesn't gives any o/p and remains in same loop as now key is pressed. My program is as below, suggest me any suggestions with these or please provide me any working keypad program you have on same pic.

/*************** Keypad Using PortB *******************/
//make rows high and check columns one by one
//PORTB <7:4> is connected to the columns and make it i/p
//PORTB <3:0> is connected to the rows and make it o/p

#include<pic.h>

__CONFIG(0x3F3A);

void fun_07(unsigned int);
void fun_0B(unsigned int);
void fun_0D(unsigned int);
void fun_0E(unsigned int);

unsigned int d_select[4] = {0x01,0x02,0x04,0x08};

void disp_7seg(unsigned int disp,unsigned int digit)
{
int i;
unsigned int value[16] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E};
PORTA = digit;
PORTD = value[disp];
}
void delay(void) //delay for 20 milli seconds
{
unsigned int i,j;

for(i=0; i<200; i++)
for(j=0; j<1275; j++);
}
void main()
{
unsigned int var, value;

TRISA = 0x00; //for 7-segment display digit selection
PORTA = 0x00; //Clear the earlier containts
TRISB = 0xF0; //for keypad purpose
PORTB = 0x00;
TRISD = 0x00; //PORTD<7:1> for 7-segment data transmission and RB0 for LED
PORTD = 0x00;
while(1)
{
/************ keypad_operation ********************/
PORTB = 0x0f; //I/P pins of keypad are made high,
//Note that only we will continuously check the i/p pins
delay();
while((PORTB & 0x0f) == 0x0f) //loop will break only when the key is pressed
{
disp_7seg(1,d_select[0]); //FOR JUST CHECKING THE LOOP WORKING
// delay();
}

// PORTB = 0x0E;
value = PORTB;
var = (value & 0x0F); //var may be among 0x07, 0x0B, 0x0D and 0x0E;
switch(var)
{
case 0x07: fun_07(value);
break;

case 0x0B: fun_0B(value);
break;

case 0x0D: fun_0D(value);
break;

case 0x0E: fun_0E(value);
break;
//default :
}
}
}

void fun_07(unsigned int v)
{
switch(v)
{
case 0x77: disp_7seg(0,d_select[0]);
delay();
break;

case 0xB7: disp_7seg(1,d_select[0]);
delay();
break;

case 0xD7: disp_7seg(2,d_select[0]);
delay();
break;

case 0xE7: disp_7seg(3,d_select[0]);
delay();
break;
// default: exit(0);
}
}

void fun_0B(unsigned int v)
{
switch(v)
{
case 0x7B: disp_7seg(4,d_select[0]);
delay();
break;

case 0xBB: disp_7seg(5,d_select[0]);
delay();
break;

case 0xDB: disp_7seg(6,d_select[0]);
delay();
break;

case 0xEB: disp_7seg(7,d_select[0]);
delay();
break;
// default: exit(0);
}
}

void fun_0D(unsigned int v)
{
switch(v)
{
case 0x7D: disp_7seg(8,d_select[0]);
delay();
break;

case 0xBD: disp_7seg(9,d_select[0]);
delay();
break;

case 0xDD: disp_7seg(10,d_select[0]);
delay();
break;

case 0xED: disp_7seg(11,d_select[0]);
delay();
break;
// default: exit(0);
}
}

void fun_0E(unsigned int v)
{
switch(v)
{
case 0x7E: disp_7seg(12,d_select[0]);
delay();
break;

case 0xBE: disp_7seg(13,d_select[0]);
delay();
break;

case 0xDE: disp_7seg(14,d_select[0]);
delay();
break;

case 0xEE: disp_7seg(15,d_select[0]);
delay();
break;
// default: exit(0);
}
}
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top