i2c kapcsolat. LCM1602 LCD-képernyő csatlakoztatása I2C-vel az Arduino-hoz

  • Az FC-113 modul a PCF8574T chipen alapul, amely egy 8 bites shift regiszter – egy bemeneti-kimeneti „bővítő” soros busz I2C. Az ábrán a mikroáramkört DD1-nek jelöltük.
  • Az R1 egy trim ellenállás az LCD kijelző kontrasztjának beállításához.
  • A J1 jumper a kijelző háttérvilágításának bekapcsolására szolgál.
  • Az 1…16 érintkezők a modul és az LCD kijelző érintkezőinek csatlakoztatására szolgálnak.
  • Az A1...A3 érintkezőfelületek szükségesek az eszköz I2C címének megváltoztatásához. A megfelelő jumperek forrasztásával megváltoztathatja az eszköz címét. A táblázat a címek és a jumperek megfelelését mutatja: a „0” szakadt áramkörnek, az „1” a telepített jumpernek felel meg. Alapértelmezés szerint mind a 3 jumper nyitva van, és az eszköz címe 0x27.

2 Az LCD-kijelző csatlakoztatási rajza az Arduino-hoz I2C protokollon keresztül

A modul az Arduino-hoz az I2C buszhoz szabványos módon csatlakozik: a modul SDA tűje az A4 analóg porthoz, az SCL tűje az Arduino A5 analóg portjához csatlakozik. A modult +5 V táplálja az Arduino-tól. Maga a modul az 1…16 érintkezőkön keresztül csatlakozik az LCD kijelző megfelelő 1…16 érintkezőihez.


3 Könyvtár a munkához I2C protokollon keresztül

Most szükségünk van egy könyvtárra, hogy az LCD-vel az I2C interfészen keresztül működjünk. Használhatja például ezt (link a "Mintakód és könyvtár letöltése" sorban).

Letöltött archívum LiquidCrystal_I2Cv1-1.rar csomagolja ki egy mappába \könyvtárak\, amely az Arduino IDE könyvtárában található.

A könyvtár támogatja az LCD képernyők szabványos funkcióit:

FunkcióCélja
Folyékony kristály() létrehozza típusú változó LiquidCrystal és elfogadja a kijelző csatlakozási paramétereit (pin számokat);
kezdődik() LCD kijelző inicializálása, paraméterek beállítása (sorok és karakterek száma);
egyértelmű() a képernyő törlése és a kurzor visszaállítása a kiindulási helyzetbe;
itthon() vissza a kurzort a kiinduló helyzetbe;
setCursor() a kurzor beállítása egy adott pozícióba;
ír() megjeleníti a szimbólumot az LCD képernyőn;
nyomtatás() szöveget jelenít meg az LCD képernyőn;
kurzor() mutatja a kurzort, azaz. aláhúzás a következő karakter helye alatt;
noCursor() elrejti a kurzort;
pislogás() kurzor villog;
noBlink() A villogás megszakítása;
noDisplay() a kijelző kikapcsolása az összes megjelenített információ mentése közben;
kijelző() a kijelző bekapcsolása az összes megjelenített információ mentése közben;
scrollDisplayLeft() görgessük a kijelző tartalmát 1 pozícióval balra;
scrollDisplayRight() görgessük a kijelző tartalmát 1 pozícióval jobbra;
automatikus görgetés() engedélyezze az automatikus görgetést;
noAutoscroll() az automatikus görgetés letiltása;
balról jobbra() beállítja a szöveg irányát balról jobbra;
jobbról balra() szöveg iránya jobbról balra;
CreateChar() egyéni karaktert hoz létre az LCD képernyő számára.

4 Vázlat a szövegkiadáshoz LCD képernyőre I2C buszon keresztül

Nyissuk meg a mintát: Fájlminták LiquidCrystal_I2C CustomCharsés változtatunk rajta egy kicsit. Megjelenítünk egy üzenetet, melynek végén egy villogó szimbólum lesz. A kódhoz fűzött megjegyzések a vázlat minden árnyalatát kommentálják.

#beleértve // tartalmazza a Wire könyvtárat #include // az LCD könyvtár csatlakoztatása #define printByte(args) write(args); // uint8_t szív = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // a „szív” szimbólum bitmaszkja LiquidCrystal_I2C lcd(0x27, 16, 2); // Állítsa be a 0x27-es címet a 16x2-es LCD-kijelzőhöz void setup() ( lcd.init(); // az LCD kijelző inicializálása lcd.backlight(); // a kijelző háttérvilágításának bekapcsolása lcd.createChar(3, szív); // „szív” szimbólum létrehozása a 3. memóriacellában lcd.home(); // helyezzük a kurzort balra felső sarok, a (0,0) lcd. pozícióba!"); // szövegsor nyomtatása lcd.setCursor(0, 1); // a kurzor mozgatása a 2. sorba, 1. karakter lcd.print(" i "); // üzenet nyomtatása a 2. sorban lcd.printByte(3); // a 3. cellában található „szív” szimbólum kinyomtatása lcd.print(" Arduino "); } void loop() (// az utolsó karakter villogása lcd.setCursor(13, 1); // mozgassa a kurzort a 2. sor 1. karakterére lcd.print("\t"); késleltetés(500); lcd.setCursor(13, 1); // a kurzor mozgatása a 2. sor 1. karakterére lcd.print(" "); késleltetés(500); }

Egyébként a parancs által írt karakterek lcd.createChar();, a kikapcsolás után is a kijelző memóriájában marad, mert ROM 1602 megjelenítésére írva.

5 Készítse el saját szimbólumait LCD kijelzőhöz

