This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC2148 4x4 Matrix Keypad Issue

i m a M.Sc Electronics Student and now i have been told to interface the keypad on the Dev kit
the board is Called Spirit II from Oasis, it has a LPC2148.
the keypad is a matrix keypad. now whats done here is, its connected to a resistor array and the resistor array has a Vcc given to it.
so.
when i make the rows as input and columns as output
the rows become high by default
if the columns are made input
they become high by default

Algorithm
Set Keypad pins to output
initially clear the port
so now, i make rows high read columns
i mae columns high read rows,
and the result
left shift answer by 2
send value to main
Take the Value and Switch

CODE:

#include<lpc21xx.h>
#include<lcd.h>
#include<oasis_key.h>
unsigned key;
char k_value;
int main(void)
{
        PINSEL2=0x00000000;     //mode of operation
        PINSEL0=0x00000000;     //mode of operation
        IODIR0 |= 0x0000183C;
        make_out_lcd_port();
        lcd_init();
        clr_lcd_port();delay();
        lcd_cmd(0x00800000);delay();clr_lcd_port();
        lcd_cmd(0x00010000);delay();clr_lcd_port();
        lcd_data('X');delay();clr_lcd_port();
        while(1)
        {
        key=key_read();
        switch(key)
        {
        case 0x81 : k_value='1';break;
        case 0x82 : k_value='2';break;
        case 0x84 : k_value='3';break;
        case 0x88 : k_value='A';break;

        case 0x41 : k_value='4';break;
        case 0x42 : k_value='5';break;
        case 0x44 : k_value='6';break;
        case 0x48 : k_value='B';break;

        case 0x21 : k_value='7';break;
        case 0x22 : k_value='8';break;
        case 0x24 : k_value='9';break;
        case 0x28 : k_value='C';break;

        case 0x11 : k_value='*';break;
        case 0x12 : k_value='0';break;
        case 0x14 : k_value='#';break;
        case 0x18 : k_value='D';break;

        case 0x00 : k_value='N';break;
        }

                lcd_cmd(0x00C00000);delay();clr_lcd_port();
                lcd_data(k_value);delay();clr_lcd_port();
        }
}

//LCD MOdule

#include<lpc21xx.h>
int i;
#define lcd_rs 0x00000800       //defines rs pin
#define lcd_en 0x00001000       //defines en pin
#define lcd_port 0x00FF0000     //defines lcd port
#define make_out_en_rs() IODIR0 |= (lcd_rs | lcd_en)    //makes en,rs output
#define make_out_lcd_port() IODIR1 |= lcd_port          //makes lcd port out
#define clr_lcd_port() IOCLR1 |= lcd_port               //clears lcd port
#define lcd_rs_set() IOSET0 |= lcd_rs
#define lcd_en_set() IOSET0 |= lcd_en
#define lcd_rs_clr() IOCLR0 |= lcd_rs
#define lcd_en_clr() IOCLR0 |= lcd_en
void delay()
{
for(i=0;i<40000;i++);
}
void lcd_cmd(unsigned int value)
{
IODIR0 |= 0x0000183C;
lcd_rs_clr();
IOSET1=value;
lcd_en_set();
lcd_en_clr();
delay();
}

void lcd_data(unsigned char val)
        {
        unsigned result;
        IODIR0 |= 0x0000183C;
        result=val;
        for(i=0;i<16;i++)
                {result=result<<1;}
        lcd_rs_set();
        IOSET1=result;
        lcd_en_set();
        lcd_en_clr();
        delay();
        }

void char_string(char a)
{
lcd_data(a);
clr_lcd_port();delay();
}

void lcd_init()
{
        lcd_cmd(0x00380000);delay();
        clr_lcd_port();

        lcd_cmd(0x000C0000);delay();
        clr_lcd_port();
}

//keypad library
void debounce(void);
int keyread (void);

unsigned key_read(void)
{
        unsigned rows,columns,result;

        IODIR0=0x000003FC;
        IOCLR0=0x00000FFF;
        IOSET0=0x000003C0;
        columns=IOPIN0;

        IOCLR0=0x00000FFF;
        IOSET0=0x0000003C;
        rows=IOPIN0;

        debounce();
        result=rows & columns;
        result=result>>2;
        result=result & 0x000000FF;

        return(result);
        }

void debounce(void)
{
        unsigned int j;
        for (j=0;j<200000;j++)
        {
        }
}

Pin 0.2 ROW1
Pin 0.3 ROW2
Pin 0.4 ROW3
Pin 0.5 ROW4
Pin 0.6 COl1
Pin 0.7 COl2
Pin 0.8 COl3
Pin 0.9 COl4

Pin 0.11 RS
Pin 0.12 EN

Code Is Working, Detecting Keys Fine, i m happy

Present Problem :
Keys are arranged in this fashion

1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D

Keys 1,2,4,5,7,8,*,0 are not Getting Detected zzz

Anyone With Any Suggestions Pls Comment, Any Help will do

0