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.

keypad4x4 at portB pic16f877a not working

Status
Not open for further replies.

rimaaratri

Newbie level 2
Joined
Jun 18, 2015
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
42
I new to use PIC16F877a, now I'm tried the interface between the LCD 16x2 and keypad 4x4. lcd at portD and keyad at PORTB, but my keypad is not working, i work with disable LVP conditions and my program write in mikroC. my question what was wrong in my project?

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
94
95
96
97
98
99
100
unsigned short kp, cnt, oldstate = 0;
char txt[6];
 
// Keypad module connections
char  keypadPort at PORTB;
// End Keypad module connections
 
// LCD module connections
sbit LCD_RS at RA5_bit;
sbit LCD_RW at RA4_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 TRISA5_bit;
sbit LCD_RW_Direction at TRISA4_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() {
  ADCON1 = 0X0F;             //All A to D pin on PortA to digital
  CMCON = 0X07;             //Disable comparators
  TRISA4_bit = 1;
 
  OPTION_REG.B7 = 0;
  TRISB = 1;
  PORTB = 0;
  TRISD = 0;
  PORTD = 0;
  TRISA = 0;
  PORTA = 0;
  cnt = 0;                                 // Reset counter
  Keypad_Init();                           // Initialize Keypad
 
  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);
}

 

doraemon

Super Moderator
Staff member
Joined
Jun 21, 2009
Messages
1,068
Helped
273
Reputation
554
Reaction score
248
Trophy points
1,343
Location
Japan
Activity points
10,597
Hello!

1. You may consider being polite, you could for instance, say hello, please, etc...
2. You don't say what is not working in your project. Did you try to trace the problem with a debugger?

Now I'm not going to compile it, but there is something strange:

In your loop:

Code C - [expand]
1
2
3
4
5
6
while(1) {
        // stuff deleted
        kp = Keypad_Key_Click();             // Store key code in kp variable
        while (!kp);
        // other stuff deleted
    }



Let's say that at first, kp as returned by your click function is still 0. How do you expect it
to pass the while (!kp);?
It will hang there forever.
Solution: remove any potentially blocking loop and it will stop blocking.

Now you may consider changing your program and use interrupts. One personal rule:
never put anything in the while(1) loop and do everything with interrupts.

Dora.
 

LeoStar

Member level 2
Joined
Nov 19, 2014
Messages
50
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
500
Are you working on proteus or live hardware??
 

pic.programmer

Advanced Member level 3
Joined
Aug 19, 2015
Messages
773
Helped
141
Reputation
284
Reaction score
140
Trophy points
43
Activity points
7,542
Why is TRISB configured as 0x01 ? You are using mikroC PRO PIC Keypad library and it will configure the trisx of port used for keypad. Remove the line

Code:
TRISB = 1;

and see if that works.
 

pic.programmer

Advanced Member level 3
Joined
Aug 19, 2015
Messages
773
Helped
141
Reputation
284
Reaction score
140
Trophy points
43
Activity points
7,542
For PIC16F877A to turn off ADC on all pins you have to use

Code:
ADCON1 = 0x87;

or 

ADCON1 = 0x07;

or 

ADCON = 0x86;

or 

ADCON = 0x06;

RA4 is used for LCD and so you have to remove

Code:
TRISA4_bit = 1;

but in your code it is not needed as TRISA is again set to all 0 later.

Edit:

Remove these two lines

Code:
sbit LCD_RW at RA4_bit;
sbit LCD_RW_Direction at TRISA4_bit;

because mikroC PRO library doesn't use RW pin of LCD and also it requires you to ground the RW pin of LCD. So, ground the RW pin and try.
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top