Nézzük meg közelebbről az LCD-képernyők saját szimbólumainak létrehozásának kérdését. Minden karakter a képernyőn 35 pontból áll: 5 széles és 7 magas (+1 tartalék vonal az aláhúzáshoz). A fenti vázlat 6. sorában definiálunk egy 7 számból álló tömböt: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Hexadecimális számok átalakítása binárissá: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Ezek a számok nem mások, mint bitmaszkok a szimbólum mind a 7 sorához, ahol a "0" világos pontot, az "1" pedig a sötét pontot jelöl. Például egy bitmaszkként megadott szívszimbólum jelenik meg a képernyőn az ábrán látható módon.

6 LCD képernyő vezérlés I2C buszon keresztül

Töltsük fel a vázlatot az Arduino-ba. A képernyőn megjelenik az általunk megadott felirat a végén villogó kurzorral.


7 Mi van mögötte I2C busz

Bónuszként nézzük meg az "A", "B" és "C" latin karakterek LCD-kijelzőn történő megjelenítésének időzítési diagramját. Ezek a karakterek a kijelző ROM-ban vannak tárolva, és a képernyőn egyszerűen a címüknek a kijelzőre történő továbbításával jelennek meg. A diagramot a kijelző RS, RW, E, D4, D5, D6 és D7 érintkezőiből vettük, azaz. már az FC-113 „I2C párhuzamos busz” átalakító után. Elmondhatjuk, hogy egy kicsit mélyebbre merülünk a hardverben.


Az „A”, „B” és „C” latin karakterek LCD-kijelzőn történő megjelenítésének időzítési diagramja 1602

A diagram azt mutatja, hogy a megjelenítő ROM-ban lévő karakterek (lásd az adatlap 11. oldalát, az alábbi hivatkozást) két nibble-ben kerülnek továbbításra, amelyek közül az első a táblázat oszlopának számát, a második pedig a sorszámot határozza meg. Ebben az esetben az adatok „reteszelve” vannak a jel szélén a vonalon E(Engedélyezés), és a sor R.S.(Regisztráció kiválasztása) logikai egy állapotban van, ami azt jelenti, hogy adatátvitel folyik. Az RS sor alacsony állapota azt jelenti, hogy utasítások küldése folyamatban van, amit minden karakter átvitele előtt látunk. BAN BEN ebben az esetben az LCD-kijelző (0, 0) pozícióba való kocsi-visszatérés utasításkódja kerül továbbításra, amely tanulmányozással szintén megtudható technikai leírás kijelző.

És még egy példa. Ez az időzítési diagram a szív szimbólum kimenetét mutatja az LCD kijelzőn.


Ismét az első két impulzus Engedélyezze kövesse az utasításokat Itthon()(0000 0010 2) - állítsa vissza a kocsit a (0; 0) pozícióba, és a második kettőt - adja ki a 3. memóriacellában tárolt LCD kijelzőre 10 (0000 0011 2) a „szív” szimbólumot (utasítás lcd.createChar(3, szív); vázlat).

Talán az egyik legnépszerűbb képernyő a piacon. A népszerű HD44780U vezérlőre épül. A modell nevéből az következik, hogy a képernyő két, 16 karakterből álló sorból áll. Orosz nyelv támogatása ebben konkrét modell Nem.

Az sh2s adatbusz lehetővé teszi akár 127 eszköz egyidejű csatlakoztatását két vezetéken keresztül. Ez az I2C a PCF8574T chipen van megvalósítva.

Csatlakozási diagram:

A kék dolog egy változó ellenállás, amely lehetővé teszi a képernyő kontrasztjának beállítását.

A bal oldali jumper felelős a képernyő háttérvilágításáért.

Egy 4 érintkezőből álló blokk csatlakozik az arduinóhoz, így:

GND - GND
VCC - 5V
SDA - A4 (ha Arduino MEGA, akkor D20)
SCL - A5 (ha Arduino MEGA, akkor D21-re)

Könyvtár

Vázlat

A kijelzőnek más IIC-címe lehet, 0x27 helyett 0x3F lehet. A cím pontos meghatározásához i2c eszközszkennert használhat.

#beleértve #beleértve //az LCD képernyő címének beállítása 0x27, 16 karakter, 2 sor LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() ( lcd.init(); // A képernyő inicializálása //bekapcsolja a háttérvilágítást lcd.backlight(); //Állítsa be azt a pozíciót, ahonnan a szöveg megjelenjen. lcd.setCursor(2, 0); //1. kimeneti sor lcd.print("Helló, világ!"); //ugyanúgy nyomtatja ki a második sort lcd.setCursor(1, 1); lcd.print("www.webhely"); ) üres hurok () ( )

Az LCD I2C modul lehetővé teszi karakteres kijelző csatlakoztatását az Arduino kártyához mindössze két jelvezeték segítségével.

Felhasznált alkatrészek (Kínában vásárolható):

. Vezérlőtábla

. Csatlakozó vezetékek

Fő műszaki jellemzők:

Kijelző: 16x02 vagy 20x04 karakter
. Háttérvilágítás: kék, fehér karakterekkel
. Kontraszt: Potenciométerrel állítható
. Tápfeszültség: 5V
. Interfész: I2C
. I2C cím: 0x27
. Méretek: 82mm x 35mm x 18mm

Csatlakozás Arduinohoz

A modul négy tűs 2,54 mm-es csatlakozóval van felszerelve

SCL: soros óravonal (Serial CLlock)

S.D.A.: soros adatvonal (Serial DAta)

VCC: "+" teljesítmény

GND: "-" erő

A különböző vezérlőkön alapuló Arduino kártyákon az I2C interfészért felelős érintkezők eltérőek

