2017-06-29 4 views
2

Ich bin neu in der Elektronik und hat ein Tutorial über die Bedienung eines 16x2 Character LCD über I2C in Arduino mit liquidCrystal_I2C abgeschlossen. Alles funktioniert gut, aber ich habe eine Frage über die geringe Interaktion zwischen dem I2C und dem LCD. Betrachtet man den Quellcode der Bibliothek, bemerke ich, dass beim Schreiben eines 4-Bit-Nibbles (LiquidCrystal_I2C::write4bits) der Code das Nibble zuerst an den I2C-Expander schreibt und dann erneut schreibt, wenn das Enable-Bit gepulst wird. Warum ist die erste expanderWrite erforderlich? Warum kann write4bits nicht einfach pulseEnable aufrufen (mit gesetztem Schwarzlicht-Bit)?Protokoll zum Schreiben von Daten auf 16x2 LCD über I2C

Ich bin sicher, dass es einen Grund gibt, als ich andere Bibliothek wie RPLCD überprüfte und ein ähnliches Muster sehe. Kann mich jemand aufklären? Vielen Dank.

Antwort

0

Von der datasheet Ich fand das LCD erfordert bestimmte Timing im Kommunikationsprotokoll. An der steigenden Flanke der Enable-Leitung müssen die Register Select- und Read/Write-Zeilen für tsu1 (100ns) bereits gesetzt sein. An der fallenden Flanke der Freigabeleitung müssen sich die Daten für tsu2 (60ns) bereits festgesetzt haben. Durch Schreiben von _data schreiben sie auch die RS- und R/W-Zeilen, da sie das untere Nibble von _data sind.

This article deckt das Thema sehr gründlich ab.

TimingDiagram

//**** From LiquidCrystal_I2C.h 
// flags for backlight control 
#define LCD_BACKLIGHT 0x08 
#define LCD_NOBACKLIGHT 0x00 

#define En B00000100 // Enable bit 
#define Rw B00000010 // Read/Write bit 
#define Rs B00000001 // Register select bit 
//    ^--------Backlight bit defined above 
//   ^^^^---------Data bits 

//**** From LiquidCrystal_I2C.cpp 
void LiquidCrystal_I2C::write4bits(uint8_t value) { 
    expanderWrite(value); 
    pulseEnable(value); 
} 

void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ 
    Wire.beginTransmission(_addr); 
    Wire.write((int)(_data) | _backlightval); 
    Wire.endTransmission(); 
} 

void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ 
    expanderWrite(_data | En); // En high 
    delayMicroseconds(1);  // enable pulse must be >450ns 

    expanderWrite(_data & ~En); // En low 
    delayMicroseconds(50);  // commands need > 37us to settle 
} 
+0

Vielen Dank! Ich denke, das ist der Grund! –

Verwandte Themen