Taj LCD 2x16 karaktera je standardna komponenta vec 20+ godina, tacno se zna kako radi i kako koje komande trebas da mu posaljes da bi nesto ispisao na ekranu.
Konkretno ekran je elektricno povezan preko 4bit ili 8bit paralelnog porta sa dodatkom jos par kontrolnih linija. U 4bit modu je sve slicno kao u 8bit stim sto imamo 4 zice/pinova manje ali zato komandu i podatke moramo da saljemo iz dva puta kao visi i nizi "nibl" tj pola gornjih 4 bitova pa posle donjih 4 bitova od jedne 8bit informacije koje hocemo da prenesemo.
Informacija moze da bude komanda ili podataka i to se fizicki selektuje na R/S pinu.
Kada upisujemo podatke na LCD trebamo postaviti R/W pin na "Write" i u vecini slucajeva nece biti potrebe da se iscitava nesto iz ekrana tako da taj pin uvek moze da bude povezan na ako ne gresim nisko logicko stanje i ustedi jedan pin na kontroleru.
Ostaje Enable linija preko koje se vrse sve operacije tokom upisa, kada je visioko onda moze da se prenese komanda/infomacija i kada se spusti na nisko stanje interna logika displeja to interpretira i odradi sta treba.
Postoji tacna procedura koje/kako komande trebaju da se prenesu prilikom inicijalizacije, pogledaj Arduino code, ima 15-ak nekih vrednosti koje trebaju da se prenesu jedna po jedna i sa obaveznim vremenskim pauzama na odradjenim koracima gde se ceka interni HW od ekrana da zavrsi nesto pa mogu da se salju sledece komande, ne moze samo da se redom "ispucaju" ka ekranu, nece da radi tako i to je cesta greska sa programima i tim pauzama.
Jednom kada se prodje ta logika sa inicializacijom i pauzama onda je ostalo sve manje vise prosto jer sve po istom principu, ima komanda za postavljanje kurzora i komanda za ispis karaktera i stringova kao niza karaktera, to je logicki uglavnom sve.
Sve ovo gore spomenuto vazi za vezu sa 4 ili 8 bit paralelnim interfejsom, dok u tvom slucaju izdmedju postoji jedan I2C expander koji sve to isto radi ali kontroler mora preko I2C da vrsi komunikaciju sa expanderom i da mu prica kako/koje pinove da pali/gasi da bi postigao opet istu stvar koju sam opisao gore stim sto moramo da budemo sigurni da I2C radi potpuno korektno i da je dobro podesen jer sam I2C zna da pravi dosta poteskoca i relativno je slozen za "hendlovanje" i cesto manje iskusni programeri znaju da zaglave sa tim I2C i jednostavno batale i predju na direktnu vezu MCU <> LCD2x16.