A modul használatához telepítenie kell a LiquidCrystal_I2C1602V1 könyvtárat

Töltse le, csomagolja ki és helyezze el az Arduino mappában található könyvtárak mappájába. Ha az Arduino IDE nyitva volt a könyvtár hozzáadásakor, indítsa újra a környezetet.

Menjünk közvetlenül a vázlathoz. Ebben a példában a szabványos "Hello, world!" és közösségi címünkre.

példa programkód:

#beleértve #beleértve LiquidCrystal_I2C lcd(0x27,16,2); /* Állítsa be a címet és a kijelző méretét. 20x04-es kijelzővel rendelkező LCD I2C modul használatakor semmit sem kell módosítani a kódon, csak be kell állítani a megfelelő méretet */üres beállít() ( lcd.init(); // Lcd inicializálása lcd.backlight(); // Kapcsolja be a háttérvilágítást // A kurzor 1 sor elején van lcd.print("Helló, világ!"); // Szöveg megjelenítése lcd.setCursor (0, 1); // Állítsa a kurzort a 2. sor elejére lcd.print("webhely"); // Kimeneti szöveg ) void hurok () { }

Készítse el saját szimbólumait

A szövegkimenetet rendeztük, az angol ábécé betűi a kijelzőn belül a vezérlő memóriájába vannak bekötve, és nincs velük probléma. De mi a teendő, ha a szükséges szimbólum nincs a vezérlő memóriájában?

Nem probléma, a szükséges szimbólum manuálisan létrehozható. Ez a módszer Részben a 7 karakteres korlátozás segít megoldani a kimeneti problémát.

Az általunk vizsgált kijelzők cellája 5x8 pixel felbontású. A szimbólum létrehozásának csak annyi a feladata, hogy írjunk egy bitmaszkot, és helyezzünk el benne egyet olyan helyeken, ahol a pontoknak világítaniuk kell, és nullákat ott, ahol nem.

Az alábbi példában mosolygó arcot rajzolunk.

példa programkód:

//Arduino IDE 1.0.5-ön tesztelve // Adja hozzá a szükséges könyvtárakat#beleértve #beleértve // A mosoly szimbólum bitmaszkja bájt mosoly = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal_I2C lcd(0x27,20,4); // Állítsa be a címet és a kijelző méretét.üres beállít() ( lcd.init(); // Lcd inicializálása lcd.backlight(); // Kapcsolja be a háttérvilágítást // 0 szimbólumszám létrehozása lcd.createChar(1, mosoly); lcd.setCursor(0, 0); // Állítsa a kurzort 1 sor elejére lcd.print("\1"); // Mosolygó arc megjelenítése (1-es számú karakter) - "\1") érvénytelen hurok () { }

Program a szimbólumok egyszerű létrehozásához

A kommentekben a közösség egyik tagja linket küldött a szimbólumgenerátorhoz

Innen kaptam jó bolt A Chip Resistor egy másik eszköz a tanulmányozáshoz és az alkalmazáshoz hasznos eszközök. Kiderült, hogy ezt az eszközt egy HD44780 vezérlővel vezérelt LCD kijelző 4 bites módban történő vezérlésére tervezték. Ebből a célból egy mikroáramkört telepítenek a kártyára, amely az I2C busz átalakítója egy párhuzamos 8 bites portra.

A tábla úgy van elhelyezve, hogy azonnal csatlakoztatható legyen az LCD kijelzőhöz. A bemenet tápellátást és I2C vonalat lát el. A tábla azonnal fel van szerelve felhúzó ellenállásokkal az SCL és SDA vonalakon, a kontraszt beállítására szolgáló potenciométerrel és magának a kijelzőnek a tápellátásával.

