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 want C code for 4x4 keypad for the PIC18F45K20 microchip controller

Status
Not open for further replies.

siram kumar

Newbie level 5
Joined
Sep 20, 2012
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,367
i have a code but it was not working, i am using batch file to compiling the C Code and for simulating i am using proteus simulator. I am sending my code please any one can check the code and suggest me how to write a correct code for the PIC18F45k20 controller.



This is My Code...........




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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "p18f45k20.h"
#include "xlcd.h"
#include "delays.h"
 
#pragma config FOSC = INTIO67 ,IESO = OFF
#pragma config WDTEN = OFF, MCLRE = OFF, LVP = OFF
 
#define COL_0 PORTDbits.RD4
#define COL_1 PORTDbits.RD5
#define COL_2 PORTDbits.RD6
#define COL_3 PORTDbits.RD7
 
#define ROW_A PORTDbits.RD0
#define ROW_B PORTDbits.RD1
#define ROW_C PORTDbits.RD2
#define ROW_D PORTDbits.RD3
 
void DelayFor18TCY(void)
{
    Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();
    Nop();Nop();Nop();Nop();
}
void delay(void)
{
    int i;
    for(i = 0; i < 5000; i++);
}
void DelayPORXLCD(void)
{
    Delay1KTCYx(120);//Delay of 15ms
    //cycles = (TimeDelay * FOSC)/4
    //cycles = (15ms * 16MHz)/4
    //cycles = 60,000
    return;
}
void DelayXLCD(void)
{
    Delay1KTCYx(20);//Delay of 5ms
    //cycles = (TimeDelay * FOSC)/4
    //cycles = (5ms * 16MHz)/4
    //cycles = 20,000
    return; 
}
 
typedef unsigned char Byte;
Byte row,Key_Value;
Byte Keypad_Value[4][4] = {'0','1','2','3',
                           '4','5','6','7',
                           '8','9','A','B',
                           'C','D','E','F'};
Byte Keypad(void);
void Lcddisplay_Str(Byte *Str);
 
void main(void)
{
    Byte data[10] = "Keypad";
    TRISD = 0b11110000;
    TRISB = 0b00000000;
    OSCCONbits.IRCF = 0x03;
    //configure Lcd
    OpenXLCD(FOUR_BIT & LINES_5X7);
    while(BusyXLCD());  //Wait if LCD busy
    WriteCmdXLCD(SHIFT_DISP_LEFT); //set lcd write left to right
    while(BusyXLCD());
    Lcddisplay_Str(data);
    
    row = 0;
    while(1)
    {
        Key_Value = Keypad();
        WriteCmdXLCD(0xC0);
        while(BusyXLCD());
        WriteDataXLCD(Key_Value);
    }
}
Byte Keypad(void)
{
    COL_0 = COL_1 = COL_2 = COL_3 = 1;
    delay();
    ROW_A = ROW_B = ROW_C = ROW_D = 0;
    if(!COL_0 || !COL_1 || !COL_2 || !COL_3)
    {
        while(1)
        {
            ROW_A = 0; ROW_B = 1; ROW_C = 1; ROW_D = 1;
            if(!COL_0 || !COL_1 || !COL_2 || !COL_3)
            {
                row = 0;
                break;
            }
            ROW_A = 1; ROW_B = 0; ROW_C = 1; ROW_D = 1;
            if(!COL_0 || !COL_1 || !COL_2 || !COL_3)
            {
                row = 1;
                break;
            }
            ROW_A = 1; ROW_B = 1; ROW_C = 0; ROW_D = 1;
            if(!COL_0 || !COL_1 || !COL_2 || !COL_3)
            {
                row = 2;
                break;
            }
            ROW_A = 1; ROW_B = 1; ROW_C = 1; ROW_D = 0;
            if(!COL_0 || !COL_1 || !COL_2 || !COL_3)
            {
                row = 3;
                break;
            }
        }
        if(COL_0 == 0 && COL_1 == 1 && COL_2 == 1 && COL_3 == 1)
        {
            return (Keypad_Value[row][0]);
        }
        else if(COL_0 == 1 && COL_1 == 0 && COL_2 == 1 && COL_3 == 1)
        {
            return (Keypad_Value[row][1]);
        }
        else if(COL_0 == 1 && COL_1 == 1 && COL_2 == 0 && COL_3 == 1)
        {
            return (Keypad_Value[row][2]);
        }
        else if(COL_0 == 1 && COL_1 == 1 && COL_2 == 1 && COL_3 == 0)
        {
            return (Keypad_Value[row][3]);
        }
        else
        {
            //do noting
        }
    }
    //return 0xFF;
}
void Lcddisplay_Str(Byte *Str)
{
    while(*Str)
    {
        WriteDataXLCD(*Str++);
        delay();
    }
}

 
Last edited by a moderator:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top