Problemas con la inicialización de LCD: modo de 4 bits

1

Tengo este microcontrolador con este LCD (DEM16216) montado en él que no puedo inicializar.

Sólo 4 de los pines están conectados, por lo que se ejecuta en un modo de 4 bits (¿creo?). Encontré la hoja de datos para ella (DEM16216), que proporciona una guía paso a paso sobre cómo hacerlo, pero por alguna razón no me funciona ...

¿Podría alguien decirme por qué esto no me funciona?

Esta es la hoja de datos de para mi LCD .

El que recomendó mi profesor fue éste .

El código completo se puede descargar desde [código] http://speedy.sh/vZJby/LCD-init-code.zip [/ code]

init se realiza fuera de un superloop, mientras que el comando se realiza dentro de un superloop.

¿Alguien podría explicar por qué esto no funciona?

screen.c

#include"screen.h"

void nibble_value(INT8U binary_value)
{
    if((binary_value & 0b00001000) == 8)      //DB7
        GPIO_PORTB_DATA_R |= (0b00100000);
    else
        GPIO_PORTB_DATA_R &= ~(0b00100000);

        if((binary_value & 0b00000100) == 4)    //DB6
            GPIO_PORTB_DATA_R |= (0b00010000);
        else
            GPIO_PORTB_DATA_R &= ~(0b00010000);

            if((binary_value & 0b00000010) == 2)    //DB5
                  GPIO_PORTB_DATA_R |= (0b00001000);
            else
                    GPIO_PORTB_DATA_R &= ~(0b00001000);

                if((binary_value & 0b00000001) == 1)    // DB4
                    GPIO_PORTB_DATA_R |= (0b00000100);
                else
                    GPIO_PORTB_DATA_R &= ~(0b00000100);

}
void enable_pin (int a)
{
    if (a)
    {
        GPIO_PORTB_DATA_R |= (0b01000000); //Disables "enable "pin

        redLed(ON); //Debug
    }

    else{
        GPIO_PORTB_DATA_R &= ~(0b01000000); // Enables  "enable" pin

                redLed(OFF); //debug
    }
}


void screen_init( void )
{
     //POwer on
     //MILLISEC(100);
    enable_pin(OFF);
    yellowLed(ON);
    greenLed(OFF);
    redLed(OFF);
    for(i=0; i<10000000; i++);
    yellowLed(OFF);
    redLed(ON);
     // Special case Function set
//----------------------------------------------------------------//

    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00000011);  // DB5 = 1, DB4 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin off
    // MILLISEC(15);                // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00000011);          // DB5 = 1, DB4 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // Enable pin off
    // MILLISEC(15);                // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00000011);          // DB5 = 1, DB4 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin off
    // MILLISEC(5);             // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//-----------------------------------------------------------------//
     //initial Function set
//-----------------------------------------------------------------//
    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00000010);          // 0x02 = 0b00000010 => DB5 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin = off
    // MILLISEC(5);             // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//----------------------------------------------------------------//
     //Function set
//----------------------------------------------------------------//
    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00000010);          // 0x02 = 0b00000010 => DB5 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable  pin = off
    // MILLISEC(5);             // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);             // 1 ms delay
     nibble_value(0b00001000);          // 0x8 = 0b00001000 n = 1 and f = 0 => DB7 = 1
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin = off
    // MILLISEC(5);             // 5 ms delay
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//----------------------------------------------------------------//
     //Display On/Off
//----------------------------------------------------------------//
    // MILLISEC(1);             // delay = 1 ms
     nibble_value(0x00);        // ZERO
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin = off
    // MILLISEC(5);                 // delay 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);                 // delay = 1 ms
     nibble_value(0b00001000);      // DB7  = 1 => display off
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable pin = off
    // MILLISEC(5);                 // delay = 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//---------------------------------------------------------------//
     //Clear Display
//---------------------------------------------------------------//
    // MILLISEC(1);                 // delay = 1 ms
     nibble_value(0b00000000);  // Zero
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // Enable pin = off
    // MILLISEC(5);                 // Delay  = 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);                 // delay = 1 ms
     nibble_value(0b00000001);  // No configurable bits, CLEAR Display
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable = off
    // MILLISEC(5);                 // delay = 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//---------------------------------------------------------------//
     //Entry Mode set
//---------------------------------------------------------------//
    // MILLISEC(1);                 // delay = 1 ms
     nibble_value(0b00000000);  // Zero
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // Enable pin = off
    // MILLISEC(5);                 // Delay  = 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

    // MILLISEC(1);                 // delay = 1 ms
     nibble_value(0b00000110);  // DB6 = 1, DB5 = 1 (increment by 1) , DB4 = 0 (No shift)
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // enable = off
    // MILLISEC(5);                 // delay = 5 ms
        for(i=0; i<10000000; i++);
        GPIO_PORTF_DATA_R ^= 0x01;

//---------------------------------------------------------------//
}

void command (void)
{
    //Command
//---------------------------------------------------------------//
     nibble_value(0b00000000);  // Zero
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // Enable pin off
    for(i=0; i<100; i++);

//--------------------------------------------------------------//
        //Command
//---------------------------------------------------------------//
     nibble_value(0b00001111);  // D  = 1, C = 1 , B = 1  => display on, cursor  on and blinking on..
     enable_pin(ON);            // enable pin on
     enable_pin(OFF);           // Enable pin off
    for(i=0; i<100; i++);

//--------------------------------------------------------------//
}

Main.c

#include "lm3s6965.h"
#include "systick.h"
#include "gpio.h"
#include "emp_type.h"
#include "swtimers.h"
#include "LED.h"
#include "screen.h"
int main(void)
{
     disable_global_int();
     init_clk_system();
     init_gpio();
     systick_init();
     enable_global_int();
     screen_init();
     INT16S alive_timer = MILLISEC(500);


    while(1)
    {
        redLed(ON);
        yellowLed(ON);
        greenLed(ON);
        while( !klik );
        klik--;
            if( ! --timer )
            {
                timer = MILLISEC( 500 );
                GPIO_PORTF_DATA_R ^= 0x01;
            }


    }
}
    
pregunta Carlton Banks

1 respuesta

1
  1. ¿estás configurando el pin RS en el valor correcto?

  2. Parece que piensas que puedes usar insert_value (x) para escribir 8 bits en la pantalla LCD, pero esto debe hacerse en dos pasos, como (asumiendo que los 4 bits escritos por wrire4 están conectados a la D7..D4 de su LCD):

    write4( b >> 4 );
    write4( b );
    
  3. Debe seguir la inicialización de 4 bits como se muestra en la secuencia de inicialización tal como se muestra en la hoja de datos EXACTAMENTE, y tenga en cuenta que cada fila en esa inicialización puede implicar dos comandos write4.

Su comando insert_value usa 2 bits del valor que le pasa a los bits RS y RW. Personalmente, prefiero mantener RW en W todo el tiempo, y paso RS como argumento separado. En su versión, es muy difícil ver qué datos está pasando a la pantalla LCD. Pero está claro que está escribiendo 3 nibbles, donde la hoja de datos especifica 4. Esta es mi secuencia:

      write4( 0x03 );
      timing::wait(  15 * timing::ms );
      write4( 0x03 );
      timing::wait(  100 * timing::us );
      write4( 0x03 );
      write4( 0x02 );     // 4 bit mode

Una nota general sobre la depuración: cuando tiene más de un problema, ya no puede razonar "Cambié esto por eso y no funcionó, por lo que no fue una buena idea". Solo funcionará cuando hayas resuelto TODOS los problemas.

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas