desde que un compañero me dijo que implantase este codigo el lcd esta loco con digitos raros y cuadriculas blanca
//Funciones para escribir en un lcd.
//8 bits de bus de datos.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define Bus_Datos PORTA
#define Bus_Control PORTD
#define RS PORTD0 //Todos deben de pertenecer al mismo puerto
#define RW PORTD1
#define E PORTD2
//Comandos para situar el cursor en inicio de líneas.
#define DDRA_LINEA1 0x80 //1000 0000
#define DDRA_LINEA2 0xC0 //1100 0000
#define DDRA_LINEA3 0x94 //1001 0100
#define DDRA_LINEA4 0xD4 //1101 0100
void inicializar();
//Funciones para escribir en el LCD
void lcd_inicializar();
void lcd_escribir_c(unsigned char caracter);
void lcd_escribir(unsigned char *cadena);
void posicionar_cursor(unsigned char x, unsigned char y);
void lcd_comando(unsigned char comando);
int main(void)
{
inicializar();
lcd_inicializar();
unsigned char linea1[]=" www.jmnlab.com"; //Poner en la Flash de programa las cadenas.
unsigned char linea2[]=" Proyecto Hexapodo";
unsigned char linea3[]=" Prueba de LCD 4x20";
lcd_escribir(linea2); //Escribo una cadena, empieza en línea 1, carácter 1.
posicionar_cursor(2,1); //Línea 2, primer carácter.
lcd_escribir(linea1);
posicionar_cursor(3,1);
lcd_escribir(linea3);
posicionar_cursor(4,5);
lcd_escribir_c('A'); //Escribir los caracteres uno a uno, comprobación de su función correspondiente.
lcd_escribir_c('r');
lcd_escribir_c('d');
lcd_escribir_c('u');
lcd_escribir_c('i');
lcd_escribir_c('n');
lcd_escribir_c('o');
lcd_escribir_c(' ');
lcd_escribir_c('M');
lcd_escribir_c('e');
lcd_escribir_c('g');
lcd_escribir_c('a');
while(1)
{
}
}
inicializar() //Configurar hardware del pic.
{
DDRA=0xFF; //1111 1111
PORTA=0x00;
DDRD=0x07; //0000 0111
PORTD=0x00;
}
void lcd_inicializar() //Se mandan los comandos de configuración según el dibujo.
{
_delay_ms(100);
lcd_comando(0x3C); //Function Set RS0 RW0 0011NF** 0011 1100
lcd_comando(0x3C); //Function Set
lcd_comando(0x0C); //Display ON/OFF Control RS0 RW0 00001DCB 0000 1100
lcd_comando(0x01); //Display Clear RS0 RW0 00000001
lcd_comando(0x06); //Entry Mode Set RS0 RW0 000001I/DS 0000 0110
}
void lcd_escribir_c(unsigned char caracter)
{
Bus_Control |= (1<<RS); //RS1 Dato
Bus_Control &= ~(1<<RW); //RS0
Bus_Datos = caracter;
Bus_Control |= (1<<E);
_delay_us(100);
Bus_Control &= ~(1<<E);
_delay_ms(10);
}
void lcd_comando(unsigned char comando)
{
Bus_Control &= ~(1<<RS); //RS0 Comando
Bus_Control &= ~(1<<RW); //RW0
Bus_Datos = comando; //Comando
Bus_Control |= (1<<E);
_delay_us(100);
Bus_Control &= ~(1<<E);
_delay_ms(10);
}
void lcd_escribir(unsigned char *cadena)
{
unsigned char *inicio = cadena;
char i=0;
for(i=0;((inicio*!='\0')&&(i<20));i++)*
- {*
- Bus_Control |= (1<<RS); //RS0 RW0 caracter*
- Bus_Control &= ~(1<<RW);*
Bus_Datos = inicio*;
Bus_Control |= (1<<E);
delay_us(100);
Bus_Control &= ~(1<<E);
delay_ms(3);
_ }*
}
void posicionar_cursor(unsigned char x, unsigned char y) //línea x 1 a 4, carácter y de 1 a 20.
*{ *
* unsigned char comando=DDRA_LINEA1;
_ switch(x)*
* {*
* case 1:*
* {*
* comando=DDRA_LINEA1+y-1;
_ }break;_
_ case 2:_
_ {_
comando=DDRA_LINEA2+y-1;
_ }break;_
_ case 3:_
_ {_
comando=DDRA_LINEA3+y-1;
_ }break;_
_ case 4:_
_ {_
comando=DDRA_LINEA4+y-1;
_ }break;_
_ default:break;_
_ }_
lcd_comando(comando);
_}*_
que ocurrio y solucion resetee y nada


