LSD képernyő csatlakozás. Képzés

Minden rádióamatőr bizonyos számú egyszerű házi projekt után eljut arra a célra, hogy érzékelők és gombok segítségével valami grandiózusat alkosson. Hiszen sokkal érdekesebb a kijelzőn megjeleníteni az adatokat, nem pedig a portmonitoron. De akkor felmerül a kérdés: melyik kijelzőt válasszam? És általában, hogyan kell csatlakoztatni, mi kell a csatlakoztatáshoz? Az ezekre a kérdésekre adott válaszokat ebben a cikkben tárgyaljuk.

LCD 1602

A sok megjelenítési lehetőség közül külön kiemelném a HD4478 vezérlőre épülő LCD1602 kijelzőt. Ez a kijelző két színben érhető el: fehér betűk kék alapon, fekete betűk sárga alapon. Az LCD 1602 csatlakoztatása az Arduino-hoz szintén nem okoz problémát, mivel van beépített könyvtár, és nincs szükség további letöltésre. A kijelzők nemcsak árban, hanem méretben is különböznek egymástól. A rádióamatőrök gyakran 16 x 2-t, azaz 2 16 karakterből álló sort használnak. De van 20 x 4 is, ahol 4 sor van 20 karakterből. A méretek és a színek nem játszanak szerepet az lcd 1602 kijelző és az Arduno csatlakoztatásában, ugyanúgy vannak csatlakoztatva. A betekintési szög 35 fok, a kijelző válaszideje 250 ms. -20 és 70 Celsius fok közötti hőmérsékleten tud működni. Működés közben 4 mA-t használ a képernyőhöz és 120 mA-t a háttérvilágításhoz.

Hol használják?

Ez a kijelző nemcsak a rádióamatőrök, hanem a nagy gyártók körében is népszerű. Például a nyomtatók és a kávéfőzők is használnak LCD1602-t. Ennek oka az alacsony ár, ez a kijelző 200-300 rubelbe kerül a kínai oldalakon. Érdemes ott vásárolni, hiszen üzleteinkben nagyon magasak a felárak erre a kijelzőre.

Csatlakozás Arduinohoz

Az LCD 1602 csatlakoztatása Arduino Nano-hoz és Uno-hoz nem különbözik. A kijelzővel kétféle módban dolgozhatunk: 4 bites és 8 bites. A 8 bitessel való munkavégzés során az alacsony és a magasabb rendű biteket is használjuk, a 4 bitesnél pedig csak az alacsony rendűeket. Nincs különösebb értelme a 8 bitessel dolgozni, mivel ez további 4 érintkezőt ad hozzá a csatlakozáshoz, ami nem célszerű, mert a sebesség nem lesz nagyobb, a képernyőfrissítések határa másodpercenként 10-szer. Általánosságban elmondható, hogy az lcd 1602 és az Arduino csatlakoztatásához sok vezetéket használnak, ami némi kellemetlenséget okoz, de vannak speciális pajzsok, de erről majd később. A képen látható a kijelző csatlakoztatása az Arduino Uno-hoz:

Minta kód:

#beleértve // A szükséges LiquidCrystal könyvtár hozzáadása lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup())( lcd.begin(16, 2); // A képernyő méretének beállítása lcd.setCursor(0, 0); // A kurzor beállítása az 1 sor elejére lcd.print("Hello, world!"); // Írja ki az lcd.setCursor(0, 1) szöveget; // Állítsa a kurzort a 2. sor elejére lcd.print("site") ; // A szöveg kiadása ) void loop ()( )

Mit csinál a kód? Az első lépés a könyvtár csatlakoztatása a kijelzővel való munkavégzéshez. Amint fentebb említettük, ez a könyvtár már benne van az Arduino IDE-ben, és nem kell külön letölteni és telepíteni. Ezután meghatározzák a érintkezőket, amelyek a érintkezőkhöz csatlakoznak: RS, E, DB4, DB5, DB6, DB7. Ezután a képernyő mérete be van állítva. Mivel 16 karakteres és 2 soros verzióval dolgozunk, a következő értékeket írjuk. Helyezzük a kurzort az első sor elejére, és megjelenítjük az első szövegünket: Hello World. Ezután helyezze a kurzort a második sorba, és jelenítse meg a webhely nevét. Ez minden! Az lcd 1602 Arduino Uno-hoz való csatlakoztatását fontolgatták.

Mi az I2C és miért van rá szükség?

