16x2 LCD no funciona con ATmega 8

1

El siguiente programa está escrito en el estudio AVR. Conexiones: los pines PORTD 0 a 7 están conectados a líneas de datos de LCD, es decir, DB0 a DB7 respectivamente, PORTB.1 conectado a RS, PORTB.2 conectado a R / W y PORTB.3 conectado a EN de 16x2 LCD JHD 162A.

En el programa PORTD.7 se comprueba si está ocupado o no.

Los caracteres no se muestran. Cualquier sugerencia o ayuda sería muy apreciada.

 #include<avr\io.h>

    void lcdcmd(unsigned char value);
    void lcddata(unsigned char value);
    void lcdready();
    void MSDelay(unsigned int time);
    int main()
    {
        DDRD=0xFF;
        DDRB=0xFF;
        PORTB = 0x00;

            lcdcmd(0x38);

            lcdcmd(0x0E);

            lcdcmd(0x01);

            lcdcmd(0x06);

            lcdcmd(0x86);

            lcddata('M');

            lcddata('D');

            lcddata('E');
        while(1);
        return 0;
    }

    void lcdcmd(unsigned char value)
    {
        lcdready();
        PORTD=value;
        PORTB=PORTB & ~(0b00000010); // rs
        PORTB=PORTB & ~(0b00000100); // rw
        PORTB=PORTB & ~(0b00001000); // en
        MSDelay(1);
        PORTB=PORTB | 0b00001000;
        return;
    }

    void lcddata(unsigned char value)
    {
        lcdready();
        PORTD=value;
        PORTB=PORTB & ~(0b00000010); // rs
        PORTB=PORTB & ~(0b00000100); // rw
        PORTB=PORTB & ~(0b00001000); // en
        MSDelay(1);
        PORTB=PORTB | 0b00001000;
        return;
    }

    void lcdready()
    {
        unsigned char temp;
        PORTD = 0x00;
        temp= PORTD | (1<<7);
        PORTD= temp;
        PORTB=PORTB & ~(0b00000010); // rs
        PORTB=PORTB | 0b00000100; // rw
        while(temp==1)
        {
            PORTB=PORTB & ~(0b00001000); // en
            MSDelay(1);
            PORTB=PORTB | 0b00001000;
            temp= PORTD & (1<<7);
        }
        return;
    }

    void MSDelay(unsigned int time)
    {
        unsigned int i,j;
        for(i=0;i<time;i++)
            for(j=0;j<1275;j++);
    }
    
pregunta shreyas

1 respuesta

1

Como dice la hoja de datos del HD44780U, no puede verificar el indicador de ocupado hasta que el controlador esté completamente inicializado. Utilice los retrasos antes de enviar 0x30 a la pantalla tres veces, con duraciones de 15 ms, 4,1 ms y 100 unidades respectivamente. Consulte la sección "Inicialización por instrucción" de la hoja de datos de HD44780U para obtener más información.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas