Pic18f4550 lcd c18 Mplab

#1
Que tal amigos he estado utilizando el pic18f4550 he implementarle una lcd alfanumerica 16x2 y una teclado matricial 4x4 con el compilador c18 de mplab; basicamnete lo que estoy haciendo es un directorio telefonico donde el usuario digita el numeros y nombres, ademas una opcion de buscar dichos contactos.
todo me sale bien menos cuando intento buscar el contacto no se que estoy haciendo mal
la funcion int buscar(void); es la que me busca (no se si la estoy haciendo mal o q):confused:
Código:
#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>


void DelayFor18TCY(){Delay10TCYx(2);}
void DelayPORXLCD(){Delay1KTCYx(15);}
void DelayXLCD(){Delay1KTCYx(5);}

int numero[10];
int nombre[10];
int search[10];
short long m=0, cont=0, a=0;
int interfaz(void);
int menu_inicio(void);
int buscar(void);




int teclado_musa(void){

	a1:
		PORTD=1;
			 if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;for(a=0; a<40000; a++){PORTD=1;if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;}}
		switch(cont){case 1:return 1;break; case 2:return 49;break; case 3:return 50;break; case 4:return 51;break;}}
		
		else if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;for(a=0; a<40000; a++){PORTD=1;if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;}}
		switch(cont){case 1:return 2;break; case 2:return 52;break; case 3:return 53;break; case 4:return 54;break;}}

		else if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;for(a=0; a<40000; a++){PORTD=1;if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;}}
		switch(cont){case 1:return 3;break; case 2:return 55;break; case 3:return 56;break; case 4:return 57;break;}}

		else if(PORTDbits.RD7==1){while(PORTDbits.RD7==1){} return 12;}
		
		PORTD=2;
			 if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;for(a=0; a<40000; a++){PORTD=2;if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;}}
		switch(cont){case 1:return 4;break; case 2:return 58;break; case 3:return 59;break; case 4:return 60;break;}}
		
		else if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;for(a=0; a<40000; a++){PORTD=2;if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;}}
		switch(cont){case 1:return 5;break; case 2:return 61;break; case 3:return 62;break; case 4:return 63;break;}}

		else if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;for(a=0; a<40000; a++){PORTD=2;if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;}}
		switch(cont){case 1:return 6;break; case 2:return 64;break; case 3:return 65;break; case 4:return 66;break;}}

		else if(PORTDbits.RD7==1){while(PORTDbits.RD7==1){} return 13;}
		
		PORTD=4;
			 if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;for(a=0; a<40000; a++){PORTD=4;if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){}cont++;}}
		switch(cont){case 1:return 7;break; case 2:return 67;break; case 3:return 68;break; case 4:return 69;break;}}
		
		else if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;for(a=0; a<40000; a++){PORTD=4;if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){}cont++;}}
		switch(cont){case 1:return 8;break; case 2:return 70;break; case 3:return 71;break; case 4:return 72;break;}}

		else if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;for(a=0; a<40000; a++){PORTD=4;if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){}cont++;}}
		switch(cont){case 1:return 9;break; case 2:return 73;break; case 3:return 74;break; case 4:return 74;break;}}

		else if(PORTDbits.RD7==1){while(PORTDbits.RD7==1){} return 14;}
		
		PORTD=8;
		if(PORTDbits.RD4==1){while(PORTDbits.RD4==1){} return 10;}
		else if(PORTDbits.RD5==1){while(PORTDbits.RD5==1){} return 0;}
		else if(PORTDbits.RD6==1){while(PORTDbits.RD6==1){} return 11;}
		else if(PORTDbits.RD7==1){while(PORTDbits.RD7==1){} return 15;}
		cont=0;
	goto a1;   
}


void main(){
   
	int m=0;   
      
	/*for(m=0; m<=255; m++)
	{
		Write_b_eep(m,0);
		Busy_eep();
		Write_b_eep(255,0);
		Busy_eep();         
	}*/
	TRISD=0xF0;
	TRISA=0;
	
	ADCON1=15;
	OpenXLCD(FOUR_BIT & LINES_5X7);

	while(1){menu_inicio();}
}