Mint fentebb említettük, a kijelző csatlakoztatása sok érintkezést igényel. Például, ha több érzékelővel és LCD-kijelzővel dolgozik, előfordulhat, hogy az 1602 tű egyszerűen nem elég. A rádióamatőrök gyakran az Uno vagy a Nano verziót használják, amelyeknek nincs sok kapcsolatuk. Aztán az emberek különleges pajzsokat találtak ki. Például I2C. Lehetővé teszi a mindössze 4 tűs kijelző csatlakoztatását. Ez kétszer annyi. Az I2C modul külön is kapható, ahol saját kezűleg kell forrasztani, és már az LCD 1602 kijelzőhöz is forrasztva.

Csatlakozás I2C modullal

Az LCD 1602 csatlakoztatása Arduino Nano-hoz I2C-vel kevés helyet foglal el, mindössze 4 érintkező: test, táp és 2 adatkimenet. Az Arduino tápellátását és földelését 5 V-ra, illetve GND-re csatlakoztatjuk. A maradék két érintkezőt: SCL-t és SDA-t bármilyen analóg érintkezőhöz csatlakoztatjuk. A képen láthat egy példát egy lcd 1602 csatlakoztatására egy I2C modullal rendelkező arduinohoz:

Program kód

Ha egy modul nélküli kijelzővel csak egy könyvtárat kellett használni, akkor egy modullal való munkához két könyvtárra van szükség. Az egyik már benne van az Arduino IDE - Wire-ben. Egy másik könyvtárat, a LiquidCrystal I2C-t külön kell letölteni és telepíteni. A könyvtár Arduino-ban való telepítéséhez a letöltött archívum tartalmát be kell tölteni a gyökérkönyvtárak mappába. Példa programkódra I2C használatával:

#beleértve #beleértve LiquidCrystal_I2C lcd(0x27,16,2); // A kijelző beállítása void setup() ( lcd.init(); lcd.backlight(); // A kijelző háttérvilágításának bekapcsolása lcd..setCursor(8, 1); lcd.print("LCD 1602"); ) void loop( ) ( // Állítsa a kurzort a második sorra és a nulla karakterre. lcd.setCursor(0, 1); // Az Arduino elindítása óta eltelt másodpercek számának megjelenítése lcd.print(millis()/1000); )

Amint látja, a kód majdnem ugyanaz.

Hogyan adhatunk hozzá saját szimbólumot?

Ezekkel a kijelzőkkel az a probléma, hogy nem támogatja a cirill ábécét és a szimbólumokat. Például be kell töltenie valamilyen szimbólumot a kijelzőre, hogy az tükrözze azt. Ehhez a kijelző lehetővé teszi akár 7 saját szimbólum létrehozását. Képzeld el a táblázatot:

0 0 0 1 0
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 0 0 0

Ha 0 - nincs ott semmi, ha 1 - ez egy festett terület. A fenti példában láthatja a "mosolygó mosolygó" szimbólum létrehozását. Egy példaprogramot használva az Arduino-ban így néz ki:

#beleértve #beleértve // Adja hozzá a szükséges könyvtárat // A mosolyszimbólum bitmaszkja byte smile = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup())( lcd.begin(16, 2); // Képernyőméret beállítása lcd.createChar(1, smile); // Karakterszám létrehozása 1 lcd.setCursor(0, 0); // Állítsa a kurzort az 1. sor elejére lcd.print("\1"); // Egy mosolygó arc megjelenítése (1-es karakter) - "\1" ) void ciklus ())( )

Mint látható, a bitmaszk ugyanúgy jött létre, mint a táblázat. Létrehozása után változóként megjeleníthető a kijelzőn. Ne feledje, hogy csak 7 karaktert tárolhat a memóriában. Elvileg ennyi is elég. Például, ha meg kell jelenítenie egy fok szimbólumot.

Problémák, amelyeknél a kijelző esetleg nem működik

Vannak esetek, amikor a kijelző nem működik. Például bekapcsol, de nem jelenít meg karaktereket. Vagy egyáltalán nem kapcsol be. Először ellenőrizze, hogy megfelelően csatlakoztatta-e a tűket. Ha LCD 1202-es csatlakozást használt az Arduino-hoz I2C nélkül, nagyon könnyen belegabalyodhat a vezetékekbe, ami a kijelző hibás működését okozhatja. Arra is ügyeljen, hogy a kijelző kontrasztja megnőjön, hiszen a minimális kontraszt mellett még az sem látszik, hogy az LCD 1602 be van-e kapcsolva vagy sem. Ha ez nem segít, akkor a probléma az érintkezők forrasztásában lehet, ez I2C modul használatakor. Egy másik gyakori ok, amiért a kijelző nem működik, az I2C-cím helytelen beállítása. Az a tény, hogy sok gyártó létezik, és más címet is megadhatnak, itt kell javítania:

LiquidCrystal_I2C lcd(0x27,16,2);

Zárójelben két érték látható, a 0x27 és a 16.2 (a 16.2 a kijelző mérete, a 0x27 pedig az I2C cím). Ezen értékek helyett megpróbálhatja beállítani a 0x37 vagy a 0x3F értéket. Nos, egy másik ok egyszerűen egy hibás LCD 1602. Tekintettel arra, hogy az Arduinohoz szinte minden Kínában készül, nem lehet 100%-ig biztos abban, hogy a megvásárolt termék nem hibás.

Az LCD 1602 előnyei és hátrányai

Nézzük az LCD 1602 kijelző előnyeit és hátrányait.

  • Ár. Ez a modul nagyon kedvező áron megvásárolható a kínai üzletekben. Az ár 200-300 rubel. Néha még egy I2C modullal együtt is eladják.
  • Könnyen csatlakoztatható. Valószínűleg manapság senki sem csatlakoztatja az LCD 1602-t I2C nélkül. És ezzel a modullal a csatlakozás csak 4 érintkezőt vesz igénybe, nem lesz vezetékek „hálója”.
  • Programozás. A kész könyvtáraknak köszönhetően ezzel a modullal könnyű dolgozni, minden funkció már meg van írva. És ha saját szimbólumot kell hozzáadnia, az csak néhány percet vesz igénybe.
  • A rádióamatőrök ezrei általi használata során komolyabb hátrányokat nem azonosítottak, csak hibás vásárlások fordulnak elő, mivel a kijelzők elsősorban kínai verzióit használják.

Ez a cikk az 1602 és az Arduino összekapcsolását vizsgálta, és példákat mutatott be az ezzel a kijelzővel való munkavégzéshez szükséges programokra. Kategóriájában valóban az egyik legjobb, nem véletlenül választja rádióamatőrök ezrei projektjeikhez!

A HD44780 vezérlőre épülő, 1602 méretű LCD kijelzők az egyik legegyszerűbb, legolcsóbb és legnépszerűbb kijelzők különféle elektronikai eszközök fejlesztéséhez. Megtalálható mind a térdre szerelt eszközökben, mind az ipari eszközökben, mint például a kávéfőzők. A legnépszerűbb Arduino témájú modulok és pajzsok, mint például a és ezen a kijelzőn vannak összegyűjtve.

Ebben a cikkben elmondjuk, hogyan csatlakoztassa az Arduino-hoz és jelenítse meg az információkat.

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

. Vezérlőtábla

. Csatlakozó vezetékek

Ezeknek a kijelzőknek két kialakítása van: sárga háttérvilágítás fekete betűkkel, vagy ami gyakoribb, kék háttérvilágítás fehér betűkkel.

A HD44780 vezérlő kijelzőinek mérete eltérő lehet, de a vezérlés ugyanaz lesz. A leggyakoribb méretek a 16x02 (azaz 16 karakter két sorban) vagy a 20x04. Maguk a szimbólumok felbontása 5x8 pixel.

A legtöbb kijelző nem támogatja a cirill ábécét, csak a CTK jelzésű kijelzők rendelkeznek ezzel. De megpróbálhatjuk részben megoldani ezt a problémát (folytatás a cikkben).

Kijelző kimenetek:

A kijelző 16 tűs csatlakozóval rendelkezik a csatlakoztatáshoz. A csapok a tábla hátoldalán vannak jelölve.

1 (VSS) - Vezérlő tápegység (-)
2 (VDD) - Vezérlő tápegység (+)
3 (VO) - Kontraszt szabályozó tű
4 (RS) - Kiválasztás regisztrálása
5 (R/W) - Olvasás/írás (írási mód, ha földelve van)
6 (E) – Engedélyezés (villogás csökkenéskor)
7-10 (DB0-DB3) – A 8 bites interfész alacsony rendű bitjei
11-14 (DB4-DB7) – Az interfész magasabb rendű bitjei
15 (A) - Anódos (+) háttérvilágítású tápegység
16 (K) - Katód (-) háttérvilágítású tápegység

Önteszt mód:

Mielőtt megpróbálná csatlakoztatni és megjeleníteni az információkat, jó ötlet lenne megtudni, hogy a kijelző működik-e vagy sem. Ehhez magának a vezérlőnek feszültséget kell adnia ( VSS és VDD), kapcsolja be a háttérvilágítást ( A és K), és állítsa be a kontrasztot is.

A kontraszt beállításához használjon 10 kOhm-os potenciométert. Nem mindegy, milyen alakú lesz. +5V és GND a külső lábakra van ellátva, a központi láb a kimenetre van kötve V.O.

Az áramkör tápellátása után el kell érni a megfelelő kontrasztot; ha nincs megfelelően beállítva, akkor semmi sem jelenik meg a képernyőn. A kontraszt beállításához játsszon a potenciométerrel.

Ha az áramkör megfelelően van összeállítva, és a kontraszt megfelelően van beállítva, a felső sort a képernyőn téglalapokkal kell kitölteni.

Információ kimenet:

A kijelző működtetésére az Arduino IDE-be épített LiquidCrystal.h könyvtár szolgál.

Könyvtári funkciók

//Munka a kurzorral lcd.setCursor(0, 0); // A kurzor beállítása (cellaszám, sor) lcd.home(); // Állítsa a kurzort nullára (0, 0) lcd.cursor(); // A kurzor láthatóságának engedélyezése (aláhúzás) lcd.noCursor(); // A kurzor láthatóságának eltávolítása (aláhúzás) lcd.blink(); // A kurzor villogásának engedélyezése (kurzor 5x8) lcd.noBlink(); // A kurzor villogásának kikapcsolása (kurzor 5x8) //Információs kimenet lcd.print("webhely"); // Információ kimenet lcd.clear(); // A kijelző törlése, (minden adat törlése) állítsa a kurzort nullára lcd.rightToBal(); // A felvétel jobbról balra történik lcd.leftToRight(); // Az írás balról jobbra történik lcd.scrollDisplayRight(); // Mindent eltolja a kijelzőn egy karakterrel jobbra lcd.scrollDisplayLeft(); // Mindent eltolja a kijelzőn egy karakterrel balra //Kémek számára hasznos információk :) lcd.noDisplay(); // A kijelzőn megjelenő információ láthatatlanná válik, az adatok nem törlődnek // ha abban a pillanatban, amikor ez a funkció aktív, semmi sem jelenik meg, akkor LCD kijelzö(); // A display() függvény meghívásakor minden információ, ami volt

Maga a kijelző két üzemmódban működhet:

8 bites mód - ehhez mind az alacsony, mind a magas bitek használhatók (BB0-DB7)

4 bites mód - ehhez csak a legkisebb jelentőségű bitek kerülnek felhasználásra (BB4-DB7)

A 8 bites mód használata ezen a kijelzőn nem tanácsos. Működéséhez még 4 láb kell, és gyakorlatilag nincs sebességnövekedés, mert Ennek a kijelzőnek a frissítési gyakorisága korlátozott< 10раз в секунду.

Szöveg kiadásához csatlakoztatnia kell az RS, E, DB4, DB5, DB6, DB7 érintkezőket a vezérlő érintkezőihez. Bármilyen Arduino tűhöz csatlakoztathatók, a lényeg az, hogy a kódban a megfelelő sorrendet állítsuk be.

Minta kód:

#beleértve LiquidCrystal lcd(7, 6, 5, 4, 3, 2); üres beállít()(lcd.begin(16, 2); // Állítsa be a képernyő méretét lcd.setCursor(0, 0); 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ó (összesen legfeljebb 7 szimbólum). 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.

Minta kód

//Arduino IDE 1.0.5-ön tesztelve#beleértve #beleértve // Adja hozzá a szükséges könyvtárat // A mosoly szimbólum bitmaszkja bájt mosoly = ( B00010, B00001, B11001, B00001, B11001, B00001, B00010, ); LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)üres beállít()(lcd.begin(16, 2); // Állítsa be a képernyő méretét lcd.createChar(1, mosoly); // 1. számú szimbólum létrehozása 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 (){ }

Bónusz

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

  • igorka

      karaktergenerátor, mint fent,
      Megcsináltam, mert nem voltam gyenge)

