LCD 1602A vs LCD 1602E-15

Ciao,
sto cercando informazioni su un display 16x2 che non riesco a far funzionare. Ho cercato qualche documentazione ma è tutto frammentario o carente.
Il display è marchiato LCM1602E-15 sul retro del pcb , mentre sul fianco del puro lcd ( dove c’è la retroilluminazione, per intenderci) c’è scritto ‘K 1602C-5 A’ .
Ho provato a collegarlo tramite shiftregister 74HC4094 come ho collegato il classico 1602A e ho usato la stessa libreria, il display si accende ma credo non riesca ad inizializzarsi.
Non sapendo esattamente che chip gestisce questo display, mi viene da pensare possa essere un problema di delay corretti o qualche comando che mi sfugge.
Chiedo: qualcuno ha già avuto a che fare con un display di questo tipo oppure ha qualche datasheet?
Questo volta Google non è clemente...
Grazie!

Non ho conoscenza diretta. A me è capitato da un rivenditore cinese di avere un lcd 1602 con piedinatura diversa. Cioè i pin non erano in ordine come tutti i 1602 che ormai ti vendono.

Anche questo, come altri che ho trovato, hanno i pin nella parte bassa e il pinout parte con 15,16(A,K) e poi 1~14.
Ho trovato un doc con le dimensioni, ma tutto qua.
Credo sarà difficile, non impossibile ma difficile!

Ho trovato questo . Non so se può esserti utile.

Ciao,
P.

Grazie, l’avevo visto anch’io, il nome batte, i pin dono si un lato anziché in basso . Per il resto si assomigliano tutti... ho trovato un display visivamente uguale di un sito cinese dove c’e scritto che usa il chip KS0066U della Samsung .
Ho trovato il datasheet del chip ed effettivamente le istruzioni di inizializzazione sono diverse dal HD44780, sia i bit che i tempi.
Oggi provo a sistemare i comandi e vediamo.

Questo è il link del pdf del chip :

a pag 27 ci sono le istruzoni di inizializzazione.

sto provando a modificare i comandi nella libreria LCD3Wire in modo da adattarla a quelli che dovrebbero essere i comandi corretti al display in questione.
Ci sono alcune cose che non capisco ( a livello di bitwise) .
Con il classico display 1602A con HD44780 e shift register 4094 montato su una scheda recuperata ho dovuto solo cambiare le definizioni di Enable, R/W e RS adattandole al collegamento del 4094.
Ora, i collegamenti sono gli stessi ma i comandi cambiano.
Nella libreria, l'inizializzazione è :

// bitmasks for control bits on shift register
#define SHIFT_EN B00010000
#define SHIFT_RW B00000000
#define SHIFT_RS B00100000


//#define SHIFT_EN B00010000
//#define SHIFT_RW B00000000
//#define SHIFT_RS B01000000

 /////////// 4 pin initialization
  commandWrite(0x03); // function set: 4 pin initialization
  commandWrite(0x03); // function set: 4 pin initialization
  commandWrite(0x03); // function set: 4 pin initialization
  commandWrite(0x02); // function set: 4 pin initialization
  if (lcd_lines==1)
    commandWrite(0x20); // function set: 4-bit interface, 1 display line, 5x7 font
  else
    commandWrite(0x28); // function set: 4-bit interface, 2 display lines, 5x7 font
  /////////// end of 4 pin initialization 
  
  commandWrite(0x04); // entry mode set:
  delayMicroseconds(4500);
  commandWrite(0x04); // entry mode set:
  delayMicroseconds(150);
commandWrite(0x04); // entry mode set:
  delayMicroseconds(150);
// increment automatically, no display shift
  commandWrite(0x00); // display control:
  // turn display on, cursor on, no blinking
  commandWrite(0x02); 
  // clear display, set cursor position to zero

e le funzioni di scrittura :

void LCD3Wire::commandWrite(int value) {
  _pushByte(value, true);
  delay(5);
}

//print the given character at the current cursor position. overwrites, doesn't insert.
//void LCD3Wire::write(uint8_t value) {
inline size_t LCD3Wire::write(uint8_t value){
  _pushByte(value, false);
  return(value);
}
//