A jobb oldali jumper be-/kikapcsolja a háttérvilágítást. Ezután tesztelővel felfegyverkezve a következő táblázatot állítottuk össze. A modul tanulmányozása után kiderült, hogy P3 szabályozza a háttérvilágítást. Ha a jumper fel van szerelve, akkor az 1 bekapcsolja a háttérvilágítást, a 0 pedig kikapcsolja. A jumper eltávolításakor a háttérvilágítás mindig ki van kapcsolva. Ezt követően úgy döntöttek, hogy az axlib könyvtárat kiegészítik az I2C busszal való munkavégzéshez (szoftver megvalósítás) és a PCF8574 chip vezérléséhez szükséges funkciókkal. Dióhéjban a modul működése. Egy bájt párhuzamos kimenetéhez el kell küldeni a mikroáramkör címét az I2C buszra (alapértelmezetten 0x4E. A címet úgy is megváltoztathatjuk, hogy jumpereket forrasztunk a táblára, és módosítjuk a három legkevésbé jelentős értékét cím bitjei), majd az ACK fogadása után egy adatbájt kerül elküldésre. Miután a chip ACK-vel válaszol, a bájt megjelenik a chip párhuzamos portján. Az LCD-kijelző vezérléséhez az axlib könyvtárból vettem át funkciókat, és kissé módosítottam, hogy az I2C busszal működjenek. #beleértve #beleértve #beleértve #beleértve #define ADD 0x4E // Chip címe /* LCD Chip RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 A P3 csatlakozó lábon háttérvilágítás található. 1 be, 0 kikapcsolva */ // Kimeneti adatok com |= 0x04; // E egységenként pcf8574_byte_out(com, ADD); // Kimeneti adatok com &= 0xFB; // E-től nulláig pcf8574_byte_out(com, ADD); // Kimeneti adatok) void init(void) ( _delay_ms(30); com(0x30); _delay_us(40); com(0x30); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x30); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x20); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x20); // Paraméterek beállítása com(0x80); // Paraméterek beállítása com(0x00); // Kapcsold ki a kijelzőt com(0x80); // Kapcsold ki a kijelzőt com(0x00); // A kijelző törlése com(0x10); // A kijelző törlése com(0x00); com(0x60); // Az adatbeviteli mód beállítása com(0x00); com(0xC0); // A kijelző bekapcsolása a kiválasztott kurzorral) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Adat_h legjelentősebb 4 bitjének átvitele |= 0x04; pcf8574_byte_out(data_h, ADD); // A legjelentősebb 4 bit átvitele // A legjelentősebb 4 bit átvitele // Transfer low 4 bit // Transfer low 4 bit // Transfer low 4 bit) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" ); míg(1) ( ) ) Pontosan mi folyik itt. Először csatlakoztatjuk az I2C és a PCF8574 könyvtárait. Az I2C-ről már írtam, szóval még egyszer folytatom, de elmondom, mi van a PCF8574.h-ban. A könyvtár mindössze három funkciót tartalmaz.
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; ) Az első függvény azért íródott, hogy ellenőrizze, van-e eszköz a buszon. Elvileg bármilyen, a buszon elhelyezkedő eszközt meg lehet vele keresni. A függvény felveszi a kívánt eszköz címét, és ha válaszol, akkor nullát ad vissza. Ha egy ilyen címmel rendelkező eszköz nincs a buszon, akkor visszaküld egyet.
BYTE pcf8574_byte_out(BYTE adat, BYTE hozzáadás) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); (i2c_stop) ) Ez a funkció már kizárólag ehhez a chiphez van szabva. Argumentumként meg van adva egy bájt, amit át kell vinni a buszra, és a chip címe. A függvény először cím szerint lekérdezi a chipet, majd elküldi a bájtot. Ha a chip kapott egy bájtot és ACK-vel válaszolt, akkor a funkció befejezi a chippel való munkát, és nullát ad vissza a bájt sikeres elküldéseként. És ekkor a mikroáramkör ezt a bájtot adja ki a párhuzamos portjára. Ellenkező esetben NACK-t kapunk, és visszaküldünk egyet, az átvitel nem sikerült.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Ez a függvény kísérletezésre készült. Elfogad egy mutatót egy egybájtos adatok tömbjére, ezeknek a bájtoknak a számára és a chip címére. Valójában egy kísérlet az összes adat átvitelére egy munkamenetben, és nem munkamenetenként egy bájtban. A funkció működik, de nem alkalmas LCD kijelzőre. Most térjünk vissza a fő programhoz. A könyvtárak csatlakoztatása után megírjuk a mikroáramkör címét. Ezután három, az lcd.h-hoz hasonló függvényt hozunk létre. Az egyetlen különbség az adatátvitel elvén van.
void com(BYTE com) ( com |= 0x08; // P3 az egyikre, hogy a háttérvilágítás be legyen kapcsolva pcf8574_byte_out(com, ADD); // Kimeneti adatok com |= 0x04; // E egységenként pcf8574_byte_out(com, ADD); // Kimeneti adatok com &= 0xFB; // E-től nulláig pcf8574_byte_out(com, ADD); // Kimeneti adatok } Ez a funkció csak parancsokat küld a kijelzőnek. Itt jelent meg az első sor a 0x08 parancs logikai hozzáadásával. Erre a hibára azért van szükség, mert a bájtot nem közvetlenül az LCD kijelző portjára továbbítjuk, hanem az átjátszónkon keresztül. Azaz, ha megadtunk egy bájtot, és csak egy bitet kell kiadnunk, akkor kérjük, rendelje hozzá a szükséges bitet az előző bájthoz, és küldje el újra a portra. Ez akkora gond. A 0x08-cal való összeadás szükséges ahhoz, hogy az egy folyamatosan a harmadik számjegyben maradjon. Emlékszel a háttérvilágításra? Ez a kiegészítés kapcsolja be a háttérvilágítást. Ekkor egy bájt buszra átvitelének függvényét hívjuk. Erről fentebb van írva. Ezután a buszon keresztül továbbítjuk a bájtot a chipre. Ezután állítsa az E-t 1-re, amit a bájt 0x04-es logikai hozzáadásával valósít meg. Az E. alaphelyzetbe állítása után tehát bármilyen parancsot csak úgy küldhet a kijelzőre, ha magát a parancsot argumentumként adja át. void init(void) ( _delay_ms(30); // Bekapcsolás után szünet com(0x30); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x30); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x30); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x20); // Váltás 4 bites módra _delay_us(40); // A parancs végrehajtásának késleltetése com(0x20); // Paraméterek beállítása com(0x80); // Paraméterek beállítása com(0x00); // Kapcsold ki a kijelzőt com(0x80); // Kapcsold ki a kijelzőt com(0x00); // A kijelző törlése com(0x10); // A kijelző törlése com(0x00); // Az adatbeviteli mód beállítása com(0x60); // Az adatbeviteli mód beállítása com(0x00); // A kijelző bekapcsolása a kiválasztott kurzorral com(0xC0); // A kijelző bekapcsolása a kiválasztott kurzorral } Ez a funkció csak inicializálja a kijelzőt. A parancsok sorrendje az LCD-kijelzőn lévő adatlapról származik. void char_out(BYTE data) ( BYTE adat_h = ((adatok & 0xF0) + 0x09); BYTE data_l = ((data // Adat_h legjelentősebb 4 bitjének átvitele |= 0x04; pcf8574_byte_out(data_h, ADD); // A legjelentősebb 4 bit átvitele adat_h &= 0xF9; pcf8574_byte_out(data_h, ADD); // A legjelentősebb 4 bit átvitele pcf8574_byte_out(data_l, ADD); // Transfer low 4 bit adat_l |= 0x04; pcf8574_byte_out(data_l, ADD); // Transfer low 4 bit adat_l &= 0xF9; pcf8574_byte_out(data_l, ADD); // Transfer low 4 bit } Ez a funkció adatokat továbbít az LCD kijelzőre. Ugyanúgy hajtódik végre, mint a parancsok, kivéve, hogy a bájt először a legjelentősebb nibble-lel, majd az alacsony bájttal kerül továbbításra. És a többi ugyanaz. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) Nos, ez a funkció pusztán egy karakterlánc megjelenítésére szolgál. Valójában ennek semmi köze a témánkhoz.

Az AtmelStudio 6.2 projektje

Illetékes 01.08.15 17:11

A vessző hiányzik. Így van: "HELLO WORLD!" És ez a készülék nem csak a HD44780-hoz készült. A felhúzó ellenállások a mester oldalon vannak felszerelve. A specifikáció szerint az adatok E esési irányban íródnak az LCD vezérlőbe. Így az első funkció leegyszerűsödött: void com(BYTE com) ( com |= 0x08; // háttérvilágítás pcf8574_byte_out(com | 0x04, ADD); / / Adatkimenet pcf8574_byte_out(com , ADD); // E to zero) És a többi is lényegesen kevesebb lehet. Például a void char_out(BYTE data) csak két hívást vesz igénybe, és még inkább további változók nélkül. Az LCD inicializálása az időzítési előírások megsértésével történt.

Alekszej 02.08.15 19:11

A hiányzó vessző miatt a kijelzőt ez nem érinti. Ezt az eszközt kifejezetten ilyen vagy hasonló vezérlővel rendelkező kijelzőkhöz tervezték. De ez a mikroáramkör egy igazán egyszerű portbővítő. Egyetértek E-vel. További változókra van szükség. Ha argumentumot ad át egy függvénynek, és bizonyos műveleteket logikával hajt végre, hibák léphetnek fel. Ezzel már találkoztam. Az inicializálás az időzítések megsértése nélkül történik. A dokumentáció szerint 40 µs szünet van a parancsok között. Tekintettel arra, hogy az i2c buszon keresztül történik az átvitel, ami viszont szoftveres és lassú, a periódusok kamatosan záródnak. Ha még mindig nem vagy túl lusta, akkor írja meg a verzióját és küldje el nekem. közzéteszem. Végeredményben ez az oldal amatőr közönségnek készült, és aki akarja, elmondhatja véleményét, elképzelését az MK életéről.

Alekszej 06.08.15 09:14

Hozzáadott időzítések a kijelző inicializálása során, ahogy azt az elismert „Literate” megjegyezte

Dmitrij 2016.06.14. 21:57

Helló Alexey! Hozzáadhat egy könyvtárat a kódgenerátorhoz a PCF8574 használatához.

Alekszej 2016.06.14. 22:32

Gondolkozni fogok.))

