Use of LCD 16x2 and Keypad 3x4, use of array of struct and string.

Hello, guys and girls.
It is my first time that I participate of forum.
I am having many troubles in my arduino project. I have which utilize one display LCD 16x2 plus keypad 4x3, I had recently studied several libraries in order to I can realize this project, but I make um code, just the same not work. (Excuse-me, for my English is very bad).
Code below.

#include <LiquidCrystal.h>

#include <Keypad.h>

LiquidCrystal  lcd (13,12,11,10,9,8);

int portao=1;
typedef struct modelo
     {
     char *usuario;
     char *senha;
      };
struct modelo *cadastro;
const byte rows = 4;
const byte cols = 3;
typedef char key;
const byte keys [rows][cols] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[rows] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[cols] = {7,6,5}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  int i;
  modelo *cadastro;
  pinMode(portao,OUTPUT);
  lcd.begin(16,2);
  for(i=0;i<6;i++)
  {
  cadastro[i].usuario="!!!!";//representa usuario nao cadastrado
  cadastro[i].senha="!!!!!!";
  }
  cadastro[6].usuario="98765";
  cadastro[6].senha="4321012";
}

void initLCDKeys()
{
  for (int i = 0; i < sizeof(rowPins); i++)
    pinMode(rowPins[i],OUTPUT);
  for (int i = 0; i < sizeof(colPins); i++)
  {
    pinMode(colPins[i],INPUT);
    digitalWrite(colPins[i],LOW);
  }
}
int pesquisa(struct modelo *v,int x)
{
  int j,z,k,y;
  char *teste;
  lcd.setCursor(0,1);
  lcd.write("Usuario:");
  teste=entradaLogin(4);
   for(j=0;j<6;j++)  //contador para registros de usuarios
   {
      if(v[j].usuario==teste)//iteraçao de comparação de usuario
         {
		 z=1;
         k=j;
		 break;
         }		 
	  else
		 z=0;
    }  
    if(z==1)
	{
	lcd.setCursor(1,1);
	lcd.print("Usuario existente!");
	}
    else
	{
	lcd.setCursor(1,1);
	lcd.write("Usuario inexistente!");
	lcd.write("Tente novamente");
	return pesquisa(v,0);//retorna para refazer pesquisa
	}
	y=confirmaSenha(v,k,6);
	if(y && x)
	return k;
	else
	return y;
	   }
int configuracao(struct modelo *v)
{
    lcd.clear();
	lcd.write("#-1=Para usuario master");
	delay(5000);
	lcd.setCursor(0,1);
	lcd.write("1-#=Para acesso normal");
	delay(5000);
	char key = keypad.getKey();
	lcd.clear();
	lcd.write("Escolha:");
	lcd.setCursor(9,0);
	lcd.write(key);
    if (key=='#')
	{
        char key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
        if (key=='0')
	        return codificaMaster(v);//retorna 2 para acesso master;
	    else
		    return configuracao(v);
    }
	else if (key='1')
	    {
	    char key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
        if (key=='#')
	        return pesquisa(v,0);//entra na função pesquisa //retorna 7 para acesso normal.
	    }
	else
	    {
		lcd.clear();
		lcd.write("Tente Novamente");
		return configuracao(v);
		}
}
char *entradaLogin(int n)
{
    char *teste;
	int i;
	lcd.setCursor(0,1);
    lcd.write("Usuario:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.getKey();
		lcd.setCursor(7+i,0);
	    lcd.write(teste[i]);//aparece cada digito de usuario
	   }
	   }
	   return teste;
}
int confirmaSenha(struct modelo *v,int posicao,int n)
{
    char *teste;
	teste=entradaSenha(6);
		if(v[posicao].senha==teste)
	   {
	   lcd.clear();
	   lcd.write("Usuario e senha conferem");
	   return 7;
	   }
	else
	   {
	   lcd.setCursor(6,1);
	   lcd.write("Senha invalida");
	   return confirmaSenha(v,posicao,n);
	   }
}
 
