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.

i need help for configure 3x4 keypad

Status
Not open for further replies.

Nipuna56

Advanced Member level 4
Joined
Jul 11, 2012
Messages
119
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,296
Activity points
1,993
Anyone know why keypad want to ground through resistors
 

Anyone know why keypad want to ground through resistors


Can you explain a lot more about your keypad situation?

Guessing completely here but IF you've got a metal keypad and IF you're saying the metalwork is grounded through a resistor, it can be that the resistor is for electrical safety or static discharge protection.

By 'electrical safety', I mean that someone with one finger, through an electrical fault, on a live mains voltage cannot then touch a good ground of a keypad and get a dangerous shock. The resistor would limit the main current through the human.

By 'static discharge protection', I mean that someone with lots of volts of static on them cannot get an unpleasant shock when touching the good ground of a keypad or cause a dsturbing radio wave.
 

i use these kind of keypad

keypad1.JPG
 

the key pad that you mentioned in polling type of key pad.....It in my view don't require the resistance in ground .....for your information I am attaching the matrix key pad with two way switch.....One of the method to test your key pad is....configure multimeter in continuity detection mode.....then multimeter one of the lead kept on the wire or lead no 1 press the switch no 1 and see try putting other lead of multimeter to one by one other leads of key board and try to see that you get continuity ( beep sound from multimeter or not most of the cases..) as these two leads will be shorted in that case.... also mentioned in video link which I send to you....

the picture that I attached had the key board with two way switch...



Good Luck
 

when i enter some data it takes same number again and again without stopping is that fault of keypad?
 

It may be because of the problem with key board ....but that will be last possibility.....In my view you must look for the your logic first ( code ) ....

Good Luck
 

my code is Mikroc sample code for keypad
 

Ok ...Can you do one thing you can put your code on the forum so that we can debug it better... My first guess will be your are putting code in while(1) and not waiting for the key press condition....

Just put your code we will able to look what is the problem....

Good Luck
 


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
unsigned short kp, cnt, oldstate = 0;
char txt[6];
 
// Keypad module connections
char  keypadPort at PORTC;
// End Keypad module connections
 
// LCD module connections
sbit LCD_RS at RA1_bit;
sbit LCD_EN at RA3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
 
sbit LCD_RS_Direction at TRISA1_bit;
sbit LCD_EN_Direction at TRISA3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
 
void main() {
  cnt = 0;
  ADCON1 = 0x06;                        //all inputs are digital
  ADCON0 = 0x00;                               // Reset counter
  Keypad_Init();                           // Initialize Keypad
      TRISA=0;
      PORTA=0;
      PORTA.F2=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();
      DELAY_MS(10);             // 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);
}

 
Last edited by a moderator:

modify the cod like this
Code:
unsigned short kp, cnt, oldstate = 0;
char txt[6];

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

// LCD module connections
sbit LCD_RS at RA1_bit;
sbit LCD_EN at RA3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISA1_bit;
sbit LCD_EN_Direction at TRISA3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections

void main() {
cnt = 0;
ADCON1 = 0x06; //all inputs are digital
ADCON0 = 0x00; // Reset counter
Keypad_Init(); // Initialize Keypad
TRISA=0;
PORTA=0;
PORTA.F2=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();
DELAY_MS(10); // 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;
Lcd_Chr(1, 10, kp); // Print key ASCII value on LCD
}
else { // Pressed key is same as previous
cnt++;
}



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);
}


Good Luck
 

R u getting the same results I.e. getting same number entered as that of previous case
 

no it may be logical error
i think there is no problem with keypad
 

yes frnd there is no error in Proteus demonstration plz help me
 

can u explain the type of keypad which u use,not a photo of it
if u gimme the schematic of it i can help u with code....
 

sry frnd i didn't understand wht u said
 

no my frnd

- - - Updated - - -

if i use 16f887 pic for this code is that a problem?
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top