ruslan 21.12.16 19:54
Alexey 2016.12.21. 21:53

Ó igen. Főleg az ASMA kódja. Az Arduino szakértői maximálisan értékelni fogják)))

Py.sy.
Ha nem is nézed az ASM-et, ott a program PIC vezérlőre van írva. Ez „nagyon” hasznos információ az AVR specialisták számára? főleg kezdőknek))) A PIC ellen nincs semmim, de még a PIC és az AVR ASM-je is más. Ami az LCD kijelző működésének részleteit illeti, meg lehet nézni))) Igaz, CVAVR alá is írtam, de az összes parancsot szétszedik és polcokra rendezik. De mindenesetre döntse el maga, hol van leírva érthetőbben))) A szerző ír, az olvasó választ.

GeK 01/04/17 12:52

"A chip I2C címe (alapértelmezés szerint 0x4E")

A cím legjelentősebb 4 bitje rögzített,
A PCF8574 előtagja 0100, a PCF8574A esetében pedig 0111
Az alsó 3 bit a chip A2-A0 bemeneteinek állapotától függ. Alapértelmezés szerint mind a 3 jumper nyitva van, a chip címe 0111111.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Alexey 01/04/17 14:27

Valamit összekevertél.
Kivonat a mikroáramkör dokumentációjából

A 0b01001110 a 0x4E
Tehát itt minden helyes. És ha módosítania kell a címet, akkor csak a Define-ben kell módosítania.

Jurij 12/14/17 21:26

Jó nap! Az lcdgotoxy és az lcdclear függvénykódokat is használhatja a PCF8574 adapterrel való együttműködéshez.

Sándor 05.20.18 18:14

Jó nap! Hogyan adsz ki orosz szöveget?

Alekszej 05.20.18 23:04

Ez egy hazai kijelző a MELT-től. A cirill ábécé be van kötve az emlékezetébe.

Sándor 18.05.21 04:55

Jó nap! Úgy írok, mint te az AtmelStudio 6.2-es projektjében: "ЁPҐBET MҐP!" normálisan ad ki
és ha azt írod, hogy "HELLO WORLD!" mindenféle hülyeséget kihoz. nekem kettő van
Az egyik megjelenítési lehetőség cirill ábécé. a második a kínai.

Alexey 05/21/18 09:22

Először egy tesztprogramot írnék. A teljes memórián áthalad, és megjeleníti a szimbólumokat és azok címeit. És akkor derítsd ki, mi a probléma. Valószínűleg a karaktertábla nem egyezik az ascii táblával.

Andrey 09/03/18 08:32

Jó napot!

Tudnál adni egy kapcsolási rajzot a Proteushoz?