int codificaMaster(struct modelo *v)
{
      char *teste;
	  int i,k;
	  teste=entradaLogin(5);
	  if(teste==v[6].usuario)//usuario master
	  {
	  k=6;
	  lcd.clear();
	  lcd.write("Usuario existente!");
	  i=confirmaSenha(v,k,7);
	  if(i==1)
	  return 2;
	  }
      else
      return codificaMaster(v);
}
void alteracao(struct modelo *v)
{
  char key;
  lcd.clear();  
  lcd.write("Digite uma opção");
     lcd.setCursor(0,1);
     lcd.write("# e 1 para cadastrar usuario");
     delay(5000);
     lcd.write("* e 1 para alterar senha");
     delay(5000);
	 lcd.write("* e 2 para excluir conta");
         delay(5000);
	 lcd.clear();
	 lcd.write("Escolha:");
	 key=keypad.getKey();
	 if(key=='#')
	      {
	      lcd.setCursor(8,1);
		  key=keypad.getKey();
		  if(key=='1')
		      cadastrarUsuario(v);
		   }
	  else if(key=='*')
	       {
			lcd.setCursor(8,0);
			key=keypad.getKey();
			if(key=='1')
			     alteracaoDeSenha(v);
		    else if(key=='2')
			     exclusaoUsuario(v);
			}
}			

void cadastrarUsuario(struct modelo *v)
{
     int i,z;
     char *teste;
	 for(i=0;i<6;i++)
	    {
	     if(v[i].usuario=="****" && v[i].senha=="******")
		      {
			  lcd.write("Usuario:");
			  teste=entradaLogin(4);
			  v[i].usuario=teste;
			  v[i].senha=entradaSenha(6);
			  z=1;
			  break;
			  }
	     z=0;
		 }
		 if(z==0)
		 lcd.write("Nao e possivel cadastrar");
         lcd.write("Exclua alguns usuarios");
         if(z==1)
         lcd.write("Usuario cadastrado com sucesso");		 
}

char *entradaSenha(int n)
{
 char *teste;
	int i;
	lcd.write("Senha:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.getKey();
	    lcd.write('*');//aparece * para cada digito.
	   }
	   }
	return teste;
}

void alteracaoDeSenha(struct modelo *v)
{
      char *teste;
	  int posicao;
	  posicao=pesquisa(v,1);
	  lcd.write("Digite a nova senha");
	  v[posicao].senha=entradaSenha(6);
}

void exclusaoUsuario(struct modelo *v)
{
     int n=4;
     char *teste;
	 int i;
	 teste=entradaLogin(n);
     for(i=0;i<=n;i++)
         {
          if(v[i].usuario==teste)
		  {
               v[i].usuario="!!!!";  
	           lcd.write("Usuario Excluido");
		  }
		  else
		  {
              lcd.write("Usuario nao encontrado");
              return exclusaoUsuario(v);			  
	      }
}
}

void loop()
{
  modelo *cadastro;
   int requisicao = configuracao(cadastro);
   if(requisicao==7)
   digitalWrite(portao,HIGH);
   else if (requisicao==2)
        {
		 digitalWrite(portao,HIGH);
		 alteracao(cadastro);
		 }
}

There is a sticky post in bold orange, in the main screen, please read it. Code tags are a MUST, please highlite your code and click the # symbol above the smiley faces.

Also why is your lcd sharing the same pins as your keypad?

Ok, rewrite the code, changing the pins, lcd(14,13,12,11,10,9); and rows(8,7,6,5), column(4,3,2), e already fix the organization of an else que I forget, did this changes, the project not run, seem that my project stop before the initialize the !!!! for strings of struct.

Does it actually compile & upload?

http://arduino.land/FAQ/content/1/6/en/i-can_t-upload-a-sketch-with-!!!-in-a-string.html