Ezúttal azt szeretném elmondani, hogyan kell a Nokia 1202-es mobiltelefon kijelzőjét az Atmega8 mikrokontrollerhez csatlakoztatni. CodeVision környezetben programozunk. Itt-ott tévedhetek. Nem sokkal később rájöttem, hogy mi is az. Nincs tapasztalatom a programozásban, és nem a kijelzővel való munkához írtam a könyvtárat. Egy internetes projektből másolták le őket. Az összes szükséges függvény oda van írva, és van egy 5 * 8-as betűtípus latin betűkkel és cirill betűkkel. Van még pár 12*16 és 24*32 karakter, amit a könyvtárak szerzője használt a készülékében. Ha eltávolítja őket, akkor egy 5*8-as font körülbelül 700 bájt mikrokontroller flash-t foglal el. Ezért a projekt mikrokontrollerét „zsírosabbra” kell venni, az én esetemben én használtam Atmega8. Épp elég. Minden fájl - források, könyvtár stb., .

Kijelző csatlakozási rajza

Az LCD kijelző és az MK csatlakoztatásának sematikus rajza

Bekötési rajzot készítettem. A kijelző tápellátásához 3,3 V feszültség szükséges. Ha 5 V-ról táplálja a mikrovezérlőt, akkor szereljen fel ellenállásosztókat és egy mikroáramkört 78L33. Ha a teljes áramkör 3,3 V-ról táplálkozik, nincs szükség ellenállásosztókra. Úgy tűnik, hogy az Atmega8A 3,3 V-ról tud működni, feltéve, hogy a frekvencia nem haladja meg a 8 MHz-et. Én személy szerint nem próbáltam. Mindent egy 5V-os hibakereső kártyára szereltem össze. Semmi esetre sem szabad nagy kapacitású elektrolitot maga a kijelző elé tenni. A működés kezdetén a vezérlő inicializálási parancsokat küld a kijelzőnek. A kondenzátor feltöltése időbe telik. Amíg a készülék töltődik, és a kijelző elkezd működni, eltelik egy kis idő, és nem kap inicializálási parancsot. Természetesen ezek ezredmásodpercek, de ebben az esetben a hatás észrevehető.


Megjeleníti a kiosztási diagramot

A Nokia 1202 kijelzője 9 bites SPI interfésszel rendelkezik. Az általunk választott mikrokontroller nem rendelkezik ezzel a luxussal. Ezért a kijelzővel való kommunikációhoz nem hardvert használunk, hanem szoftveres SPI-t, úgymond „no-brainer”-et. Nem mondom meg, hogyan kell új projekteket létrehozni a CodeVision-ban - gondolja meg maga. Csak azt mondom, hogy Az összes PORTB érintkezőt kimenetként kell konfigurálni. A projektbeállításoknál jelölje be a " Tárolja a globális állandókat a FLASH memóriában" Erre a műveletre azért van szükség, hogy a betűkészletek és a képeink flash-ben kerüljenek tárolásra.


Tehát létrehoztuk a projektet. Kiválasztottunk egy mikrokontrollert, beállítottuk az órajel frekvenciáját és konfiguráltuk a projektet. Mi a következő lépés? Ezután könyvtárakat kell hozzáadnia a kijelzővel való munkához és késleltetési könyvtárakat. Csomagolja ki az archívumot. Két fájl van ott. Ezeket meghatározott mappákba kell másolni. Remélem, a CodeVision programot közvetlenül a C:\ meghajtóra telepítette. Ha igen, akkor másolja a fájlokat a megfelelő elérési útra:

C:\cvavreval\inc az 1100.inc fájlhoz, és
C:\cvavreval\lib a 1100.h fájlhoz.


Azt is szeretném elmondani, hogy a mikrokontroller lábainak hozzárendelése módosítható a fájlban 1100.h. Ekkor a csatlakozási rajz megváltozik. Kezdjük a kódolást. Csak egy kis felirat jelenjen meg a kijelzőn 5*8 fő betűtípussal. A legelején könyvtárakat adunk hozzá.

#beleértve< 1100.h>// könyvtár megjelenítése
#beleértve // késleltetési könyvtár

Legalul, a main while(1)() ciklus előtt inicializáljuk és töröljük a kijelzőt.

lcd_init(); // inicializálás megjelenítése
lcd_clear(); // a kijelző törlése

Feliratunkat is elhelyezzük a főciklus előtt. Hagyja, hogy a vezérlő először megjelenítse az üzenetet a kijelzőn, majd forogjon a fő hurokban. Ezt írjuk:

