Keypad interfacing problem with ARM7 lpc2148.

Status
Not open for further replies.

djc

Advanced Member level 1
Joined
Jan 27, 2013
Messages
402
Helped
3
Reputation
6
Reaction score
2
Trophy points
1,298
Location
India
Visit site
Activity points
4,554
I wrote a program for interfacing of keypad and lcd with ARM7 lpc2148. But the problem is its displaying only one row. Means if it enters the loop in which ROW 0 is grounded then it will display only keys 0,1,2,3 for any key pressed. If I deactivate that loop and wtever next loop is there here it will be ROW1 grounded, then it will display keys that is 4,5,6,7 for any key pressed. Here is my code, anyone please help me.


Code:
#include <lpc22xx.h>

#define O1 0X00038000
#define O2 0X00034000
#define O3 0X0002C000
#define O4 0X0001C000

#define CLR 0x0003C000

/*#define col0 0x00
#define col1 0x01
#define col2 0x02
#define col3 0x03 */



void delay(int);
void init_lcd();
void Delay(unsigned long b);
void write_command(int cmd);
void write_data(int dat);
void lcd_data(int l);
void lcd_command(char cmd);

 /* printlcd (int keypad[int m][int n])
//int m,n;
{
   int m,n;

   lcd_data(*(*(keypad+m)+n));
  Delay(20000);
	
 } */

  printlcd (unsigned int x)
//int m,n;
{
   //int m,n;

   lcd_data(x);
  Delay(20000);
	
 }  





int main()
{	
		  int keypad [4] [4] = {'0', '1', '2', '3', '4', '5', '6', '7', 
				'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

		  unsigned int row,column;
		  IODIR0 = 0x003FC000;
		   init_lcd();
		  IOCLR0 = 0x0003FC00;	//Clear all the port pins
		  IOCLR0 =  0x0003C000;	//P0.17,P0.16,P0.15,P0.14  AS OUTPUT as ROWS
		  IOSET0 = 0x00003C00; 	// P0.13, P0.12, P0.11 and P0.10 are input as COLUMNS  
		  
		 
		  
		  while(1)
		  {
		  	do
			{
				IO0CLR = 0x0003C000;  //Ground all the rows at once
    			              column = IOPIN0;
		   		column &= 0X00003C00;	//MASK USED BITS
			} while(column == 0X00003C00); //CHECK UNTIL ALL KEYS ARE OPEN
			 
		  	do
				{
				do
					{
						delay(20);		//Call delay
						column = IOPIN0;	 // See if any key is pressed
						column &= 0X00003C00;// Mask unused bits
				} while(column == 0X00003C00); // Keep checking for key press

				delay (20);
				column = IOPIN0;	//Read columns
				column &= 0X00003C00;		// mask unused bits
				} while (column == 0X00003C00);	// Wait for Keypress
				
				while(1)
					{
						IOSET0 = 01;		//ground row0
						column = IOPIN0;		//Read colums
						column &= 0X00003C00;	//Mask unused bits
						if(column != 0X00003C00)	//Column detected
							{	
								row = 0;	 // Save row lacation
								break;	 // Exit while loop
							}
						
						IOSET0 = 02;		// Ground row1
						column = IOPIN0;		// Read columns					 
						column &= 0X00003C00;	//Mask unused bits
						if(column != 0X00003C00)	//Column detected
							{	
							row = 1;	 // Save row location
							break;	 // Exit while loop
							}	

						IOSET0 = 03;	// Ground row2
						column = IOPIN0;	// Read columns					 
						column &= 0X00003C00;	//Mask unused bits
						if(column != 0X00003C00)	//Column detected
							{	
							row = 2;	 // Save row lacation
							break;	 // Exit while loop
							}

						IOSET0 = 04;		// Ground row3
						column = IOPIN0;		// Read columns					 
						column &= 0X00003C00;	//Mask unused bits
						if(column != 0X00003C00)	//Column detected
							{	
							row = 3;	 // Save row lacation
							break;	 // Exit while loop
							 }
					}

				if (column == 0x00003800)
					printlcd(keypad [row] [0]);
				else if(column == 0x00003400)
					printlcd(keypad [row] [1]);
				else if (column == 0x00002C00)
				printlcd (keypad [row] [2]);
				else if(column == 0x00001C00)
					printlcd(keypad [row] [3]);

			}
		
}

 void delay(int n)	  			// generates one milisecond delay  
  {
   int i,j;
   for (i=1; i<=n; i++);
   for(j=0; j<=100000; j++);
  }

void  init_lcd() {										  
  IO1DIR 	|= 0x00FE0000;    
  Delay(200000) ;
  write_command(0x30 << 16); 
  Delay(100000);
  write_command(0x30 << 16);
  Delay(100000);
  write_command(0x30 << 16);
  Delay(100000);
  write_command(0x20 << 16);

  lcd_command(0x01);	                         /* clear display */
  lcd_command(0x06);	                         /* auto address inc */
  lcd_command(0x0c);	                         /* cursor off */
  lcd_command(0x80);	                         /* first location */
  }

void write_command(int cmd) {
  IO1CLR  |= 0x00f00000;                 	/* Clear D4-D7  */
  IO1CLR  |= 0x00040000;	                /* Read/Write = 0 				*/
  IO1CLR  |= 0X00020000;                    /* Register Select = 0,Command */
  IO1SET  |= 0x00f00000 & cmd;  		    /* Set D4-D7    */
  IO1SET  |= 0X00080000;	                /* Enable = 1 					*/  
  Delay(30000);
  IO1CLR  |= 0x00080000;                	 /* set E to low 	  			*/
  }

 void write_data(int dat) {
  IO1CLR  |= 0x00f00000;                 	/* Clear D4-D7  */
  IO1CLR  |= 0x00040000;		 			/* Read/Write = 0 			*/
  IO1SET  |= 0X00020000;    				/* Register Select = 1,Data */
  IO1SET  |= 0x00f00000 & dat;  			/* Set D4-D7    */
  IO1SET  |= 0X00080000;					/* Enable = 1 				*/
  Delay(30000);          					//delay ~2ms
  IO1CLR  |= 0x00080000; 					/* Set E to low 		  	*/
  }

void lcd_data(int dat)
{
  write_data(dat << 16);
  write_data(dat << 20);
  }

void lcd_command(char cmd)
{
  write_command(cmd << 16);
  write_command(cmd << 20);
  }
  


 void Delay(unsigned long b)
{ 
  while (--b!=0);	 
 }
 
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…