Matrix keypad interfacing pic18f4550

Status
Not open for further replies.

rahulsiva

Member level 1
Joined
Jan 23, 2015
Messages
34
Helped
1
Reputation
2
Reaction score
1
Trophy points
8
Location
coimbatore
Visit site
Activity points
208
i have refer some keypad code ..in that i seen reg ...OPTION_REG &= 0x7F;(in using..PIC16F877a) .In case of use in pic18f4550 is not working that reg.What reg do to use...instant for that reg....
 

in this pic18f4550 does not option_reg...i have refer datasheet of pic18f4550

- - - Updated - - -

i also needed to connect keypad and enable I2C...in PORT B...
 

i search option reg in pic18f4550,but in different name sum bit i can`t find out name i.e..<PS0S2>,TOSE,TOCS...given step to process...i need to connect keypad & I2C in same portB...
 

I don't know how your Option_reg configured in your reference code.but from your post #1
OPTION_REG &= 0x7F
I think it is configured for RB pull up enable so you need to find the same for your respective controller.
 

give step to program keypad for pic18f4550....when interrupt arise form PORT A0 keypad enable and enter value again it as to store in another function..it should be return back to main ...function
 

i need to connect keypad and assign i2c in same PORTB
It's not clear at all what this has to do with OPTION_REG (which isn't existing in PIC18, as you already found out).

Why don't you tell first what you exactly want to achieve. If you are possibly looking for RBPU bit, it's located in a different register, just read the datasheet. It's worth to review also the other GPIO differences between PIC16 and PIC18.
 

that not working ...So,pls provided me step to write a program a matrix (4x3)keypad program ....(in.PIC18F4550)without any reg....i needed to perform a task to do display number on LCD and LCD display number to get back another function ...what key pressed...\\\ when function enter only to keypad func only..it as to enable it..
 

compiler HI-TECH use..


- - - Updated - - -

thank for guidelines ....i need get number which displaying on the LCD in function call variable
 


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
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 RB1_bit;
sbit LCD_EN at RB0_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB0_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
void main() 
{
  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 1: kp = 49; break; // 1
      case 2: kp = 50; break; // 2
      case 3: kp = 51; break; // 3
      //case 4: kp = 65; break; // A commented since 4th column is absent for 4*3 keypad
      case 5: kp = 52; break; // 4
      case 6: kp = 53; break; // 5
      case 7: kp = 54; break; // 6
      //case 8: kp = 66; break; // B commented since 4th column is absent for 4*3 keypad
      case 9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      //case 12: kp = 67; break; // C commented since 4th column is absent for 4*3 keypad
      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);
}



 


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
101
102
103
void interrupt low_priority check_isr();
void RBIF_ISR();
 
void interrupt low_priority check_isr()        //Low Priority Interrupt
{
    if(INTCONbits.RBIF == 1)                //Check Which Casues this interrupt
    {
        RBIF_ISR();        //Call PORTB Change Interrupt Function
    }
}
 
 
unsigned char keypad[4][3] = {'1','2','3','4','5','6','7','8','9','C','0','='};
 
void main()
{
    
    TRISC = 0x10;
    TRISD = 0x00;
    lcd_init();
    __delay_ms(10);
    lcd_cmd(0x83);
    lcd_string("PIC18F4550");
    lcd_second_line();
    lcd_string("KeyPad Interface");
    __delay_ms(100);
    INTCON2bits.RBPU = 0;    //Enable Pull-Up Resistors
    TRISB = 0xF0;            //Upper pins as Input Pins and Lower Pins as Output Pin
    PORTB = 0xF0;
    
    while(PORTB != 0xF0);    //Wait Until Key Not Pressed
 
    INTCONbits.RBIE = 1;     //Enable PORT-B Change Interrupt
    INTCONbits.GIE = 1;      //Enable Global Interrupt
    lcd_cmd(0x01);
    while(1)
    {
        lcd_first_line();
        lcd_string("Key Pressed:-");
        __delay_ms(10);
    }
}
 
void RBIF_ISR()
{
    unsigned char temp,ROW = 4,COL = 0;
    unsigned char count = 0;
    temp = PORTB;        
    temp = temp ^ 0xF0;   //0b1111 0000
    if(temp == 0x00)      //If False Alram due to Noise then go Back
    {
        return;
    }
        
    while((temp=(temp<<1)) != 0)    //Find the Column
    { 
        COL++;
    }
    
    PORTB = 0xFE;    //Ground First Row //0b1111 1110
    if(PORTB != 0xFE)
    {
        ROW = 0;    //Row Selected
    }
    else
    {
        PORTB = 0xFD;    //Ground Seconmd Row //0b1111 1101
        if(PORTB != 0xFD)
        {
            ROW = 1;
        }
        else
        {
            PORTB = 0xFB;    //Ground Third Row //0b1111 1011
            if(PORTB != 0xFB)
            {
                ROW = 2;
            }
            else
            {
                PORTB = 0xF7;    //Ground 4th Row //0b1111 0111
                if(PORTB != 0xF7)
                {
                    ROW = 3;
                }
            }
        }
    }
    
    if(ROW < 4)
    {
        lcd_second_line();
        __delay_ms(10);
        lcd_dat(keypad[ROW][COL]);
        __delay_ms(10);
        lcd_first_line();
    }
    while(PORTB != 0xF0)
        PORTB = 0xF0;
        INTCONbits.RBIF = 0;
    
        
}

in this above code....number will be display .untill,nxt number display....

- - - Updated - - -

simple project of electronic code lock system....
current password to be scan to display in function call current password
number as change...

- - - Updated - - -

pls...provide me note to scan number from different function
 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…