below, is the code, but it don`t work. I am having troubles in use of fuctions which return strings.

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal  lcd (13,12,11,10,9,8);

int portao=0;
typedef struct modelo
     {
     char *usuario;
     char *senha;
      };
struct modelo *cadastro;
const byte rows = 4;
const byte cols = 3;
typedef char key;
const byte keys [rows][cols] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[rows] = {4,3,2,1}; //connect to the row pinouts of the keypad
byte colPins[cols] = {7,6,5}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  int i;
  modelo *cadastro;
  pinMode(portao,OUTPUT);
  lcd.begin(16,2);
  /*for(i=0;i<6;i++)
  {
  cadastro[i].usuario="!!!!";//representa usuario nao cadastrado
  cadastro[i].senha="!!!!!!";
  }
  cadastro[6].usuario="98765";
  cadastro[6].senha="4321012";
  */
}

void initLCDKeys()
{
  for (int i = 0; i < sizeof(rowPins); i++)
    pinMode(rowPins[i],OUTPUT);
  for (int i = 0; i < sizeof(colPins); i++)
  {
    pinMode(colPins[i],INPUT);
    digitalWrite(colPins[i],LOW);
  }
}
int pesquisa(struct modelo *v,int x)
{
  int j,z,k,y;
  char *teste;
  lcd.setCursor(0,1);
  lcd.write("Usuario:");
  teste=entradaLogin(4);
   for(j=0;j<6;j++)  //contador para registros de usuarios
   {
      if(v[j].usuario==teste)//iteraçao de comparação de usuario
         {
		 z=1;
         k=j;
		 break;
         }		 
	  else
		 z=0;
    }  
    if(z==1)
	{
	lcd.setCursor(1,1);
	lcd.print("Usuario existente!");
        }
	else
	{
	lcd.setCursor(1,1);
	lcd.write("Usuario inexistente!");
	lcd.write("Tente novamente");
	return pesquisa(v,0);//retorna para refazer pesquisa
	}
	y=confirmaSenha(v,k,6);
	if(y && x)
	return k;
	else
	return y;
	   }
int configuracao(struct modelo *v)
{
    lcd.clear();
	lcd.write("#-1=Para usuario master");
	delay(5000);
	lcd.setCursor(0,1);
	lcd.write("1-#=Para acesso normal");
	delay(5000);
	lcd.clear();
	lcd.write("Escolha:");
        char key = keypad.getKey();
	lcd.setCursor(9,0);
	lcd.write(key);
    if (key=='#')
	{
        char key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
        if (key=='0')
	        return codificaMaster(v);//retorna 2 para acesso master;
	    else
		    return configuracao(v);
    }
	else if (key='1')
	    {
	    char key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
        if (key=='#')
	        return pesquisa(v,0);//entra na função pesquisa //retorna 7 para acesso normal.
	    }
	else
	    {
		lcd.clear();
		lcd.write("Tente Novamente");
		return configuracao(v);
		}
}
char *entradaLogin(int n)
{
    char *teste;
	int i;
	lcd.setCursor(0,1);
    lcd.write("Usuario:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.getKey();
		lcd.setCursor((7+i),0);
	    lcd.write(teste[i]);//aparece cada digito de usuario
	   }
	   }
	   return teste;
}
int confirmaSenha(struct modelo *v,int posicao,int n)
{
    char *teste;
	teste=entradaSenha(6);
		if(v[posicao].senha==teste)
	   {
	   lcd.clear();
	   lcd.write("Usuario e senha conferem");
	   return 7;
	   }
	else
	   {
	   lcd.setCursor(6,1);
	   lcd.write("Senha invalida");
	   return confirmaSenha(v,posicao,n);
	   }
}
 
int codificaMaster(struct modelo *v)
{
      char *teste;
	  int i,k;
	  teste=entradaLogin(5);
	  if(teste==v[6].usuario)//usuario master
	  {
	  k=6;
	  lcd.clear();
	  lcd.write("Usuario existente!");
	  i=confirmaSenha(v,k,7);
	  if(i==1)
	  return 2;
	  }
      else
      return codificaMaster(v);
}
void alteracao(struct modelo *v)
{
  char key;
  lcd.clear();  
  lcd.write("Digite uma opção");
  
	 lcd.write("# e 1 para cadastrar usuario");
     lcd.write("* e 1 para alterar senha");
	 lcd.write("* e 2 para excluir conta");
	 lcd.clear();
	 lcd.write("Escolha:");
	 key=keypad.getKey();
	 if(key=='#')
	      {
	      lcd.setCursor(8,0);
		  key=keypad.getKey();
		  if(key=='1')
		      cadastrarUsuario(v);
		   }
	  else if(key=='*')
	       {
		    lcd.clear();
            lcd.write("Usuario:");
			lcd.setCursor(8,0);
			key=keypad.getKey();
			if(key=='1')
			     alteracaoDeSenha(v);
		    else if(key=='2')
			     exclusaoUsuario(v);
			}
}			

void cadastrarUsuario(struct modelo *v)
{
     int i,z;
     char *teste;
	 for(i=0;i<6;i++)
	    {
	     if(v[i].usuario=="****" && v[i].senha=="******")
		      {
			  lcd.write("Usuario:");
			  teste=entradaLogin(4);
			  v[i].usuario=teste;
			  v[i].senha=entradaSenha(6);
			  z=1;
			  break;
			  }
	     z=0;
		 }
		 if(z==0)
		 lcd.write("Nao e possivel cadastrar");
         lcd.write("Exclua alguns usuarios");
         if(z==1)
         lcd.write("Usuario cadastrado com sucesso");		 
}

char *entradaSenha(int n)
{
 char *teste;
	int i;
	lcd.write("Senha:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.getKey();
	    lcd.write('*');//aparece * para cada digito.
	   }
	   }
	return teste;
}

void alteracaoDeSenha(struct modelo *v)
{
      char *teste;
	  int posicao;
	  posicao=pesquisa(v,1);
	  lcd.write("Digite a nova senha");
	  v[posicao].senha=entradaSenha(6);
}

void exclusaoUsuario(struct modelo *v)
{
     int n=4;
     char *teste;
	 int i;
	 teste=entradaLogin(n);
     for(i=0;i<=n;i++)
         {
          if(v[i].usuario==teste)
		  {
               v[i].usuario="!!!!";  
	           lcd.write("Usuario Excluido");
		  }
		  else
		  {
              lcd.write("Usuario nao encontrado");
              return exclusaoUsuario(v);			  
	      }
}
}

void loop()
{
  modelo *cadastro;
   int requisicao = configuracao(cadastro);
   if(requisicao==7)
   digitalWrite(portao,HIGH);
   else if (requisicao==2)
        {
		 digitalWrite(portao,HIGH);
		 alteracao(cadastro);
		 }
}

You can't have a string containing three exclamation marks, i.e "!!!"

The link I posted above explains why. You will need to either remove them from the string or print them a different way.

Ok! i remake my code, now it’s work, but i am having some troubles with the method void loop(), functions run, compare strings, everything ok, but when it goint to return int para a variable condicao, it should pass by if’s and else, but start the begin and remake the function again. (I have tested this code on proteus):

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal  lcd (13,12,11,10,9,8);

int portao=0;
typedef struct modelo
     {
     String usuario;
     String senha;
      };
struct modelo cadastro[7] = 
{
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"12345","9876543"}
};
const byte rows = 4;
const byte cols = 3;
char key;
const char keys [rows][cols] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[rows] = {4,3,2,1}; //connect to the row pinouts of the keypad
byte colPins[cols] = {7,6,5}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  modelo* cadastro;
  int i;
  pinMode(portao,OUTPUT);
  lcd.begin(16,2);
}

int pesquisa(struct modelo* v,int x)
{
  int j,z,k,y;
  String teste;
  lcd.setCursor(0,1);
  lcd.write("Usuario:");
  teste=entradaLogin(4);
   for(j=0;j<6;j++)  //contador para registros de usuarios
   {
      if(v[j].usuario==teste)//iteraçao de comparação de usuario
         {
		 z=1;
         k=j;
		 break;
         }		 
	  else
		 z=0;
    }  
    if(z==1)
	{
	lcd.setCursor(1,1);
	lcd.print("Usuario existente!");
        }
	else
	{
	lcd.setCursor(1,1);
	lcd.write("Usuario inexistente!");
	lcd.write("Tente novamente");
	return pesquisa(v,0);//retorna para refazer pesquisa
	}
	y=confirmaSenha(v,k,6);
	if(y && x)
	return k;
	else
	return y;
	   }
int configuracao(struct modelo* v)
{
  int x;  
  lcd.clear();
	lcd.write("#-0=Para usuario master");
	lcd.setCursor(0,1);
	lcd.write("1-#=Para acesso normal");
        delay(1000);
	lcd.clear();
	lcd.write("Escolha:");
        key=keypad.waitForKey();
        //key = keypad.getKey();
        lcd.setCursor(9,0);
	lcd.write(key);
        if (key=='#')
	{
        key=keypad.waitForKey();
         //key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
                delay(500);
                if (key=='0')
	             return codificaMaster(v);//retorna 2 para acesso master
                 else
		   return configuracao(v);
    }
	else if (key=='1')
	    {
	    key=keypad.waitForKey();
            lcd.setCursor(10,0);
		lcd.write(key);
                if (key=='#')
	            return pesquisa(v,0);//entra na função pesquisa //retorna 7 para acesso normal.
	    }
	else//erro, depois consertar.
	    {
		lcd.clear();
		lcd.write("Tente Novamente");
		return configuracao(v);
		}
}
String entradaLogin(int n)
{
    char teste[n];
	int i;
	lcd.clear();
    lcd.write("Usuario:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.waitForKey();
		lcd.setCursor((8+i),0);
	    lcd.write(teste[i]);//aparece cada digito de usuario	   
            }
	   }
	   return teste;
}
int confirmaSenha(struct modelo* v,int posicao,int n)
{
    String teste;
	teste=entradaSenha(n);
		if(v[posicao].senha==teste)
	   {
	   lcd.clear();
	   lcd.write("Usuario e senha conferem");
           delay(1000);
           if(n==7)
	      return 2;//return 7;
	   else if(n==6)
              return 7;
           }
	else
	   {
	   lcd.setCursor(0,1);
	   lcd.write("Senha invalida");
	   return confirmaSenha(v,posicao,n);
	   }
}
 
int codificaMaster(struct modelo* v)
{
      String teste;
	  int i,k;
	  teste=entradaLogin(5);
	  if(teste==v[6].usuario)//usuario master
	  {
	  k=6;
	  lcd.setCursor(0,1);
	  lcd.write("Usuario existente!");
	  return confirmaSenha(v,k,7);
          }
          else
          return codificaMaster(v);
}
void alteracao(struct modelo* v)
{
  char key;
  lcd.clear();  
  lcd.write("Digite uma opção");
        lcd.setCursor(0,1);
	 lcd.write("# e 1 para cadastrar user");
         delay(1500);
     lcd.write("* e 1 para alterar senha");
         delay(3000);
	 lcd.write("* e 2 para excluir conta");
         delay(1500);
	 lcd.setCursor(0,1);
	 lcd.write("Escolha:");
	 key=keypad.waitForKey();
         lcd.setCursor(9,0);
         lcd.write(key);
	 if(key=='#')
	      {
		  key=keypad.waitForKey();
                  lcd.setCursor(10,0);
                  lcd.write(key);
		  if(key=='1')
                      {
		      cadastrarUsuario(v);
                      lcd.write("erro");
                      }
		   }
	  else if(key=='*')
	       {
		    lcd.clear();
                    lcd.write("Usuario:");
			lcd.setCursor(8,0);
			key=keypad.waitForKey();
			if(key=='1')
			     alteracaoDeSenha(v);
		    else if(key=='2')
			     exclusaoUsuario(v);
			}
}			

void cadastrarUsuario(struct modelo* v)
{
     int i,z;
     String teste;
	 for(i=0;i<6;i++)
	    {
	     if(v[i].usuario=="****" && v[i].senha=="******")
		      {
			  teste=entradaLogin(4);
			  v[i].usuario=teste;
			  v[i].senha=entradaSenha(6);
			  z=1;
			  break;
			  }
             else
	     z=0;
		 }
		 if(z==0)
                 lcd.clear();
		 lcd.write("Nao e possivel cadastrar");
         lcd.setCursor(0,1);
         lcd.write("Exclua alguns usuarios");
         if(z==1)
         lcd.clear();
         lcd.write("Usuario cadastrado com sucesso");		 
}

String entradaSenha(int n)
{
 char teste[n];
	int i;
        lcd.home();
	lcd.write("Senha:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.waitForKey();
	    lcd.setCursor((7+i),1);
            lcd.write('*');//aparece * para cada digito.
	   }
	   }
	return teste;
}

void alteracaoDeSenha(struct modelo* v)
{
      char *teste;
	  int posicao;
	  posicao=pesquisa(v,1);
          lcd.clear();
	  lcd.write("Digite a nova senha");
	  v[posicao].senha=entradaSenha(6);
}

void exclusaoUsuario(struct modelo* v)
{
     int n=4;
     String teste;
	 int i;
	 teste=entradaLogin(n);
     for(i=0;i<=n;i++)
         {
          if(v[i].usuario==teste)
		  {
               v[i].usuario="aaaa";
                   lcd.clear();  
	           lcd.write("Usuario Excluido");
		  }
          else
		  {
              lcd.clear();
              lcd.write("Usuario nao encontrado");//erro, conserta depois.
              return exclusaoUsuario(v);			  
	      }
}
}

void loop()
{ 
  int condicao; 
  condicao=configuracao(cadastro);
   if(condicao==7)
   {
   digitalWrite(portao,HIGH);
   lcd.write("ERROR");
   }
   else if (condicao==2)
        {
		 digitalWrite(portao,HIGH);
                 lcd.clear();
                 lcd.write("Porta Aberta!");
                 delay(4000);
		 alteracao(cadastro);
		 }
}
[\code] 
I have did the debug showing one lcd.write in the beginning of void loop().

I have just tested on proteus add one lcd.write on void setup(); and I see that my code is restart the arduino on proteus. I think that some bug of program. My doubt is correct.

LiquidCrystal  lcd (13,12,11,10,9,8);
byte rowPins[rows] = {11,10,9,8}; //connect to the row pinouts of the keypad
byte colPins[cols] = {7,6,5}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

are you using the same pins twice?

Excuse me, wrong code, below follow the correct code:

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal  lcd (13,12,11,10,9,8);

int portao=0;
typedef struct modelo
     {
     String usuario;
     String senha;
      };
struct modelo cadastro[7] = 
{
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"aaaa","aaaaaa"},
{"12345","9876543"}
};
const byte rows = 4;
const byte cols = 3;
char key;
const char keys [rows][cols] =
{
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[rows] = {4,3,2,1}; //connect to the row pinouts of the keypad
byte colPins[cols] = {7,6,5}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  pinMode(portao,OUTPUT);
  lcd.begin(16,2);
}

int pesquisa(struct modelo* v,int x)
{
  int j,z,k,y;
  String teste;
  lcd.setCursor(0,1);
  lcd.write("Usuario:");
  teste=entradaLogin(4);
   for(j=0;j<6;j++)  //contador para registros de usuarios
   {
      if(v[j].usuario==teste)//iteraçao de comparação de usuario
         {
		 z=1;
         k=j;
		 break;
         }		 
	  else
		 z=0;
    }  
    if(z==1)
	{
	lcd.setCursor(1,1);
	lcd.print("Usuario existente!");
        }
	/*else
	{
	lcd.setCursor(1,1);
	lcd.write("Usuario inexistente!");
	lcd.write("Tente novamente");
	return pesquisa(v,0);//retorna para refazer pesquisa
	}*/
	y=confirmaSenha(v,k,6);
	if(y && x)
	return k;
	else
	return y;
	   }
int configuracao(struct modelo* v)
{
  int x;  
  lcd.clear();
	lcd.write("#-0=Para usuario master");
	lcd.setCursor(0,1);
	lcd.write("1-#=Para acesso normal");
        delay(1000);
	lcd.clear();
	lcd.write("Escolha:");
        key=keypad.waitForKey();
        //key = keypad.getKey();
        lcd.setCursor(9,0);
	lcd.write(key);
        if (key=='#')
	{
        key=keypad.waitForKey();
         //key = keypad.getKey();
        lcd.setCursor(10,0);
		lcd.write(key);
                delay(500);
                if (key=='0')
	             return codificaMaster(v);//retorna 2 para acesso master
                 /*else
		   return configuracao(v);*/
    }
	else if (key=='1')
	    {
	    key=keypad.waitForKey();
            lcd.setCursor(10,0);
		lcd.write(key);
                if (key=='#')
	            return pesquisa(v,0);//entra na função pesquisa //retorna 7 para acesso normal.
	    }
	/*else
	    {
		lcd.clear();
		lcd.write("Tente Novamente");
		return configuracao(v);
		}*/
}
String entradaLogin(int n)
{
    char teste[n];
	int i;
	lcd.clear();
    lcd.write("Usuario:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.waitForKey();
		lcd.setCursor((8+i),0);
	    lcd.write(teste[i]);//aparece cada digito de usuario	   
            }
	   }
	   return teste;
}
int confirmaSenha(struct modelo* v,int posicao,int n)
{
    String teste;
	teste=entradaSenha(n);
		if(v[posicao].senha==teste)
	   {
	   lcd.clear();
	   lcd.write("Usuario e senha conferem");
           delay(1000);
           if(n==7)
	      return 2;//return 7;
	   else if(n==6)
              return 7;
           }
	/*else
	   {
	   lcd.setCursor(0,1);
	   lcd.write("Senha invalida");
	   return confirmaSenha(v,posicao,n);
	   }*/
}
 
int codificaMaster(struct modelo* v)
{
      String teste;
	  int i,k;
	  teste=entradaLogin(5);
	  if(teste==v[6].usuario)//usuario master
	  {
	  k=6;
	  lcd.setCursor(0,1);
	  lcd.write("Usuario existente!");
	  return confirmaSenha(v,k,7);
          }
          /*else
          return codificaMaster(v);*/
}
void alteracao(struct modelo* v)
{
  char key;
  lcd.clear();  
  lcd.write("Digite uma opção");
        lcd.setCursor(0,1);
	 lcd.write("# e 1 para cadastrar user");
         delay(1500);
     lcd.write("* e 1 para alterar senha");
         delay(3000);
	 lcd.write("* e 2 para excluir conta");
         delay(1500);
	 lcd.setCursor(0,1);
	 lcd.write("Escolha:");
	 key=keypad.waitForKey();
         lcd.setCursor(9,0);
         lcd.write(key);
	 if(key=='#')
	      {
		  key=keypad.waitForKey();
                  lcd.setCursor(10,0);
                  lcd.write(key);
		  if(key=='1')
                      {
		      cadastrarUsuario(v);
                      lcd.write("erro");
                      }
		   }
	  else if(key=='*')
	       {
		    lcd.clear();
                    lcd.write("Usuario:");
			lcd.setCursor(8,0);
			key=keypad.waitForKey();
			if(key=='1')
			     alteracaoDeSenha(v);
		    else if(key=='2')
			     exclusaoUsuario(v);
			}
}			

void cadastrarUsuario(struct modelo* v)
{
     int i,z;
     String teste;
	 for(i=0;i<6;i++)
	    {
	     if(v[i].usuario=="****" && v[i].senha=="******")
		      {
			  teste=entradaLogin(4);
			  v[i].usuario=teste;
			  v[i].senha=entradaSenha(6);
			  z=1;
			  break;
			  }
             else
	     z=0;
		 }
		 if(z==0)
                 {
                 lcd.clear();
		 lcd.write("Nao e possivel cadastrar");
         lcd.setCursor(0,1);
         lcd.write("Exclua alguns usuarios");
                 }
         if(z==1)
         {
         lcd.clear();
         lcd.write("Usuario cadastrado com sucesso");	
         }	 
}

String entradaSenha(int n)
{
 char teste[n];
	int i;
        lcd.home();
	lcd.write("Senha:");
    for(i=0;i<=n;i++)//usuario encontrado entrar com senha
	    {
        if(i==n)
	    teste[i]='\0';//transforma em string
	    else
	    {
		teste[i]=keypad.waitForKey();
	    lcd.setCursor((7+i),1);
            lcd.write('*');//aparece * para cada digito.
	   }
	   }
	return teste;
}

void alteracaoDeSenha(struct modelo* v)
{
      char *teste;
	  int posicao;
	  posicao=pesquisa(v,1);
          lcd.clear();
	  lcd.write("Digite a nova senha");
	  v[posicao].senha=entradaSenha(6);
}

void exclusaoUsuario(struct modelo* v)
{
     int n=4;
     String teste;
	 int i;
	 teste=entradaLogin(n);
     for(i=0;i<=n;i++)
         {
          if(v[i].usuario==teste)
		  {
               v[i].usuario="aaaa";
                   lcd.clear();  
	           lcd.write("Usuario Excluido");
		  }
          /*else
		  {
              lcd.clear();
              lcd.write("Usuario nao encontrado");//erro, conserta depois.
              return exclusaoUsuario(v);			  
	      }*/
}
}

void loop()
{ 
  int condicao; 
  condicao=configuracao(cadastro);
   if(condicao==7)
   {
   digitalWrite(portao,HIGH);
   lcd.write("ERROR");
   }
   else if (condicao==2)
        {
		 digitalWrite(portao,HIGH);
                 lcd.clear();
                 lcd.write("Porta Aberta!");
                 delay(4000);
		 alteracao(cadastro);
		 }
}

I can use the method free(pointer) in some recursive functions in order to ecomize my arduino memory, i think that it is my problem on the source code.

i think that it is my problem on the source code.

I think that your use of recursion is your problem. Have a close look at how much (actually, how little) memory your Arduino has.

I was search, and found an way, maybe, solve this problems using PROGMEM, e declaring only local variables, everything in order to i can utilize better the memory. Do i do follow this artifices, and i already can use recursive functions in order to i economize code.