print_string("Kiírja a feliratot",5,0);
print_string("Amit akarunk",0,1);
print_string("BUCKER",10,2);

Szerintem itt minden világos. Az első számjegy az x-koordináta a kijelzőn. 0 és 96 közötti értéket vehet fel. A második egy karakterlánc. 0-tól 7-ig van. Elvileg 8 és fél sor fér oda, de fél sort nem fogunk olvasni. Összeállítjuk és flasheljük. Nézzük az eredményt. Telepítheti a Proteust és tesztelheti is. A vezérlő beállítható úgy, hogy belső generátorról működjön a projektben meghatározott frekvencián, 64 ms-os indítási késleltetéssel. Az összeállított projekttel egy archívumot adok hozzá. Frekvencia 8 MHz.


De ahogy már az elején írtam, más szimbólumok is vannak a könyvtárban. Igaz, betűk nincsenek, csak számok. Most bonyolítsuk egy kicsit a feladatot. A felirat ne legyen inert, hanem változzon. Tegyük fel, hogy 0-tól 9-ig számol 1 másodperces időközönként. Amikor eléri a 9-et, visszaáll nullára, és újraindul. Vegyünk nagy, 24*32 méretű számokat. Nos, kezdjük. Vegyük az előző projektet és töröljük a három "print_string" sort. A könyvtárak hozzáadása után azonnal deklaráljunk egy bizonyos globális változót m.

szén m = 0;

Egyszerűen leírhatod:

Ebben az esetben automatikusan a 0 értéket kapja. A fő hurokba ezt írjuk:

char_24_32(m,35,2); //szimbólum kimeneti funkció 24*32
delay_ms(1000); // várjon 1 másodpercet
m++; // adjunk hozzá 1-et az m változóhoz
ha(m>9)m=0; // Feltétel. Ha az m változó nagyobb, mint 9, akkor m egyenlő 0-val.

Készítettem egy rövid videót a program működéséről

Megpróbálom elmondani, hogyan kell képeket rajzolni és megjeleníteni a képernyőn. Hogyan hozhat létre tömböket és függvényeket a kimenetükhöz, és hogyan invertálhat egy képet. A könyvtárakat a cxem.net oldalról kölcsönözték. Anyag elkészítve Részeges.

Beszélje meg a KIJELZŐ CSATLAKOZTATÁSA MIKROVEZÉRLŐHEZ című cikket

Mi az, ami sok elektronikai eszköz szerves részét képezi? Természetesen az adatok jelzésének és grafikus kimenetének eszközei. Mindig kényelmesebb és kellemesebb a felhasználó számára, ha az „okosdoboz” eredménye vizuálisan is látható. Ezért ma egy kijelzőt fogunk csatlakoztatni az STM32-höz a szöveg és a számok megjelenítéséhez. Kísérleteink hőse a Winstar egy meglehetősen népszerű bemutatója lesz. A kommentekben egyébként egy fontos pontosítás jelent meg, miszerint a módszertan alapvetően minden megjelenítésnél azonos HD44780. Köszönjük JekaKeynek a fontos kiegészítést)

Először a kijelzőt a vezérlőhöz kell csatlakoztatni. Töltse le az adatlapot, és keresse meg a WH1602 kivezetést. Nézz ide:

Amint tudod, kijelző WH1602 16 tűje van. Nézzük mindegyiket külön...

A Vss, Vdd és K érintkezőket a földre és a tápfeszültségre kell csatlakoztatni, vagyis pontosan úgy, ahogy a táblázatban látható, nincs meglepetés, és még nincs mit megvitatni)

A 3-as tű a kontraszt beállítására szolgál - ha oda +5V-ot adunk, akkor nem látunk semmit, ha pedig rövidre zárjuk a csapot a földbe, két sor fekete négyzetben gyönyörködünk 😉 Ez természetesen nem illik hozzánk , ezért oda kell akasztanunk egy változó ellenállású potenciométert (ellenállást) a kontraszt beállításához. A karakterek legjobb láthatóságát a 0,5-0,7 V-os feszültség ezen a kijelzőtűn biztosítja.

Az RS pin már egy tű, amelyet mi magunk fogunk vezérelni egy mikrokontroller segítségével. Az alacsony feszültségszint (0) ezen a tűn azt jelenti, hogy most parancs következik, a magas szint (1) azt jelenti, hogy most már adatokat kell írni a kijelző memóriájába.

