La secuencia de inicialización de LCD SPLC780D falla

0

Modelo de microcontrolador: PIC32MX340F512H
Controlador LCD: SPLC780D
Módulo LCD: MC42005A6W-FPTLW3-V2 (20 * 4)

He estado luchando durante dos semanas para que un módulo LCD basado en SPL780D funcione. Revisé el cableado y el código con los temporizadores muchas veces, según la hoja de datos y muchos ejemplos. Solo, y con otras personas.

Utilizo esta función para enviar instrucciones al módulo LCD:

void send(int rs, int rw, unsigned char db)
{
    RS = rs;
    RW = rw;
    wait(1000);//26ms
    E = 1;
    wait_k(1000);
    DB0 = (db & (1 << 0)) ? 1:0;
    DB1 = (db & (1 << 1)) ? 1:0;
    DB2 = (db & (1 << 2)) ? 1:0;
    DB3 = (db & (1 << 3)) ? 1:0;
    DB4 = (db & (1 << 4)) ? 1:0;
    DB5 = (db & (1 << 5)) ? 1:0;
    DB6 = (db & (1 << 6)) ? 1:0;
    DB7 = (db & (1 << 7)) ? 1:0;
    wait_k(1000);
    E = 0;
}

Intenté muchos otros retrasos y sigo la siguiente secuencia:

¿Puede alguien ayudarme por favor? El inicio de la secuencia hace que la pantalla parpadee una vez, y luego solo tengo dos líneas de cajas negras.

Estoy empezando a pensar que está roto.

Agregando el código completo a continuación:

#define DB0 LATDbits.LATD4
#define DB1 LATDbits.LATD5
#define DB2 LATDbits.LATD6
#define DB3 LATDbits.LATD7  
#define DB4 LATDbits.LATD8
#define DB5 LATDbits.LATD9
#define DB6 LATDbits.LATD10
#define DB7 LATDbits.LATD11

#define E   LATDbits.LATD3
#define RS  LATDbits.LATD0
#define RW  LATDbits.LATD1

void wait_k(int k)
{
    while (k)
    { k -= 1; }
}

void    init(void)
{
    LATDbits.LATD0 = 0;
    LATDbits.LATD1 = 0;
    LATDbits.LATD3 = 0;
    LATDbits.LATD4 = 0;
    LATDbits.LATD5 = 0;
    LATDbits.LATD6 = 0;
    LATDbits.LATD7 = 0;
    LATDbits.LATD8 = 0;
    LATDbits.LATD9 = 0;
    LATDbits.LATD10 = 0;
    LATDbits.LATD11 = 0;

    TRISDbits.TRISD0 = 0;
    TRISDbits.TRISD1 = 0;
    TRISDbits.TRISD3 = 0;
    TRISDbits.TRISD4 = 0;
    TRISDbits.TRISD5 = 0;
    TRISDbits.TRISD6 = 0;
    TRISDbits.TRISD7 = 0;
    TRISDbits.TRISD8 = 0;
    TRISDbits.TRISD9 = 0;
    TRISDbits.TRISD10 = 0;
    TRISDbits.TRISD11 = 0;

}

int main ()
{
    init();
    wait_k(1000);
    send(0, 0, 0b00110000);

    wait_k(1000);
    send(0, 0, 0b00110000);


    wait_k(100);
    send(0, 0, 0b00110000);


    wait_k(1000);
    send(0, 0, 0b00110000);


    wait_k(1000);
    send(0, 0, 0b00001000);

    wait_k(1000);
    send(0, 0, 0b00000001);

    wait_k(1000);
    send(0, 0, 0b00000111);

    //----End Of INIT

    wait_k(1000);
    send(0, 0, 0b00111000);//Function Set

    wait_k(1000);
    send(0, 0, 0b00001110);// Display on

    wait_k(1000);
    send(0, 0, 0b00000110);//Entry mode set

    wait_k(1000);
    send(1, 0, 0b01010111);//Write 'W'

    while(42);
        return 0;
}
    
pregunta Mehdi Sabwat

1 respuesta

0

Problema resuelto, era un problema de cableado. El uso de un analizador lógico (saleae 16 lógica) para perfilar las señales fue extremadamente útil. Además, es muy importante borrar los bits antes de devolverlos

    
respondido por el Mehdi Sabwat

Lea otras preguntas en las etiquetas