Hi I am interfacing lcd and keypad with arduino uno. The Lcd is working fine but the keypad is not working. It is being stuck in the do while loop. In this loop the microcontroller is checking for a pressed key by checking the value of PortC. Btw i connected the lsb bits of portC to the columns of the keypad whereas the rows are connected to the lsb bits of portD. This is the program so far:
#define COL PORTC
#define ROW PORTD
bool rw = PB1;
bool rs= PB0;
bool en= PB2;
void MSDelay(unsigned int itime);
void lcdcmd(char value);
void lcddata(char value);
const char *string="Enter Password";
unsigned char keypad[4][4]= {'0', '1', '2', '3',
'4', '5', '6', '7',
'B', '9', 'A', 'B',
'C', 'D', 'E', 'F'};
void setup() {
Serial.begin(9600);
DDRB=0x07;
DDRD=0xFF;
DDRC=0x00;
lcdcmd(0x02);
lcdcmd(0x28);
lcdcmd(0x0E);
lcdcmd(0x01);
lcdcmd(0x80);
for (; *string!='\0'; ++string)
{
lcddata(*string);
}
lcdcmd(0xC0);
//ROW=0x00;
PORTC=0x7F;
}
void loop() {
int i=0;
unsigned char password[4];
unsigned char colloc, rowloc, column;
do
{
ROW = 0x00;
colloc=PORTC;
colloc &=0x0F;
}while (colloc != 0x0F);
do
{
do
{
MSDelay(2000);
colloc=COL;
colloc &=0x0F;
}while(colloc==0x0F);
MSDelay(2000);
colloc=COL;
colloc &=0x0F;
}while(colloc==0x0F);
while (1)
{
ROW = 0xFE;
colloc = COL;
colloc &=0x0F;
if (colloc != 0x0F)
{
rowloc=0;
break;
}
ROW = 0xFD;
colloc = COL;
colloc &=0x0F;
if (colloc != 0x0F)
{
rowloc=1;
break;
}
ROW = 0xFB;
colloc = COL;
colloc &=0x0F;
if (colloc != 0x0F)
{
rowloc=2;
break;
}
ROW = 0xF7;
colloc = COL;
colloc &=0x0F;
if (colloc != 0x0F)
{
rowloc=3;
break;
}
}
if (colloc==0x0E)
{
column=0;
lcddata('');
}
else if (colloc==0x0D)
{
column=1;
lcddata('X');
}
else if (colloc==0x0B)
{
column=2;
lcddata('Z');
}
else
{
column=3;
lcddata('P');
}
if (i<=4)
{
password=keypad[rowloc][column];*
- i++;*
- }*
}
void lcdcmd(char value)
{
- PORTD = (value & 0xF0);*
- PORTB=0x04;*
- MSDelay(2000);*
- PORTB=0x00;*
- MSDelay(20000);*
- PORTD = ((value<<4) & 0xF0);*
- PORTB=0x04;*
- MSDelay(2000);*
- PORTB=0x00;*
- MSDelay(20000);*
- return;*
}
void lcddata(char value)
{
- PORTD = (value & 0xF0);*
- PORTB=0x05;*
- MSDelay(2000);*
- PORTB=0x00;*
- MSDelay(20000);*
- PORTD = ((value<<4) & 0xF0);*
- PORTB=0x05;*
- MSDelay(2000);*
- PORTB=0x00;*
- MSDelay(20000);*
- return;*
}
void MSDelay(unsigned int itime)
{
unsigned int i=0;
for(i=0; i<=itime; i++);
}
I appreciate any kind of help 10q in advance