Pin R/W - itt egyértelmű, vagy kiolvassuk az adatokat (például a foglalt jelző megjelenítése), ebben az esetben ezen a tűn 1 van, vagy kiírjuk a parancsot/adatokat a kijelzőre, akkor itt 0 van.

DB7 – DB0 – adatbusz, és ez mindent elmond)

Az E tű az úgynevezett engedélyezési jel. Erre van szükség. A kijelzővel való munkához - adatok rögzítéséhez vagy parancs kiadásához - pozitív impulzust kell kiadnunk erre a tűre. Vagyis az eljárás így fog kinézni:

  1. Az RS, R/W, DB7 - DB0 lábakon - a parancsunknak megfelelő szükséges jelek.
  2. Egyet biztosítunk az E tűhöz.
  3. Zhdems (az adatlap szerint - legalább 150 ns)
  4. Az E tűre alacsony szintet (0) alkalmazunk.

A kijelző háttérvilágításának működtetéséhez 4,2 V feszültséget kell helyeznie az A/Vee lábra.

Így történik a kommunikáció a WH1602 kijelzővel.

Kitaláltuk a WH1602 csatlakoztatását, de mielőtt továbblépnénk a példára, nézzük meg, hogy általában milyen parancsokat ért a kijelzőnk. Ehhez bemegyünk az adatlapba, és találunk egy érdekes táblázatot:

Itt található az összes parancs és jel, amelynek a WH1602 megfelelő érintkezőin kell lennie az egyes parancsokhoz. Például törölni akarjuk a kijelzőt, ránézünk a táblázatra, és itt van a parancs, amire szükségünk van! Tiszta kijelző!

Nullákat alkalmazunk az RS, R/W, DB7, DB6, DB5, DB4, DB3, DB2, DB1 lábakra, egyet pedig a DB0 érintkezőre. Kész, mi a következő lépés? Így van, egy az E tűn, majd várjon egy kicsit, és ismét csökkentse az E-t nullára. Ennyi, a kijelző törlődik 😉 Közvetlenül a következő parancs végrehajtása előtt szünetet kell tartani, minden parancs adatlapján jelezve. Hatékonyabb lenne a foglalt jelző lekérdezése; amint visszaáll 0-ra, folytathatja a munkát. Ennek a zászlónak az olvasására van egy speciális parancs is, így ezzel minden világos) Menjünk tovább...

És tulajdonképpen minden az elmélettel van, már lehet próbálni írni valamit. A kijelzővel való munka megkönnyítése érdekében készítettem egy kis könyvtárat, most nézzük meg, hogyan használható. Először is töltse le

2 fájl áll rendelkezésünkre, az MT_WH1602.c és az MT_WH1602.h. A másodikat letépjük, itt kell kiválasztani a tűket és a használt vezérlőt.

Egyébként a kijelzőm így van csatlakoztatva:

RS-PC2
R/W – PB10
E–PB14
DB7–PD2
DB6–PC12
DB5–PA8
DB4–PA10
DB3–PA15
DB2–PD11
DB1–PA3
DB0–PA5

Nyissa meg az MT_WH1602.h fájlt:

#define PLATFORM (STM32F10x)

Ezután válassza ki a mikrokontroller érintkezőit, amelyekhez a kijelző csatlakozik. Először csak állítsuk be, hogy mely portokat használjuk. Csatlakozáskor GPIOA-t, GPIOB-t, GPIOC-t és GPIOD-ot használok, ezt írjuk:

Hasonlóan más mikrokontroller lábakhoz.

A beállítással készen vagyunk, folytassuk) A cikk elején megadott parancsok meghívásához az MT_WH1602.c fájl a következő függvényeket tartalmazza (a parancsok nevéből kaptuk a nevét, így szerintem minden világos) :

void MT_WH1602_ClearDisplay(void ) ; void MT_WH1602_ReturnHome(void ) ; void MT_WH1602_EntryModeSet (bool ID-cím, bool shift) ; void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ; void MT_WH1602_CursorOrDisplayShift (bool SCbit, bool RLbit) ; void MT_WH1602_FunctionSet (bool DLbit, bool Nbit, bool Fbit) ; void MT_WH1602_SetCGRAMaddress (uint8_t cím) ; void MT_WH1602_SetDDRAMAddress (uint8_t cím) ; bool MT_WH1602_ReadBusy(void ) ; void MT_WH1602_WriteData(uint8_t data) ;