Andrey 09/03/18 10:22

Vagy nem ellenőrizte senki a Proteuse-ban?

Andrey 09/03/18 10:56

Kitaláltam a main_init-et

Pavel 05/30/19 23:35

Érdekes dolog, hogy a kijelző címe 0x4E, és ha ugyanaz a kijelző csatlakozik az Arduinohoz, akkor a cím 0x27

Pavel 2019.05.31. 11:04

Nagyon szépen köszönöm a munkádat! Az egész internetet átkutattam, és az önén kívül egyetlen példa sem működött. Az egyetlen dolog, hogy a projektarchívumban a _delay_ késleltetések nincsenek megadva a megjelenítés inicializálási funkciójában, és ennek megfelelően nem működik

Alexey 06/01/19 09:52

Nos, ez inkább egy demonstrációs projekt. Jó okkal át kell írni az axlib könyvtárat, de tekintettel arra, hogy az STM32 és az STM8 ugrásszerűen mozog, az AVR-nek semmi értelme.

Pavel 06/05/19 12:57

Az STM-nek nincs DIP-csomagja, nehezebb nyomtatott áramköri lapokat készíteni. Az én projektjeimhez az AVR képességei bőven elegendőek, sok minden elfér egy Atmega 8-on

Alexey 06/05/19 15:20

Igen, de mennyibe kerül az Atmega8 és az stm8s003)))

Dmitrij 06/07/19 00:41

Hello Alexey.
Kérem, mondja meg, hogyan tudom kiolvasni a port állapotát a pcf8574-ből?
Szeretnék egy külső egységet készíteni, 8 GPIO-t az i2c buszon - ez az.

Dmitrij 06/07/19 17:56

válaszolok magamnak
A függvény egy bájtot ad vissza - a mikroáramköri portok állapotát
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t ask = ACK;
addr |= 0b01; //OLVAS
uint8_t data=0;
i2c_start();
ask = i2c_send_byte(addr);
if(!ask) data = i2c_read_byte(NACK);
i2c_stop();

Adatok visszaküldése;
}

Pavel 06/07/19 20:37

Mennyibe kerül, 150 rubel, általában egy relé ára), és hogyan lehet huzalozni az STM-et? A LUT megbízhatatlan, a CNC router nem biztos benne, hogy mire lesz szüksége (nem próbáltam)

LCD kijelzö– gyakori vendég az Arduino projektekben. De összetett áramkörökben előfordulhat, hogy hiányoznak az Arduino portok, mivel sok-sok érintkezős pajzsot kell csatlakoztatni. A megoldás ebben a helyzetben az lehet I2C/IIC egy adapter, amely egy szinte szabványos Arduino 1602 pajzsot köt össze Uno, Nano vagy Mega kártyákkal, mindössze 4 tűvel. Ebben a cikkben megvizsgáljuk, hogyan csatlakoztathat LCD képernyőt I2C interfésszel, milyen könyvtárakat használhat, írunk egy rövid példavázlatot, és megnézzük a gyakori hibákat.

Folyadékkristályos kijelző LCD 1602 jó választás karakterláncok kimenetére különféle projektekben. Olcsó, különféle módosítások vannak különböző háttérvilágítási színekkel, könnyen letölthet kész könyvtárakat az Arduino vázlatokhoz. De ennek a képernyőnek a fő hátránya, hogy a kijelző 16 digitális tűvel rendelkezik, amelyből minimum 6. Ezért ennek az LCD képernyőnek az i2c nélküli használata komoly korlátozásokat jelent az Arduino Uno vagy Nano kártyák számára. Ha nincs elég érintkező, akkor vásárolnia kell egy Arduino Mega kártyát, vagy mentenie kell a névjegyeket, beleértve a kijelző i2c-n keresztüli csatlakoztatását is.

Az LCD 1602 lábak rövid leírása

Nézzük meg közelebbről az LCD1602 érintkezőit:

Mindegyik csapnak megvan a maga célja:

  1. Földi GND;
  2. Tápellátás 5 V;
  3. A monitor kontrasztjának beállítása;
  4. Parancs, adat;
  5. Adatok írása és olvasása;
  6. Engedélyezze;

7-14. Adatvonalak;

  1. Plusz háttérvilágítás;
  2. Mínusz a háttérvilágítás.

Kijelző specifikációi:

  • Karakter megjelenítési típus, lehetőség van szimbólumok betöltésére;
  • LED lámpák;
  • Vezérlő HD44780;
  • Tápfeszültség 5V;
  • 16x2 karakteres formátum;
  • Üzemi hőmérséklet tartomány -20C és +70C között, tárolási hőmérséklet -30C és +80C között;
  • Betekintési szög 180 fok.

Az LCD csatlakozási rajza az Arduino kártyához i2C nélkül

A monitor I2C nélküli Arduino mikrokontrollerhez való közvetlen csatlakoztatásának szabványos diagramja a következő.

A csatlakoztatott érintkezők nagy száma miatt előfordulhat, hogy nincs elég hely a szükséges elemek csatlakoztatásához. Az I2C használatával a vezetékek száma 4-re, a foglalt érintkezők száma pedig 2-re csökken.

Hol vásárolhat LCD képernyőket és pajzsokat az Arduino számára

Az 1602-es LCD-kijelző (és a 2004-es verzió) meglehetősen népszerű, így a hazai webáruházakban és a külföldi oldalakon is könnyen megtalálható. Íme néhány link a leginkább elérhető lehetőségekhez:

LCD1602+I2C kék képernyős modul, Arduino kompatibilis Egy egyszerű LCD1602 kijelző (zöld háttérvilágítás) olcsóbb, mint 80 rubel Nagy LCD2004 képernyő I2C HD44780-zal Arduinohoz (kék és zöld háttérvilágítás)
1602-es kijelző IIC adapterrel és kék háttérvilágítással Az LCD1602 másik változata forrasztott I2C modullal IIC/I2C/TWI/SPI portos adaptermodul 1602-es pajzshoz, kompatibilis az Arduino-val
RGB háttérvilágítású kijelző! LCD 16×2 + billentyűzet + Buzzer Shield Arduino-hoz Pajzs Arduino-hoz gombokkal és képernyővel LCD1602 LCD 1602 LCD kijelző 3D nyomtatóhoz (Smart Controller for RAMPS 1.4, Text LCD 20×4), SD és MicroSD kártyaolvasó modul

Az I2C protokoll leírása

Mielőtt megvitatná a kijelző Arduino-hoz i2c adapteren keresztüli csatlakoztatását, beszéljünk röviden magáról az i2C protokollról.

I2C/IIC(Inter-Integrated Circuit) egy protokoll, amelyet eredetileg az integrált áramkörök elektronikus eszközön belüli kommunikálására hoztak létre. A fejlesztés a Philips tulajdona. Az i2c protokoll egy 8 bites busz használatán alapul, amely a vezérlőelektronikában lévő blokkok kommunikálásához szükséges, valamint egy címzési rendszeren, melynek köszönhetően ugyanazon a vezetékeken keresztül több eszközzel is kommunikálhatunk. Egyszerűen csak adatokat továbbítunk egyik vagy másik eszközre, az adatcsomagokhoz hozzáadva a kívánt elem azonosítóját.

A legegyszerűbb I2C áramkör tartalmazhat egy mestereszközt (leggyakrabban egy Arduino mikrokontroller) és több szolgát (például egy LCD-kijelzőt). Minden eszköznek van egy címe 7 és 127 között. Nem lehet két azonos című eszköz ugyanabban az áramkörben.

Az Arduino alaplap támogatja az i2c-t hardverben. Az A4 és A5 érintkezők segítségével csatlakoztathatja az eszközöket ezzel a protokollal.

Az I2C működésének számos előnye van:

  • A működéshez csak 2 vonal szükséges - SDA (adatvonal) és SCL (szinkronizálási vonal).
  • Számos vezető eszköz csatlakoztatása.
  • Csökkentett fejlesztési idő.
  • Csak egy mikrokontroller szükséges a teljes eszközkészlet vezérléséhez.
  • Az egy buszra csatlakoztatható mikroáramkörök számát csak a maximális kapacitás korlátozza.
  • Magas fokú adatbiztonság az áramkörökbe épített speciális túlfeszültség-szűrő szűrőnek köszönhetően.
  • Egyszerű eljárás a felmerülő hibák diagnosztizálására és a hibák gyors hibakeresésére.
  • A busz már magába az Arduinóba integrálva van, így nincs szükség további buszinterfész fejlesztésére.

Hibák:

  • Van egy kapacitív korlát a vonalon - 400 pF.
  • Nehéz programozni egy I2C vezérlőt, ha több különböző eszköz van a buszon.
  • Nagyszámú eszköz esetén megnehezíti a hiba elkülönítését, ha az egyik hibásan lemerül.

i2c modul LCD 1602 Arduino-hoz

Az i2c kijelző használatának leggyorsabb és legkényelmesebb módja az Arduino-ban, ha kész képernyőt vásárol beépített protokolltámogatással. De nincs túl sok ilyen képernyő, és nem is olcsók. De már rengeteg különböző szabványos képernyőt gyártottak. Ezért ma a legkedvezőbb és legnépszerűbb lehetőség egy külön I2C modul vásárlása és használata - egy adapter, amely így néz ki:

A modul egyik oldalán i2c érintkezőket látunk - föld, táp és 2 az adatátvitelhez. A másik adapteren külső tápcsatlakozókat látunk. És természetesen a táblán sok csap található, amelyekkel a modult a szabványos képernyőtüskékre forrasztják.


Az i2c kimenetek az Arduino kártyához való csatlakozásra szolgálnak. Szükség esetén külső tápellátást csatlakoztatunk a háttérvilágításhoz. A beépített trimmerrel egyéni kontrasztértékeket állíthatunk be J

A piacon találhatunk LCD 1602 modulokat már forrasztott adapterekkel, használatuk a lehető legegyszerűbb. Ha külön adaptert vásárolt, akkor azt először a modulhoz kell forrasztania.

Az LCD-képernyő csatlakoztatása az Arduino-hoz I2C-n keresztül

A csatlakoztatáshoz magára az Arduino kártyára, egy kijelzőre, egy kenyérsütőtáblára, csatlakozó vezetékekre és egy potenciométerre van szükség.

Ha speciális különálló i2c adaptert használ, először forrasztania kell a képernyőmodulhoz. Ott nehéz hibázni, követheti ezt a sémát.


Az i2c támogatással rendelkező LCD monitor négy vezetékkel csatlakozik az alaplaphoz - két vezeték az adatokhoz, két vezeték az áramellátáshoz.

  • A GND tű csatlakozik a GND-hez az alaplapon.
  • A VCC tűje 5V-on van.
  • Az SCL az A5 érintkezőhöz csatlakozik.
  • Az SDA az A érintkezőhöz csatlakozik.

És ez minden! Nincsenek dróthálók, amelyekbe nagyon könnyű belegabalyodni. Ugyanakkor egyszerűen a könyvtárakra bízhatjuk az i2C protokoll megvalósításának minden bonyolultságát.

