Controlar un dispositivo LCD usando el módulo serial I2C

2

Compré un par de controladores LCD / I2C y he estado tratando de hacer que la cosa se inicialice. Soy capaz de comunicarme con el controlador I2C sin problemas, pero obtener la secuencia de inicialización correcta ha demostrado ser un verdadero dolor.

Este es el módulo y la pantalla LCD que tengo: LCD y controlador

La pantalla LCD se muestra como tipo 2004A y tiene J204A grabado en la parte posterior.

He leído que este controlador en particular utiliza el modo LCD de 4 bits y tiene las siguientes conexiones físicas al módulo LCD (desde el enlace anterior).

Del esquema, puedes derivar eso:

P0: RS

P1: RW

P2: CS

P3: BL

P4: D4

P5: D5

P6: D6

P7: D7

Teniendo en cuenta que las tramas de datos se envían (descuidando el ACK, inicio y parada) MSB, supongo que la MSB del byte cambiado a este dispositivo se representa en su salida como P7 (no pude encontrarlo directamente en el hoja de datos, pero después de un poco de prueba parece cierto).

Ahora, con todo eso a un lado y después de dirigir con éxito (y recibir un bit ACK) desde el controlador I2C, se debe inicializar el módulo LCD en modo de 4 bits y configurar otros parámetros; aquí es donde estoy completamente atascado.

He escrito la siguiente secuencia de inicio que simplemente no funciona:

void lcdInit(void){
_delay_ms(20); 

//D7 D6 D5 D4 BL CS RW RS
// x  x  x  x  1  1  0  0 = XC (hex)
    i2c_write(0x2C); _delay_us(4200);
    i2c_write(0x8C); _delay_us(4200); //0x28

    i2c_write(0x2C); _delay_us(120);
    i2c_write(0x8C); _delay_us(120);  //0x28

    i2c_write(0x2C); _delay_us(50);   //0x28
    i2c_write(0x8C); _delay_us(50);   //4 bit mode, N=1(2lines), F=0(5x8)

    i2c_write(0x0C); _delay_us(50);   //0x06
    i2c_write(0x6C); _delay_us(50);   //I/D=1(increment), S=0(display shift off)

    i2c_write(0x0C); _delay_us(50);   //0x0C
    i2c_write(0xCC); _delay_us(50);   //Display on, cursor off, blink off

    i2c_write(0x0C); _delay_us(1700);  //clear display
    i2c_write(0x1C); _delay_us(1700);  //0x01
}

Sé que cada byte enviado tiene el formato correcto (es decir, 0 0 1 DL N F X X), pero no se dijo nada con respecto al orden de dichas declaraciones.

Esta secuencia parecía la más lógica:

Conjunto de funciones (4 bits)

Modo de entrada (desplazamiento, etc.)

Comandos (variables de estado)

¿Alguna idea?

    
pregunta sherrellbc

2 respuestas

2
#define ON  1
#define OFF 0

//#define __LCD2__  // 2 row display
#define __LCD4__  // 4 row display

#ifdef __LCD2__
  #define LCD_MAX_LINES  2  // usually a 1602 2 X 16
  #define LCD_DISPLAY_WIDTH 16
  #define LCD_ID 0x4E       // I2C Base address for this interface
#endif

#ifdef __LCD4__
  #define LCD_MAX_LINES  4  // usually a J204A 4 X 20
  #define LCD_DISPLAY_WIDTH 20
  #define LCD_ID 0x40       // I2C Base address for this interface
#endif

#define RS          0b00000001  //P0 - PCF8574T Pin connected to RS
#define RW          0b00000010  //P1 - PCF8574T Pin connected to RW
#define EN          0b00000100  //P2 - PCF8574T Pin connected to EN
#define BACKLIGHT   0b00001000  //P3 - PCF8574T Pin connected to BACKLIGHT

#define LCD_LINE1   0x80        // LCD RAM address for line 1
#define LCD_LINE2   0xC0        // LCD RAM address for line 2
#define LCD_LINE3   0x94        // LCD RAM address for line 3
#define LCD_LINE4   0xD4        // LCD RAM address for line 4

int LcdBacklight = ON;

void InitLCD(void)
{
    printf("Initializing LCD...\r\n");

    delay_ms(500); //LCD power up delay

    LcdSendByte(0x00);
    LcdSendByte(0x10);
    LcdSendByte(0x00);
    LcdSendByte(0x00);
    LcdSendByte(0x10);

    //First state in 8 bit mode
    LcdSendByte(0x30);
    LcdSendByte(0x30);

    //Then set to 4-bit mode
    LcdSendByte(0x30);
    LcdSendByte(0x20);

    //mode 4 bit, 2 lines, characters 5 x 7
    LcdSendByte(0x20);
    LcdSendByte(0x80);

    //no need to have the cursor on. 
    //but if you want then '0Ch' is the addr
    LcdSendByte(0x00);
    LcdSendByte(0xC0);

    //the cursor moves to the left (06h)
    LcdSendByte(0x00);
    LcdSendByte(0x60);

    printf("LCD   Initialized...\r\n");
}
    
respondido por el Code6
0

Aquí hay una gran implementación de c #: LiquidCrystal_I2C.cs

    
respondido por el Curtis

Lea otras preguntas en las etiquetas