int menu_inicio(void){
	
	int dato=0, on, opcion;

	WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	putrsXLCD("   Para comenzar  ");
	SetDDRamAddr(0x40);
	putrsXLCD("     oprima D  ");
	
	a1:
	on=teclado_musa();
	if(on==15)
	{
		WriteCmdXLCD(1);
		SetDDRamAddr(0x00);
		putrsXLCD("DIRECTORIO");
		SetDDRamAddr(0x40);
		putrsXLCD("Telefonico");
		Delay10KTCYx(100);
		WriteCmdXLCD(1);
		interfaz();
	}
	else 
		WriteCmdXLCD(1);
		putrsXLCD(" Dato erroneo");
		SetDDRamAddr(0x40);
		putrsXLCD("    Oprima D");
		goto a1;
}
int interfaz(void){

	int  i, j;// pos0, pos1, pos2, pos3, pos4, pos5, pos6, pos7, p, h, k, block=0
	int numcc, numpass, num1, num2, num3, num4, num5, num6, num7, num8, num9, num10;
	int opcion;
	
	a1:
	WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	putrsXLCD("Numero:");
	SetDDRamAddr(0x40);

	for(i=0; i<10; i++)
	{
		numcc=teclado_musa();
		numero[i]=numcc;
		if(numcc==13)
		{   
			SetDDRamAddr(0x40+i-1);
			WriteDataXLCD(0x20); 
			SetDDRamAddr(0x40+i-1);
			i=i-2;
		}   
		else if(numcc!=13)
		{ 
			WriteDataXLCD(0x30+numcc);
		    	 if(i==0){num1=numcc;}
			else if(i==1){num2=numcc;}
			else if(i==2){num3=numcc;}
			else if(i==3){num4=numcc;}
			else if(i==4){num5=numcc;}
			else if(i==5){num6=numcc;}
			else if(i==6){num7=numcc;}
			else if(i==7){num8=numcc;}
			else if(i==8){num9=numcc;}
			else if(i==9){num10=numcc;}         
		}
	}

	// pos0=(num1*10)+num2;
	// pos1=(num3*10)+num4;
	// pos2=(num5*10)+num6;
	// pos3=(num7*10)+num8;
	// pos4=(num9*10)+num10;
if(i == 10)
	{
			
			
			WriteCmdXLCD(1);
			SetDDRamAddr(0x00);
			putrsXLCD("Nombre:");
			SetDDRamAddr(0x40);

			for(j=0; j<10; j++)
			{
				numpass=teclado_musa();
				nombre[j]=numpass;
				if(numpass==13)
				{   
					SetDDRamAddr(0x40+j-1);
					WriteDataXLCD(0x20); 
					SetDDRamAddr(0x40+j-1);
					j=j-2;
				}   
				else if(numpass!=13)
				{ 
						 WriteDataXLCD(0x30+numpass);
			   	 		 if(j==0){num1=numpass;}
			             else if(j==1){num2=numpass;}
			             else if(j==2){num3=numpass;}
			             else if(j==3){num4=numpass;}
			             else if(j==4){num5=numpass;}
			             else if(j==5){num6=numpass;}
			             else if(j==6){num7=numpass;}
			             else if(j==7){num8=numpass;}
               			 else if(j==8){num9=numpass;}
			             else if(j==9){num10=numpass;}   
				}
			}
			}
			if(j == 10)
			{
			WriteCmdXLCD(1);
			SetDDRamAddr(0x00);
			putrsXLCD("1)Buscar");
			SetDDRamAddr(0x40);
		     putrsXLCD("2)Continuar");
		    Delay10KTCYx(100);
		     WriteCmdXLCD(1);
			 opcion=teclado_musa();
			 if(opcion==1){
			 buscar();}
			 else goto a1;
}

}
int buscar(void){
    int  k;// pos0, pos1, pos2, pos3, pos4, pos5, pos6, pos7, p, h, k, block=0
	int busca, num11, num22, num33, num44, num55, num66, num77, num88, num99, num100;
	a3:
	WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	putrsXLCD("Buscando...");
	SetDDRamAddr(0x40);

	for(k=0; k<10; k++)
	{
		busca=teclado_musa();
		search[k]=busca;
		if(busca==13)
		{   
			SetDDRamAddr(0x40+k-1);
			WriteDataXLCD(0x20); 
			SetDDRamAddr(0x40+k-1);
			k=k-2;
		}   
		else if(busca!=13)
		{ 
			WriteDataXLCD(0x30+busca);
		    	 if(k==0){num11=busca;}
			else if(k==1){num22=busca;}
			else if(k==2){num33=busca;}
			else if(k==3){num44=busca;}
			else if(k==4){num55=busca;}
			else if(k==5){num66=busca;}
			else if(k==6){num77=busca;}
			else if(k==7){num88=busca;}
			else if(k==8){num99=busca;}
			else if(k==9){num100=busca;}         
		}
	}
	Delay10KTCYx(100);
	if(k == 10){

	
if( search==nombre || search==numero){
    WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	WriteDataXLCD(0x30+nombre); 
	SetDDRamAddr(0x40);
	WriteDataXLCD(0x30+numero);
}
	else if(search!=nombre || search!=numero){
	WriteCmdXLCD(1);
	SetDDRamAddr(0x00);
	putrsXLCD("Error");
	 goto a3;
	}
	}

}
 