Könyvtárak az i2c LCD kijelzővel való munkavégzéshez

Az Arduino és az LCD 1602 I2C buszon keresztüli interakciójához legalább két könyvtárra lesz szüksége:

  • Az I2C-vel való munkavégzéshez használható Wire.h könyvtár már benne van a szabványos Arduino IDE programban.
  • A LiquidCrystal_I2C.h könyvtár, amely sokféle parancsot tartalmaz a monitor I2C buszon keresztüli vezérléséhez, és lehetővé teszi a vázlat egyszerűbbé és rövidebbé tételét. Ezenkívül telepítenie kell a könyvtárat A kijelző csatlakoztatása után telepítenie kell a LiquidCrystal_I2C.h könyvtárat is.

Miután az összes szükséges könyvtárat a vázlathoz csatlakoztattuk, létrehozunk egy objektumot, és használhatjuk annak összes funkcióját. A teszteléshez töltsük be a következő szabványos példavázlatot.

#beleértve #beleértve // A könyvtárat is beleértve //#include // Alternatív könyvtár csatlakoztatása LiquidCrystal_I2C lcd(0x27,16,2); // Adja meg az I2C címet (a leggyakoribb érték), valamint a képernyő paramétereit (LCD 1602 esetén - 2 sor, egyenként 16 karakter //LiquidCrystal_PCF8574 lcd(0x27); // Opció a PCF8574 könyvtárhoz void setup( ) ( lcd.init (); // A kijelző inicializálása lcd.backlight(); // A háttérvilágítás csatlakoztatása lcd.setCursor(0,0); // A kurzor beállítása az első sor elejére lcd.print(" Hello"); // Szöveg beírása az első sorba lcd.setCursor(0,1); // Állítsa a kurzort a második sor elejére lcd.print("ArduinoMaster"); // Szöveg beírása a második sorba ) void loop() ( )

A LiquidCrystal_I2C könyvtár funkcióinak és módszereinek leírása:

  • home() és clear() - az első funkció lehetővé teszi a kurzor visszaállítását a képernyő elejére, a második ugyanezt teszi, ugyanakkor töröl mindent, ami korábban a monitoron volt.
  • write(ch) – lehetővé teszi egyetlen ch karakter kinyomtatását a képernyőre.
  • cursor() és noCursor() – megjeleníti/elrejti a kurzort a képernyőn.
  • blink() és noBlink() – a kurzor villog/nem villog (ha a megjelenítése korábban engedélyezve volt).
  • display() és noDisplay() – lehetővé teszi a kijelző csatlakoztatását/letiltását.
  • scrollDisplayLeft() és scrollDisplayRight() – görgeti a képernyőt egy karakterrel balra/jobbra.
  • autoscroll() és noAutoscroll() – lehetővé teszi az automatikus görgetés mód engedélyezését/letiltását. Ebben a módban minden új karakter ugyanarra a helyre kerül, és kiszorítja a képernyőre korábban írottakat.
  • leftToRight() és rightTo Left() – A megjelenített szöveg irányának beállítása – balról jobbra vagy jobbról balra.
  • createChar(ch, bitmap) – létrehoz egy karaktert ch kóddal (0–7), bittérképes bittérképek tömbjét használva fekete-fehér pontok létrehozásához.

Alternatív könyvtár az i2c kijelzővel való munkavégzéshez

Bizonyos esetekben hibák léphetnek fel, amikor a megadott könyvtárat PCF8574 vezérlőkkel felszerelt eszközökkel használja. Ebben az esetben a LiquidCrystal_PCF8574.h könyvtár javasolható alternatívaként. Kibővíti a LiquidCrystal_I2C-t, így nem lehet probléma a használatával.

Problémák az i2c lcd kijelző csatlakoztatásakor

Ha a vázlat feltöltése után nem lát semmilyen üzenetet a kijelzőn, próbálkozzon a következő lépésekkel.

Először is növelheti vagy csökkentheti a monitor kontrasztját. A karakterek gyakran egyszerűen nem láthatók a kontraszt és a háttérvilágítási mód miatt.

Ha ez nem segít, ellenőrizze, hogy az érintkezők megfelelően vannak-e csatlakoztatva, és hogy a háttérvilágítás csatlakoztatva van-e. Ha külön i2c adaptert használt, akkor ellenőrizze újra az érintkezők forrasztásának minőségét.

A képernyőről hiányzó szöveg másik gyakori oka lehet a helytelen i2c-cím. Először próbálja meg megváltoztatni az eszköz címét a vázlatban 0x27 0x20-ról 0x3F-re. A különböző gyártók eltérő alapértelmezett címeket programozhatnak be. Ha ez nem segít, akkor futtathatja az i2c szkenner vázlatot, amely minden csatlakoztatott eszközt átvizsgál, és nyers erővel meghatározza a címüket. Példa egy i2c szkenner vázlatára.

Ha a képernyő továbbra sem működik, próbálja meg kiforrasztani az adaptert, és a szokásos módon csatlakoztassa az LCD-t.

Következtetés

Ebben a cikkben megvizsgáltuk az LCD-képernyő használatának főbb kérdéseit összetett Arduino-projektekben, amikor szabad tűket kell mentenünk a táblán. Egy egyszerű és olcsó i2c adapter lehetővé teszi egy 1602-es LCD képernyő csatlakoztatását, amely mindössze 2 analóg érintkezőt foglal el. Ez sok esetben nagyon fontos lehet. Az ár a kényelem kedvéért egy további modul - konverter és könyvtár - használatának szükségessége. Véleményünk szerint ez nem túl magas ár a kényelemért, ezért erősen javasoljuk ennek a funkciónak a használatát projektekben.