Hola a todos aqui estoy con un problemita para algunos facil pero para mi me tiene hasta el cuello....lo ke pasa es ke el programa ke hice para kontrolar el lcd no me funciona...aki les kuelgo el codigo en C (cc5x) por favor si alguien es tan amable de ayudarme a corregirlo....gracias.
El control lo hago kon RA<0:2> para E,R/W,RS respectivamente...los datos los envio por el puerto D del 16f874a el lcd es de 1x16....pero trabaja igual ke el de 2x16.
#pragma bit RS @ PORTA.2//RS=0 entrada de instruccion---RS=1 entrada dato (caracter)
#pragma bit RW @ PORTA.1// RW=0 escribe en el lcd ---RW=1 lee del modulo
#pragma bit EN @ PORTA.0//habilitacion del modulo
//-------------controles LCD--------------
#define DISP_ON 0b00001100 //ENCIENDE display
#define DISP_OFF 0b00001000 //APAGA display
#define CLR_DISP 0b00000001 //BORRA display
#define CUR_HOME 0b00000010 //CURSOR a Pos CERO
#define INC_CUR 0b00000110 //INCREMENTA CURSOR
#define CUR_DER 0b00010100 //kursor a la derecha
#define DD_RAM_ADDR 0b10000000 //
#define DD_RAM_ADDR2 0b11000000 //
#define CG_RAM_ADDR 0b01000000 //
#define Blink 0b00001101 //PARAPADEO DE DISPLAY
uns8 data;
void delay_ms(long x) //este delay_ms(1)=20.4 useg
{
long i;
do {
i = 7;
do{
i = i - 1;
}
while (i > 0);
}while (--x > 0);
}
void busy()
{
TRISA=0x00;
RS=1;
RW=1;
TRISD=0xff;
EN=1;
delay_ms(10);
X:
if(PORTD.7==1)
{
delay_ms(10);
nop();
goto X;
}
if(PORTD.7==0)
{
TRISD=0x00;
RS=0;
RW=0;
}EN=0;
}
void enable()
{
TRISA=0x00;
EN=1;
// delay_ms(1);
EN=0;
}
void LCD_inst(char i)
{
busy();
EN=0;
TRISA=0x00;//PORTA salida
RS=0; RW=0;//programa RS=0, R/W=0 ---modo instruccion--
//delay_ms(100);
EN=1;
data=i&0b11111111;
PORTD=data;
EN=0;
//enable();
}
void LCD_dato(char d)
{
busy();
EN=0;
TRISA=0x00;//PORTA salida
RS=1; RW=0;//programa RS=0, R/W=0 ---modo instruccion--
// delay_ms(100);
EN=1;
data=d&0b11111111;
PORTD=data;
LCD_inst(CUR_DER);
EN=0;
// enable();
}
/*void pos(char p)
{
EN=0;
RS=0;
RW=0;
LCD_inst(p);
// enviarLCD(0b0010000);
}*/
void iniport()
{
ADCON1=0x07;
TRISA=0x00;
PORTA=0;
PORTD=0;
}
void display(char a)//a=0 no parpadea--a=1 si parpadea
{
RS=0; RW=0;
if(a==0)
{
LCD_inst(0b00001110);
}
if(a==1)
{
LCD_inst(0x0f);
}
}
void iniLCD()
{
RS=0; RW=0;
delay_ms(900);//delay>ke 15ms
TRISD=0x00;//salida
PORTD=0b00110000;//
enable();
delay_ms(400);//delay>4.5ms
PORTD=0b00110000;//
enable();
delay_ms(7);//delay>100us
PORTD=0b00111000;//function set
enable();
LCD_inst(DISP_OFF);// PORTD=0b00001000;//display off
LCD_inst(DISP_ON);// PORTD=0b00000001;//display on
//LCD_inst(CLR_DISP);// PORTD=0b00000001;//display clear
LCD_inst(INC_CUR);// PORTD=0b00000110;//entry mode set
}
void main()
{
iniport();
iniLCD();
//LCD_inst(DISP_ON);
char x;
x=0;
do{
LCD_inst(CLR_DISP);
LCD_inst(0x80);
LCD_dato('H');
//LCD_inst(INC_CUR);
LCD_dato('O');
//LCD_inst(INC_CUR);
// busy();
//LCD_dato('A');
LCD_inst(INC_CUR);
// busy();
LCD_dato(' ');
//LCD_inst(INC_CUR);
// busy();
LCD_dato(' ');
//LCD_inst(INC_CUR);
// busy();
LCD_dato(':');
//LCD_inst(INC_CUR);
// busy();
LCD_dato('-');
// LCD_inst(INC_CUR);
// busy();
// delay_ms(100);
display(1);
LCD_dato('D');
// enable();
}
while(++x<3);}
/*
void main()
{
delay_ms(7);
}*/
bueno se daran kuenta ke tengo varias kosas komo komentario pues he buskado el error ke tengo...o los errores..jeje.....salu2