void LCD3Wire::_pushByte(int value, bool command) {
  int nibble = 0;

  digitalWrite(str_pin,LOW); // set the strobe LOW

  nibble = value >> 4; //send the first 4 databits (from eight)
  _pushNibble(nibble, command);

  delay(1);

  nibble = value & 15; // set HByte to zero 
  _pushNibble(nibble, command);
}

// called twice by each _pushByte
void LCD3Wire::_pushNibble(int nibble, bool command) {
  if (!command) {
      nibble |= SHIFT_RS; // set DI HIGH
      nibble &= ~SHIFT_RW; // set RW LOW
  }
  nibble &= ~SHIFT_EN; // set Enable LOW
  _pushOut(nibble);
  nibble |= SHIFT_EN; // Set Enable HIGH
  _pushOut(nibble);
  nibble &= ~SHIFT_EN; // set Enable LOW
  _pushOut(nibble); 

//}

}
// push byte to shift register and on to LCD
void LCD3Wire::_pushOut(int value) {
  shiftOut(dat_pin, clk_pin, MSBFIRST, value);
  digitalWrite(str_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(str_pin, LOW);
}

domanda 1:

se il primo commandWrite è 0x03 in binario è 11, ma quando lo shifto a destra, diventa 000011 o 0?
se è 000011 allora nella funzione pushNibble

nibble &= ~SHIFT_EN

dovrebbe essere :
nibble = 000011(xx?)
~SHIFT_EN = 11101111
quindi l' & diventa : 000011xx

nibble risulta invariato, a questo punto devo porre HIGH Enable e con OR:

nibble = 000011
SHIFT_EN = 00010000
OR = = 00000000

poi Enable viene riportato LOW, ma se nibble è diventato 000000 e SHIFT_EN è sempre 00010000 e la sua negazione è 11101111, il successivo &= mi ritorna 00000000, giusto?

quindi al primo commandWrite(0x03) viene passato 000011xx, 111011xx, 000000xx.
da documentazione HD44780 devo passare 000011, in teoria 2 volte .
Non mi è chiarissimo il concetto e spero di non esser stato confuso nella spiegazione, il problema è che dovrei capire come gestire i comandi del nuovo display.
Allego screenshot del HD44780 e nel post precedente c'era quello che dovrebbe essere il Power On a 4 bit del display incriminato.

Se qualcuno ha la volontà di illuminarmi, gliene sarei grato ! :slight_smile:

nibble risulta invariato, a questo punto devo porre HIGH Enable e con OR:

nibble = 000011
SHIFT_EN = 00010000
OR = = 00000000

poi Enable viene riportato LOW, ma se nibble è diventato 000000 e SHIFT_EN è sempre 00010000 e la sua negazione è 11101111, il successivo &= mi ritorna 00000000, giusto?

qua ho scritto una minchiata...

se nibble = 000011
SHIFT_EN = 00010000
OR = 000011

quindi viene passato per la seconda volta il comando 0x03, come richiesto per la configurazione a 4bit

Ora non mi è chiaro sul nuovo documento come gestire il tutto.
dice:
Function set:

RS R/W DB7 DB6 DB5 DB4
0 0 0 0 1 0
0 0 0 0 1 0
0 0 N F x x N=0 1linea, N=1 2linee; F=0 display off, F=1 display on

come mi comporto? quanti invii devo fare? Usando le stesse funzioni per poter usare Enable correttamente non riesco a capire cosa stanno chiedendo. Sono 3 invii separati da EN LOW/HIGH/LOW? Oppure 1 invio unico?

000010 potrebbe essere 0x02 >> 4 ,se seguo la libreria con nibble &= ~SHIFT_EN il risultante è :

nibble = 000010
~EN = 11101111
nibble-> 00001000

a questo punto nibble sarebbe
= 000010
SHIFT_EN = 00010000
OR = 00000000

per poi rifare l'& del SHIFT_EN negato , ma non avendo nessun '1' nel nibble il risultato è comunque 00000000 .

non mi torna. Perlomeno con queste funzioni..

Non mi è chiaro .... :frowning:

Non usare i quote per lo sketch ma code.
Per favore cambialo.
Ciao Uwe

Corretto, scusa, svista ...

Ho letto l datasheet e per me sono uguali, io ho LCD con ST7066.
Controlla bene se il bit 7 (Busy flag) è connesso, cioè in nibble mode solo 4 bit più significanti sono collegati, cioè DB7÷DB4.

Ciao.