Última edición:
#2
es muy difícil entender un código que no es tuyo si no te lo explican o lo comentan. Explica como funciona, o que quieres que haga la función buscar y será más fácil entenderlo.

Un saludo
 
#3
hola!
pues mira yo quiero que la funcion buscar se encargue de buscar y despues muestre el contacto, digitando el numero o solo el nombre del contacto (que ya se solicito anteriormente) entonces compararia con lo que se escribio en la funcion interfaz();
en la funcion interfaz se pide al usuario que digite el numero y el nombre del contacto
en la funcoin teclado_musa(); estoy declarando las teclas del teclado matricial 4x4

el error que tendria yo es que cuando estoy buscando el contacto ps no lo encuentra si no que me pide que lo busque una y otraves
 
#4
Buen dia, es un tema bastante interesante, estoy aprendiendo el c18 por servicios escolares, actualmente me encontre con una dificultad, tratar de mandar datos de un teclado a una lcd por usando el CI f4550, no me podria asesorar un poco en este tema.

Saludos
 
#5
tengo un problema con interfaz LCD con PIC18f4520 (MpLab C18 Compiler)

esta conectada de la siguiente manera.

RB2
RB3
RB4
RB5
Son los datos

alguien me podra ayudar
 
#6
tengo un problema con interfaz LCD con PIC18f4520 (MpLab C18 Compiler)

esta conectada de la siguiente manera.

RB2
RB3
RB4
RB5
Son los datos

alguien me podra ayudar
¿Y cual es tu problema?
¿Cual es tu programa y esquema?

Con la poca información que proporcionas es muy difícil que se te pueda ayudar.
 
#7
Mi problema es que quiero visualizar en una lcd ya modifique el archivo xlcd.h
de la siguiente manera pero nada

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB


/* CTRL_PORT defines the port where the control lines are connected.
* These are just samples, change to match your application.
*/
#define RW_PIN LATBbits.LATB0 /* PORT for RW */
#define TRIS_RW TRISBbits.TRISB0 /* TRIS for RW */
#define RS_PIN LATEbits.LATE2 /* PORT for RS */
#define TRIS_RS TRISEbits.TRISE2 /* TRIS for RS */
#define E_PIN LATBbits.LATB1 /* PORT for D */
#define TRIS_E TRISBbits.TRISB1 /* TRIS for E */


ademas lo datos de la lcd estan conectados por puertos B
asi RB2 DEL MICRO A D4 DE LA LCD
RB3 DEL MICRO A D5 DE LA LCD
RB4 DEL MICRO A D6 DE LA LCD
RB5 DEL MICRO A D7 DE LA LCD
 
#9
Muchas gracias.. la parte de control ya me funciona.

lo que todavia no es los datos desde RB2 a RB5

RB2 DEL MICRO A D4 DE LA LCD
RB3 DEL MICRO A D5 DE LA LCD
RB4 DEL MICRO A D6 DE LA LCD
RB5 DEL MICRO A D7 DE LA LCD

que puede hacer??
 
#10
Así como deje la librería es para trabajar la pantalla con los datos por el nibble alto.

D7 ---> RB7
D6 ---> RB6
D5 ---> RB5
D4 ---> RB4

E ---> RB0
RS ---> RB1
RW ---> RB2

Para trabajar con el nibble alto o el nibble bajo tienes que comentar o descomentar esta definición en la librería...

#define UPPER

¿Si así ya está funcionando para qué quieres modificar las líneas?
 
#11
La librería la entendí y agradezco por enviarla.

lo que pasa es que la tarjeta (Hardware) ya esta conectada así, por eso mi problema.
así esta conectada en la tarjeta que tengo que probar.

D7 ---> RB5
D6 ---> RB4
D5 ---> RB3
D4 ---> RB2

E ---> RB1
RS ---> RE2
RW ---> RB0

gracias por la ayuda
 
Arriba