Egyes parancsoknál paramétereket kell átadnunk a függvénynek, például:

void MT_WH1602_DisplayOnOff (bool Dbit, bool Cbit, bool Bbit) ;

Nézzük a parancstáblázatot:

Látjuk, hogy a Display ON/OFF parancs nem csak a kijelzőt kapcsolja be/ki, hanem a kurzort és a kurzor villogását is aktiválja/deaktiválja. Az adatlapon ezeket a parancsbiteket D-nek, C-nek és B-nek jelöljük, és ezeket paraméterként adjuk át a függvénynek. Ha be kell kapcsolnunk a kijelzőt és a kurzort, de le kell tiltanunk a kurzor villogását, akkor a következőképpen hívjuk meg a parancsot:

MT_WH1602_DisplayOnOff(1, 1, 0);

Általában minden egyszerű 😉

Röviden: létrehozunk egy új projektet, hozzáadunk egy könyvtárat a WH1602 kijelzővel való munkavégzéshez, létrehozunk egy üres .c fájlt, és elkezdjük kitölteni kóddal:

// Tartalmazza a könyvtárfájlt#include "MT_WH1602.h" /*******************************************************************/ int main(void) ( // Hívja meg az inicializálási függvényt, nem tudjuk nélküle =)() ; // Most el kell végeznünk a kezdeti megjelenítési konfigurációt // A dokumentáció és az internet ezt javasolja ;) MT_WH1602_FunctionSet(1; 0; 0); MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1; 0; 0); MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1; 0; 0); MT_WH1602_Delay(1000 ) ; MT_WH1602_FunctionSet(1, 1, 1); MT_WH1602_Delay(1000 ) ; MT_WH1602_DisplayOnOff(1, 0, 0); MT_WH1602_Delay(1000 ) ; MT_WH1602_ClearDisplay() ; MT_WH1602_Delay(2000) ; // Például vettem az első késleltetési értékeket, amelyek eszembe jutottak) // Általában ellenőrizni kell a kijelző foglalt jelzőt // Most jelenítsünk meg valamit, például a webhelyünk nevét MT_WH1602_WriteData(0x6D) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x6F) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x74) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x65) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x68) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x6E) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x69) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x63) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x73) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x2E) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x72) ; MT_WH1602_Késleltetés(100) ; MT_WH1602_WriteData(0x75) ; MT_WH1602_Késleltetés(100) ; míg (1 ) ( __NOP() ; ) ) /*******************************************************************/

Kész, ellenőrizzük)


Amint látja, minden megfelelően működik)

Egyébként valahogy szem elől tévesztettem azt a kérdést, hogy mit írjak a kijelzőre, hogy ezt vagy azt a karaktert megjelenítsem. Íme a tábla az adatlapról:

Tehát annak meghatározásához, hogy milyen értéket írjunk a kijelző memóriájába, a táblázat tetejére írt és balra írt számokat kell venni egy adott szimbólumhoz. Például az „A” szimbólum. Lássuk - ez a szimbólum a 0100-as oszlopnak (0x4) és a 0001-es sornak (0x1) felel meg. Kiderült, hogy az „A” szimbólum megjelenítéséhez 0x41 értéket kell beírni a kijelzőbe.

Most ennyi =) A WH1602 kijelző csatlakoztatását és működését elintéztük, úgyhogy hamarosan találkozunk!

P.S. Amikor a könyvtárral dolgoztam, nem teszteltem a foglalt jelző beolvasásának funkcióját, így ha hirtelen valami nem működik úgy, ahogy kellene, írjon, kitaláljuk)

  • Az FC-113 modul a PCF8574T chipen alapul, amely egy 8 bites shift regiszter – egy bemeneti-kimeneti „bővítő” az I2C soros busz számára. 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 szabványos módon csatlakozik az I2C buszhoz: a modul SDA tűje az A4 analóg porthoz, az SCL láb 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étrehoz egy LiquidCrystal típusú változót é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 a bal felső sarokba, a (0,0) lcd pozícióba!"); // szövegsor nyomtatása lcd.setCursor(0, 1); // mozgassa a kurzort a 2. sorba, karakter 1 lcd.print( " i "); // az üzenet kinyomtatá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. Ebben az esetben az LCD-kijelző (0, 0) pozícióba való kocsi-visszatérés utasításkódja kerül átvitelre, amely a kijelző műszaki leírásának tanulmányozásával is megtudható.

É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).