Lcd 1602 připojení 4 bitové příkazy. Program interakce mezi PIC16 a LCD indikátory
Pro aktivaci čtyřbitového režimu je nutné programově generovat řídicí signály podle časových diagramů na obr. 1. Strukturou se shodují se schématem 8bitové sběrnice, s výjimkou zdvojnásobeného počtu „E“ impulsů. Komunikační linky procházejí bity vyššího řádu datové sběrnice DB4-DB7, nižší řády DB0-DB3 zůstávají nevyužity.
Obr. 1
Výhodou módu je malý počet vodičů, zjednodušená topologie tištěný spoj, čímž se šetří portové linky MK. Nevýhodou je snížená rychlost přenosu dat v LCD, protože informace musí být přenášeny ve dvou částech (nibbles nebo tetrads) po 4 bitech. Avšak s přihlédnutím k povinným časovým prodlevám v programu a fyzické setrvačnosti „tekutých krystalů“ není pokles rychlosti téměř cítit.
Podívejme se na princip fungování 4bitové sběrnice na příkladu testovacího programu pro naše LCD. Na displeji se zobrazí číslice dekadické adresy známého místa 0-255 a grafické obrázky symbolů v nich obsažených s sekundovými pauzami.
Rýže. 2
Jak víte, každé LCD má zabudovaný generátor znaků, což je oblast ROM o kapacitě větší než 8 KB, která je u výrobce flashována. Tradičně první polovina ROM s adresami 00-7Fh obsahuje obrys čísel, interpunkčních znamének a také velká a malá písmena latinské abecedy. Všechno je jako v IBM PC. Druhá polovina je „vychována“ podle národních abeced. V tomto ohledu má HD44780 modifikace se třemi hlavními možnostmi zapojení generátoru znaků:
Latina a evropské jazyky (evropské standardní písmo nebo euro)
Latinské a japonské znaky (japonské standardní písmo nebo Japonsko)
Latinka a azbuka (Vlastní písmo nebo ruština, obr. 2)
Ne všechny buňky generátoru znaků jsou vyplněny. Při přístupu do „prázdných“ buněk se na obrazovce zobrazí libovolné informace, nejčastěji sestávající z podsvícených bodů. Prvních 8 znaků s adresami 0x00-0x07 je označeno hvězdičkou. V případě potřeby je může uživatel nezávisle naprogramovat.
Který generátor znaků je součástí konkrétního LCD, by mělo být uvedeno v něm symbol nebo v technických parametrech, i když v praxi musíte věřit čestnému slovu prodejce. Dalším přístupem je vidět na vlastní oči všechny možné styly postav na obrazovce LCD. Napíšeme, zkompilujeme program a naprogramujeme regulátor, načež se v horním řádku LCD obrazovky se sekundovými pauzami zobrazí číslice dekadické adresy známého místa 0-255 a grafické obrázky v nich obsažených symbolů. Pokud grafika a pořadí vzhledu znaků odpovídá obr. 2, je LCD v pořádku.
class="eliadunit"> |
Dále sestavíme obvod podle obr. 3, jeho jediný rozdíl je v tom, že datová sběrnice je připojena přes 4vodičové vedení, tzn. DB4-DB7 jsou připojeny, ale DB0-DB3 zůstávají nevyužity. R/W výstup displeje je připojen na mínus, protože Náš displej je přijímač dat.
Kód pro kontrolu generátoru znaků LCD je uveden níže.
// Testovací program generátoru znaků LCD #include
Pro práci se znakovými grafickými displeji doporučujeme použít knihovnu LiquidCrystal, která je součástí standardní sady Arduino IDE a je navržena pro práci přes 8bitové (4bitové) paralelní rozhraní. Pokud je váš displej připojen k Arduinu přes sběrnici I2, musíte nainstalovat knihovnu LiquidCrystal_I2C (většina funkcí opakuje funkce první knihovny).
Podporované displeje:
Zobrazit | Připojení a inicializace |
---|---|
LCD1602 - znakový displej (16x02 znaků), |
#zahrnout [ , 8 , 9 , 10 , 11 ]); void setup())( lcd.begin(16, 2);} // Vysvětlení:
|
s rozhraním I2C (modrá) |
#zahrnout #zahrnout LiquidCrystal_I2C lcd (0x27 nebo 0x3F, 16 , 2); void setup())( lcd.init(); } // Vysvětlení: |
LCD1602 I2C - znakový displej (16x02 znaků), s rozhraním I2C (zelená) |
#zahrnout #zahrnout LiquidCrystal_I2C lcd (0x27 nebo 0x3F, 16 , 2); void setup())( lcd.init(); } // Vysvětlení: |
LCD2004 - znakový displej (20x04 znaků), s paralelním rozhraním (modrá) |
#zahrnout LiquidCrystal lcd(2 , 3 , 4 , 5 , 6 , 7[ , 8 , 9 , 10 , 11 ]); void setup())( lcd.begin(20, 4);} // Vysvětlení: // Pokud je použito 8 vodičů datové sběrnice, uveďte je všechny |
LCD2004 I2C - znakový displej (20x04 znaků), s rozhraním I2C (modrá) |
#zahrnout #zahrnout LiquidCrystal_I2C lcd (0x27 nebo 0x3F, 20 , 4); void setup())( lcd.init(); } // Vysvětlení: |
#1 Příklad
Nápis zobrazujeme na displeji LCD1602 připojeném přes I2C sběrnici. Chcete-li pracovat s displejem LCD2004, musíte změnit řádek 3 na LiquidCrystal_I2C lcd(0x27,20,4);
#zahrnout
#2 Příklad
Nápis zobrazujeme na displeji LCD1602 připojeném přes 4bitovou paralelní sběrnici. Chcete-li pracovat s displejem LCD2004, musíte změnit řádek 5 na lcd.begin(20, 4);
#zahrnout
#3 Příklad
Na displeji LCD1602 připojeném přes sběrnici I2C zobrazujeme nápis „Russian language“:
#zahrnout
Funkce společné pro knihovny LiquidCrystal a LiquidCrystal_I2C:
- začít( sloupce, řádky, ); – Inicializuje zobrazení s počtem sloupců, řádků a velikostí znaků.
- Průhledná();– Vymazání displeje s kurzorem na pozici 0,0 (zabere to hodně času!).
- Domov();– Nastavení kurzoru na pozici 0,0 (zabere to hodně času!).
- Zobrazit();– Rychlé zapnutí displeje (beze změny dat v RAM).
- noDisplay();– Rychlé vypnutí displeje (beze změny dat v RAM).
- blikat();– Zapněte blikající kurzor (s frekvencí asi 1 Hz).
- noBlink();– Vypněte blikající kurzor.
- kurzor();– Povolit podtržení kurzoru.
- noCursor();– Zakázat podtržení kurzoru.
- scrollDisplayLeft();– Posouvá displej doleva. Posune souřadnice zobrazení o jeden sloupec doleva (bez změny paměti RAM).
- scrollDisplayRight();– Posouvá displej doprava. Posune souřadnice zobrazení o jeden sloupec doprava (bez změny paměti RAM).
- zleva do prava();– Určuje další posunutí pozice kurzoru po zobrazení dalšího znaku o jeden sloupec doprava.
- zprava doleva();– Určuje další posunutí pozice kurzoru po zobrazení dalšího znaku o jeden sloupec doleva.
- noAutoscroll();– Určuje, že text bude v budoucnu zarovnán vlevo od pozice kurzoru (jako obvykle).
- automatické rolování();– Označuje, že text bude v budoucnu zarovnán vpravo od pozice kurzoru.
- createChar(číslo, pole ); – Napište vlastní znak do CGRAM displeje pod zadaným číslem.
- setCursor( sloupec, řádek ); – Umístěte kurzor na pozici označenou číslem sloupce a řádku.
- tisk( text ); – Zobrazení textu, symbolů nebo čísel na displeji. Syntaxe je podobná funkci třídy Serial se stejným názvem.
Funkce implementované pouze v knihovně LiquidCrystal_I2C:
- init();– Inicializace displeje. Musí to být první příkaz knihovny LiquidCrystal_I2C po vytvoření objektu. Ve skutečnosti je tato funkce také v knihovně LiquidCrystal, ale v této knihovně je volána automaticky (ve výchozím nastavení) při vytvoření objektu.
- podsvícení();– Zapněte podsvícení displeje.
- noBacklight();– Vypne podsvícení displeje.
- setBacklight( vlajka ); – Ovládání podsvícení (true - zapnout / false - vypnout), používá se místo funkcí noBacklight a podsvícení.
Spojení:
// Pro sběrnici I2C: |
Parametr:
|
// Pro 4vodičovou paralelní sběrnici: #zahrnout Tekutý krystal lcd( R.S. , E , D4 , D5 , D6 , D7 ); void setup())( lcd.begin( kol , řádek ); } |
Parametr:
|
// Pro 8vodičovou paralelní sběrnici: #zahrnout Tekutý krystal lcd( R.S. , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 ); void setup())( lcd.begin( kol , řádek ); } |
|
začít( kol ,
řádek ,
);
Inicializuje displej s rozměry obrazovky a znaky. |
Parametr:
|
Funkce ovládání displeje:
Zobrazit(); Zapne displej poté, co byl vypnut funkcí noDisplay. |
Poznámka: Funkce běží rychle a nemění paměť RAM displeje. |
noDisplay(); Vypne displej. Údaje na displeji se zobrazí až po vyvolání funkce zobrazení, ale nebudou vymazány z paměti RAM a po vyvolání funkce zobrazení se zobrazí znovu. |
Poznámka: Funkce běží rychle a nemění paměť RAM displeje. |
scrollDisplayLeft(); Posune souřadnice zobrazení o jeden sloupec doleva. |
|
scrollDisplayRight(); Posune souřadnice zobrazení o jeden sloupec doprava. Neustálé volání této funkce vytvoří efekt plíživé linie. Souřadnice jsou posunuty jak pro informace dostupné na displeji, tak pro ty, které se zobrazí později. |
Poznámka: Funkce funguje bez změny paměti RAM displeje. Pokud funkci zavoláte 40krát za sebou, souřadnice se vrátí do původního bodu |
Průhledná(); Vymaže displej nastavením kurzoru na pozici 0,0. Informace na displeji budou trvale vymazány. |
Poznámka: Trvá to dlouho. |
podsvícení(); Zapněte podsvícení displeje. |
|
noBacklight(); Vypněte podsvícení displeje. |
Poznámka: Funkce je implementována pouze v knihovně LiquidCrystal_I2C. |
setBacklight( vlajka );
Ovládání podsvícení (místo funkcí noBacklight a podsvícení). |
Parametr:
|
Funkce ovládání kurzoru:
setCursor( kol ,
řádek );
Umístí kurzor na zadanou pozici. |
Parametr:
|
Domov(); Nastavení kurzoru na pozici 0,0. Funguje jako funkce setCursor(0,0); |
Poznámka: Trvá to dlouho. |
blikat(); Povolit blikající kurzor. |
Poznámka: Kurzor zabírá celé pole znaků a bliká s frekvencí asi 1 Hz v pozici, kde byl dříve nastaven. |
noBlink(); Vypněte blikající kurzor. |
Poznámka: Kurzor se stane neviditelným, ale jeho pozice zůstane zachována. |
kurzor(); Povolit podtržení kurzorem. |
Poznámka: Kurzor má podobu podtržítka a je umístěn na pozici, kde byl dříve umístěn. |
noCursor(); Vypnout podtržení kurzorem. |
Poznámka: Kurzor se stane neviditelným, ale jeho pozice zůstane zachována. |
Funkce indikující směr a zarovnání:
zleva do prava(); Určuje, že po každém novém znaku by se pozice kurzoru měla posunout o jeden sloupec doprava. |
Poznámka: Pokud zobrazíte text "abc", na displeji se zobrazí "abc" a text bude vpravo od původní pozice kurzoru. (Jako obvykle) |
zprava doleva(); Určuje, že po každém novém znaku by se pozice kurzoru měla posunout o jeden sloupec doleva. |
Poznámka: Pokud zobrazíte text "abc", na displeji se zobrazí "cba" a text bude vlevo od původní pozice kurzoru. (Psaní zprava doleva) |
noAutoscroll(); Označuje, že v budoucnu by měl být text zarovnán vlevo od původní pozice kurzoru. |
Poznámka: Pokud umístíte kurzor na pozici 10.0 a zobrazíte text, pak první znak zobrazeného textu bude na této pozici. (Jako obvykle) |
automatické rolování(); Označuje, že v budoucnu by měl být text zarovnán vpravo od původní pozice kurzoru. |
Poznámka: Pokud umístíte kurzor na pozici 10.0 a zobrazíte text, kurzor bude na této pozici. (Souřadnice zobrazení se posunou doleva, jako kdybyste volali funkci scrollDisplayLeft tolikrát, kolikrát je písmen ve výstupním textu) |
Funkce zadávání textu a symbolů:
createChar(číslo,pole); Zapíše vlastní znak do CGRAM displeje pod zadaným číslem. Pokud chcete zobrazit text (pomocí funkce tisku), který by měl obsahovat vámi nastavený znak, zadejte lomítko a číslo, pod kterým byl tento znak napsán: print("C\1MBO\2"). |
Parametr:
|
tisknout(text); Zobrazení textu, symbolů nebo čísel na displeji. |
Parametr:
|
Symbolické LCD indikátory z tekutých krystalů se dnes stále častěji používají k zobrazení jednoduchých symbolických informací. Řekneme si, jak s nimi pracovat. V této části článku se podrobně podíváme na znakové LCD založené na řadiči HITACHI HD44780 (nebo kompatibilním SAMSUNG KS0066). Článek je pokusem o systematizaci informací, které jsem našel při práci s těmito LCD.
Znakový LCD s ovladačem HD44780 (KS0066). Rozhraní
Znakový LCD není nic jiného než matice bodů, rozdělená na řádky a pole znaků:
K ovládání této matice a výstupu skutečných znaků se používá speciální ovladač.
HD44780 (a jeho kompatibilní KS0066) je de facto standardem pro ovladače monochromatických LCD displejů syntetizujících znaky s paralelním 4 nebo 8bitovým rozhraním. Na základě tohoto ovladače se vyrábí obrovské množství modelů s různými konstrukcemi a rozlišeními, počínaje 8x1 (osm znaků na jednom řádku) a konče 40x4 (obsahující dva nezávislé ovládací čipy). Typická pracovní frekvence regulátoru je 270 kHz.
LCD ovladač pracuje se 3 paměťovými bloky:
1. Ovladač používá paměť k výstupu znaku DDRAM(Display Data RAM), kde jsou uloženy ASCII kódy znaků, které chceme vidět na LCD. Je pro něj alokováno 80 paměťových buněk. Je jasné, že na LCD uvidíme pouze část znaků, které jsou v DDRAM - pokud je náš LCD 1 nebo 2 řádek a zobrazuje 8 znaků na řádek, pak takto:
Pracovní oblast displeje, jak vidíte, lze posouvat podél buněk DDRAM (získáte efekt plíživé linie).
2. Kontrolér přebírá šablony samotných symbolů CGROM(Character Generator ROM) – paměť generátoru znaků. Tabulku symbolů naleznete ve specifikaci pro HD44780.
3. K dispozici je paměť pro ukládání uživatelských symbolů (jejich šablon) CGRAM(RAM generátoru znaků).
Správce také v závislosti na určitých podmínkách distribuuje do něj přijatá data registr pokynů nebo datový rejstřík.
Typické 14pinové rozhraní řadiče HD44780:
Zemní, společné, GND |
|
Napájecí napětí, Vcc (+5V) |
|
Úprava kontrastu (Vo) |
|
Výběr registru (R/S pro HD44780, A0 pro KS0066) |
|
Čtení/zápis (R/W) |
|
Stroboskop při pádu E (Povolit) |
|
Bit 0 (vedlejší pro 8bitové rozhraní) |
|
Datová linka |
|
DB 4 (vedlejší pro 4bitové rozhraní) |
|
DB 7 (vysoké pro 8 (4) bitové rozhraní) |
|
Pro podsvícený displej |
|
Výkon podsvícení pro podsvícené displeje (anoda) |
|
Výkon podsvícení pro podsvícené displeje (katoda) |
Podíváme se na číslování pinů na konkrétním LCD v datasheetu.
Kontrast obrazu na LCD lze změnit připojením přídavného trimovacího odporu 10 kOhm podle následujícího schématu:
Měli byste se však podívat na specifikaci vašeho řadiče (například Klsn10294v-0 LCD na čipu KS0066 má 1-Vcc a 2-GND). Napájení podsvícení se může lišit model od modelu v závislosti na jeho typu. Typicky je podsvícení napájeno 5 volty odpor omezující proud (50-100 ohmů) je obvykle volitelný.
Přiřazení pinů R/S, R/W, E:
Když E přechází z vysokého log. na nízkou úroveň dat, která již „visí“ na terminálech DB0..DB7, jsou zapsány do paměti ovladače LCD pro následné zpracování.
Při vysoké log. na úrovni R/S (Register Select) řadič LCD vnímá tuto sadu bitů jako data (znakový kód) a na nízké úrovni jako instrukci a odešle je do příslušného registru.
R/W určuje směr činnosti pinů DB0..DB7 - pokud je R/W „0“, pak můžeme na DB port pouze zapisovat a pokud R/W = „1“, můžeme z něj číst (například zjistit, zda je kontrolér zaneprázdněn nebo je volný pro příjem nových dat). Pokud nečteme data z LCD, můžeme R/W „zasadit“ na zem.
HD44780 instrukční sada
Aby bylo možné začít zobrazovat informace na LCD, musí být inicializován jeho ovladač (informovat jej o rozhraní, fontu, offsetech atd.). Ovladač může přijmout celkem 11 příkazů:
Název pokynů |
Stav PIN |
Čas dokončení f otrok = 270 kHz |
||||||||||
Vymazání celého LCD a nastavení adresy DDRAM na 0 |
||||||||||||
Nastavení aktuální adresy DDRAM na 0 (kurzor - home) Data DDRAM se nezmění |
||||||||||||
Nastavení směru pohybu kurzoru (I/D) a offsetu displeje (S) při výstupu dat |
||||||||||||
Ovládání zapnutí/vypnutí displeje |
Zapnuto vypnuto. displej (D), kurzor (C) a jeho blikání (B) |
|||||||||||
Posun kurzoru nebo zobrazení |
Přesune kurzor a posouvá zobrazení přes DDRAM |
|||||||||||
Nastavení rozhraní (DL), počtu řádků (N) a písma znaků (F) |
||||||||||||
Nastavte adresu CGRAM |
Nastavení čítače adres CGRAM. Poté můžete zapisovat data do CGRAM |
|||||||||||
Nastavte adresu DDRAM |
Nastavení čítače adres DDRAM |
|||||||||||
Přečtěte si rušnou vlajku a adresu |
Pokud BF = 1, pak ovladač LCD provádí interní operaci (zaneprázdněn). AC6-AC0 – aktuální hodnota adresy DDRAM |
|||||||||||
Zápis dat do RAM |
Zápis dat do RAM |
|||||||||||
Čtení dat z RAM |
Čtení dat z RAM |
I/D = 1: adresa DDRAM se zvyšuje I/D = 0: klesá
S = 1: Posouvání pracovní plochy displeje přes DDRAM je povoleno
D = 1: displej (obrázek) zapnutý
C = 1: kurzor povolen
B = 1: Blikání kurzoru povoleno
S/C = 1: pohyb displeje S/C = 0: pohyb kurzoru
R/L = 1: vpravo R/L = 0: vlevo
DL=1:8 bitů DL=0:4 bitů
N=1:2 řádky N=0:1 řádky
F = 1: 5x10 F = 0: 5x8
ACG:CGRAM adresa
ADD: adresa DDRAM (adresa kurzoru)
AC: Čítač adres DD a CGRAM adresy
inicializace LCD
Existují 2 způsoby, jak inicializovat ovladač LCD:
1. Přes vnitřní resetovací obvod.
2. V ručním režimu (zasláním řady příkazů, kterými nastavujeme provozní režim LCD)
Vnitřní resetovací obvod regulátoru začne fungovat okamžitě po zapnutí napájení. Má to jednu nevýhodu - pokud se náš výkon „plazí“ na provozní úroveň pomalu (pomaleji než 10 ms), nemusí samoinicializace ovladače probíhat správně. Při této metodě inicializace regulátor sám provádí následující příkazy:
1. Displej jasný
2. Sada funkcí:
DL = 1; data 8bitového rozhraní
N = 0; 1řádkový displej
F = 0; Písmo znaků 5x8 bodů
3. Ovládání zapnutí/vypnutí displeje:
D = 0; Displej vypnutý
C = 0; Kurzor vypnutý
B = 0; blikání vypnuto
4. Nastavení vstupního režimu:
I/D = 1; Zvýšení o 1
S = 0; Žádný posun
Druhý způsob eliminuje závislost obvodu na zdroji energie. Chcete-li inicializovat ovladač LCD v ručním režimu, musíte provést následující algoritmus:
Jak vidíte, není zde nic složitého: posíláme příkaz za příkazem na LCD, přičemž bereme v úvahu dobu jejich provedení (asi 40 μs) nebo kontrolujeme příznak obsazení ovladače LCD (pak musíme nasadit pin RW nožku mikrokontroléru a nastavte ji na „1“, když chceme zjistit, zda je LCD zaneprázdněn nebo ne).
To je ve skutečnosti vše, co se týká teorie práce se symbolickými LCD. Pokud jste něco přehlédli nebo udělali chybu, přečtěte si specifikaci ovladače nebo .
Ve druhé části se budeme zabývat hardwarovou a softwarovou implementací komunikace mezi mikrokontrolérem PIC a LCD.
Tento displej nějakou dobu ležel nečinný.
A teď je tu touha připojit jej k jednomu z projektů Můžete se samozřejmě pokusit najít knihovnu s hotovými funkcemi, ale v tomto případě bude obrázek toho, jak displej funguje, neúplný a jsme. není s tím spokojený. Jakmile pochopíte princip fungování LCD displeje, nebude těžké napsat si vlastní knihovnu pro požadovaný displej, pokud chybí nebo není nějakým způsobem vyhovující.
Takže, začněme.
První věc, kterou musíte udělat, je najít pinout, to znamená, který kontakt je za co zodpovědný, druhou je najít název ovladače, který ovládá displej, abyste to udělali, stáhněte si datový list tohoto LCD a otevřete jej na první stránka.
Kontakty se počítají zleva doprava, první je označen červenou šipkou. Napájecí napětí je 5 voltů, řídící ovladač S6A0069 nebo podobně, např. ks0066U.
Proč jsme hledali název řídicího ovladače? Faktem je, že v datovém listu na displeji jsou časová zpoždění (časový diagram), systém příkazů je popsán, ale neexistuje žádná banální inicializace a bez ní není kam.
Dále otevřete druhou stránku a podívejte se na tabulku, která říká, který kontakt je za co zodpovědný.
DB7…DB0– datová/adresová sběrnice.
R/W- určuje, co budeme dělat, číst (R/W=1) nebo psát (R/W=0)
R/S– určuje, zda budeme posílat příkaz (RS=0) nebo data (RS=1)
E– stroboskopický vstup, změnou signálu na tomto vstupu umožníme displeji číst/zapisovat data.
LED±– ovládání podsvícení.
Musím říci, že na displeji, který jsem obdržel, se podsvícení jen tak nezapne, je třeba zapájet odpor, označený na desce jako R7. Ale zatím to nepotřebujeme.
Stáhněte si datový list řídicí jednotky a vyhledejte pokyny pro inicializaci. Obrázky lze zvětšit kliknutím na ně.
Ukazuje se, že existují dvě takové instrukce, pro 8bitové a 4bitové režimy. O jaké režimy se jedná? Tyto režimy určují, kolik drátů bude přenášeno dat: čtyři nebo osm. Podívejme se na převodovku 4 dráty, v tomto případě bude displej pracovat pomaleji, ale ušetříme 4 piny mikrokontroléru a implementace osmibitového režimu se příliš neliší.
Informační schéma zapojení je následující.
Kontrast lze upravit připojením potenciometru mezi napájecí kolíky.
Rád bych vás upozornil na skutečnost, že při inicializaci R/S A R/W jsou vždy rovny nule, to znamená, že pošleme týmy.
Během inicializace můžete konfigurovat:
- N - počet zobrazených řádků
- C - zapnutí nebo vypnutí kurzoru
- B - nechá kurzor blikat
- I/D - zvýšení nebo snížení hodnoty čítače adresy
- SH - přesunutí zobrazovacího okna
Obrázek níže ukazuje, na jakou adresu potřebujeme zapisovat data, aby se zobrazila na určité pozici, např. chceme-li zobrazit symbol na první pozice druhého řádku, pak musíme napsat na adresu 0x40.
Poté se hodnota čítače automaticky změní, buď zvýší nebo sníží, a spolu s tím se změní i pozice kurzoru.
Mimochodem, volá se paměť, do které zapisujeme DDRAM, vše, co zapíšeme do této paměti, se zobrazí na displeji, stále je CGROM, který ukládá tabulku generátoru znaků.
Tuto tabulku nelze změnit, ale lze z ní vzít hotové symboly. Dalším typem paměti je CGRAM, je to také tabulka generátoru znaků, ale znaky do této tabulky kreslíme sami.
Nyní pár slov k pohybu obrazovky, faktem je, že obvykle na displeji nevidíme celou DDRAM, ale pouze určitou část, jak je znázorněno na obrázku níže.
Můžeme psát i do neviditelné části, ale to, co píšeme, nebude vidět, dokud na toto místo nepřesuneme okno obrazovky.
S teorií jsme skončili, přejděme k praxi.
Obrázek komunikace s LCD displejem ve 4bitovém režimu vypadá takto.
Data se odesílají v bajtech, ale protože máme 4bitový režim, pro odeslání bajtu je třeba provést 2 odeslání, přičemž nejvýznamnější bit je první. Na obrázku je první parcela označena D7 (vysoká tetráda), druhá D3 (nízká tetráda). Před dalším odesláním musíme zkontrolovat příznak obsazenosti a pokud není nastaven, můžeme odeslat znovu, pokud je nastaven, počkáme, až ovladač, který ovládá LCD, dokončí svou činnost.
Když máme obecný obrázek o odesílání, pojďme zjistit, jak implementovat operaci odesílání.
Chcete-li odeslat, musíte použít 8bitovou sběrnici:
- R/W nastaveno na 0
- vydat příkazový kód/data na sběrnici
- zpoždění 2us
- spodní stroboskop E
Operace čtení je implementována podobně:
- ujistěte se, že je ovládací ovladač volný
- R/W nastaveno na 1
- zvedněte stroboskop E (v tuto chvíli bude LCD vydávat data na sběrnici)
- zpoždění 2us
- čteme, co LCD dalo
- spodní stroboskop E
Nad časováním je tabulka, která říká, čemu se rovna zpoždění uvedená na grafu, a tedy trvání zábleskového impulsu - tw by se mělo rovnat 230nS nebo 450nS v závislosti na napájecím napětí, vzali jsme to trochu s okraj. Proč jsme vzali v úvahu pouze toto zpoždění? Protože hodnota zbývajících zpoždění je velmi malá.
Odeslání přes 4bitovou sběrnici:
- ujistěte se, že je ovládací ovladač volný
- nastavte RS na 0 (příkaz) nebo 1 (data), podle toho, co budeme posílat
- R/W nastaveno na 0
- zvýšit stroboskop E (nastaveno na 1)
- do autobusu vydáváme nejvyšší sešit
- zpoždění 2us
- spodní stroboskop E
- zpoždění 1us
- zvýšit stroboskop E (nastaveno na 1)
- vydáme nízkou tetrádu do autobusu
- zpoždění 2us
- spodní stroboskop E
Pro čtení na 4bitové sběrnici:
- ujistěte se, že je ovládací ovladač volný
- datový port pro vstup s pull-up
- nastavíme RS na 0 (příkaz) nebo 1 (data), podle toho, co budeme číst
- R/W nastaveno na 1
- zvýšit stroboskop E (nastaveno na 1)
- zpoždění 2us
- přečtěte si seniorský zápisník
- spodní stroboskop E
- zpoždění 1us
- zvýšit stroboskop E (nastaveno na 1)
- zpoždění 2us
- přečtěte si spodní sešit
- spodní stroboskop E
Zvednutí stroboskopu a výstup příkazu/dat na sběrnici lze prohodit. Nyní nebude obtížné displej inicializovat. Pro zjednodušení inicializace nahradíme čtení příznaku obsazeno se zpožděním a práci s příznakem zvážíme později.
Nutno podotknout, že při inicializaci ve 4bitovém režimu se používají 4bitové instrukce a po inicializaci 8bitový instrukční systém, takže pro inicializaci implementujeme samostatnou funkci pro odesílání příkazů void Write_Init_Command(uint8_t data).
//Inicializační kód pro Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include
Stalo se, že jsem si tu pro radost koupil něco pro sebe LCD zobrazí dva řádky po osmi znacích. Ležel v krabici, ale něco mě napadlo a rozhodl jsem se ho využít a zároveň se zapojit do jeho práce. Jak se připojit k LCD AVR Teď vám řeknu o displeji.
Pro začátek udělám hned rezervaci, o které se budeme bavit LCD indikátory na ovladači HD44780, který se stal de facto průmyslovým standardem na trhu alfanumerických displejů. Prodává se všude, kde je to možné, je levné (8x2 mě stálo asi 150 rublů) a je pro něj napsána spousta kódu. Jako obvykle jsem se rozhodl znovu vynalézt kolo a vytvořit si vlastní knihovnu pro práci s tímto typem indikátorů. Samozřejmě v assembleru, ale co jiného? ;)
Spojení.
LCD na základně HD44780 se připojuje k AVR mikrokontroléru přímo do portů. Existují dva způsoby připojení – 8bitové a 4bitové. V osmibitovém režimu je o něco snazší nahrát bajty – nemusíte posouvat bajt, ale ve čtyřbitovém režimu musíte utratit až o čtyři části ovladače méně. Práce v 8bitovém režimu má ještě jednu vlastnost – tento displej lze připojit k některým ovladačům jako externí RAM a odesílat data pomocí jednoduchých příkazů pro přeposílání. Osobně jsem to připojil v režimu plného portu, neměl jsem kam dát jeden z terminálů, takže to není škoda.
- závěry DB7…DB0 Toto je datová/adresová sběrnice.
- E- stroboskopický vstup. Trhnutím napětí na této lince dáme displeji najevo, že potřebuje přijmout/odeslat data z/na datovou sběrnici.
- RW— určuje, kterým směrem se naše data pohybují. Pokud 1, tak čtěte z displeje, pokud 0, pak zapište na displej.
- R.S.— určuje, co se vysílá, příkaz (RS=0) nebo data (RS=1). Data budou zapsána do paměti na aktuální adrese a příkaz bude proveden kontrolérem.
Na straně síly jsou věci ještě jednodušší:
- GND- mínus, to je běžné.
- Vcc- plus napájení, obvykle 5V
- V0— kontrastní vstup. Zde je potřeba přivést napětí od nuly k napájecímu napětí, čímž nastavíte kontrast obrazu. Můžete nainstalovat proměnný odpor zapnutý potenciometrem a kroutit ho podle libosti. Hlavní je chytit maximální hodnotu kontrastu, ale tak, aby nebyla vidět známost (šedá aureola čtverečků kolem symbolu). Pokud nastavíte příliš nízký kontrast, postavy se budou líně a promyšleně přepínat. Podobně jako u kalkulačky, jejíž baterie jsou vybité.
- A— toto je vstup anody LED podsvícení. Zkrátka plus.
- NA— podle toho katoda, také známá jako minus. Podsvícení odebírá cca 100mA a proto je potřeba tam osadit 100 Ohmový proud omezující rezistor. Mimochodem, mnoho LCD displejů má na desce skvrny pro pájecí odpory. Pokud zavoláte, můžete se ujistit, že tyto linky vedou k napájecím vstupům LCD, proto se připájením odporů nemusíte obtěžovat s napájením podsvícení, bude připojeno k napájení ovladače.
Regulátor má vlastní řídicí jednotku, která zpracovává příkazy a paměť. Dělí se na tři typy:
DDRAM- paměť displeje. Vše, co je zaznamenáno v DDRAM se zobrazí na obrazovce. To znamená, že jsme tam například napsali kód 0x31- na obrazovce se objeví symbol "1" protože 0x31 toto je ASCII kód číslice 1. Ale je tu jedna zvláštnost - DDRAM Paměť je mnohem větší než viditelná oblast obrazovky. Obvykle, DDRAM obsahuje 80 buněk- 40 na prvním řádku a 40 na druhém a displej se může po tomto řádku pohybovat jako okno na posuvném pravítku a zvýrazňovat viditelnou oblast. To znamená, že to můžete například vložit DDRAM pět položek nabídky najednou a pak stačí posouvat displej tam a zpět a zobrazovat jednu položku po druhé. Pro pohyb displeje existuje speciální příkaz. Existuje také koncept kurzoru - to je místo, kam se bude psát další znak, tzn. aktuální hodnota čítače adres. Kurzor nemusí být na obrazovce, může být umístěn za obrazovkou nebo může být zcela deaktivován.
CGROM- tabulka symbolů. Když píšeme do buňky DDRAM bajtu, poté je z tabulky odebrán znak a nakreslen na obrazovku. CGROM nelze změnit, proto je důležité, aby měl na palubě ruská písmena. Pokud se samozřejmě plánuje rozhraní v ruském jazyce.
CGRAM- také tabulka symbolů, ale můžeme ji změnit vytvořením vlastních symbolů. Adresuje se lineárně, to znamená, že nejprve je 8 bajtů jednoho znaku, řádek po řádku, zdola nahoru - jeden bit se rovná jednomu bodu na obrazovce. Potom druhý symbol stejným způsobem. Protože naše znalost je 5 x 8 bodů na nejvýznamnějších třech bitech nezáleží. Celkem v CGRAM může mít 8 znaků, resp CGRAM Má to 64 byte paměti. Tyto programovatelné znaky mají kódy od 0x00 do 0x07. Takže když jsem hodil například první 8 bajtů CGRAM(první znak s kódem 00) nějaké smetí a zápis DDRAM nula (kód prvního znaku v CGRAM) uvidíme naše svinstvo na obrazovce.
Přístup do paměti.
Všechno je zde jednoduché. Příkazem vybereme, do které paměti a od jaké adresy budeme zapisovat. A pak stačí poslat bajty. Pokud je indikováno, že zapisujeme do DDRAM, pak se znaky objeví na obrazovce (nebo ve skryté oblasti), pokud v CGRAM, pak se bajty již objeví v paměti generátoru znaků. Hlavní je nezapomenout se přepnout zpět do oblasti DDRAM
Příkazový systém.
Příkazový systém je jednoduchý jako bučení. Noha bude indikovat odesílání příkazu do ovladače displeje. R.S.=0. Samotný příkaz se skládá z nejvýznamnějšího bitu, který určuje, za co je tento příkaz zodpovědný, a parametrických bitů, které říkají řadiči HD44780, jak má postupovat.
Tabulka příkazů:
DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 | Význam |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | Čištění obrazovky. Čítač adresy na pozici 0 paměti DDRAM |
0 | 0 | 0 | 0 | 0 | 0 | 1 | — | Resetování adresování do DDRAM se posune, čítač adresy na 0 |
0 | 0 | 0 | 0 | 0 | 1 | I/D | S | Nastavení obrazovky a posunu kurzoru |
0 | 0 | 0 | 0 | 1 | D | C | B | Nastavení režimu zobrazení |
0 | 0 | 0 | 1 | S/C | R/L | — | — | Posun kurzoru nebo obrazovky v závislosti na bitech |
0 | 0 | 1 | D.L. | N | F | — | — | Výběr počtu řádků, šířky sběrnice a velikosti znaků |
0 | 1 | A.G. | A.G. | A.G. | A.G. | A.G. | A.G. | Přepněte adresování na SGRAM a nastavte adresu v SGRAM |
1 | INZERÁT | INZERÁT | INZERÁT | INZERÁT | INZERÁT | INZERÁT | INZERÁT | Přepněte adresování na DDRAM a nastavte adresu na DDRAM |
Nyní vysvětlím, co jednotlivé bity znamenají:
- I/D— zvýšení nebo snížení počítadla adres. Výchozí hodnota je 0 – Snížit. Tito. každý následující bajt bude zapsán do n-1 buněk. Pokud vložíte 1, dojde k přírůstku.
- S— posunutí obrazovky, pokud jej nastavíte na 1, pak se s každým novým znakem bude okno obrazovky posouvat, dokud nedosáhne konce DDRAM, pravděpodobně bude vhodné, když na obrazovce zobrazíte statný řádek pro všech 40 znaků, aby nestekl z obrazovky.
- D— zapnout displej. Pokud tam dáte 0, obraz zmizí a v tuto chvíli můžeme ve videopaměti dělat nejrůznější obscénní věci a nebudou z nich bolet oči. A aby se obrázek objevil na této pozici, musíte napsat 1.
- S— zapnout kurzor ve formě pomlčky. Je to jednoduché, napište sem 1 - kurzor se zapne.
- B— aby kurzor vypadal jako blikající černý čtverec.
- S/C pohybem kurzoru nebo obrazovky. Pokud je 0, kurzor se přesune. Pokud 1, pak obrazovka. Jednou za tým
- R/L— určuje směr posunu kurzoru a obrazovky. 0 - vlevo, 1 - vpravo.
- D/L— bit, který určuje šířku datové sběrnice. 1-8 bitů, 0-4 bitů
- N— počet řádků. 0 - jeden řádek, 1 - dva řádky.
- F— velikost symbolu 0 — 5x8 pixelů. 1 - 5x10 bodů (velmi vzácné)
- A.G.- adresa v paměti CGRAM
- INZERÁT- adresa v paměti DDRAM
Sám jsem na toto znamení dlouho zíral a snažil se pochopit, co ode mě chtějí. Zřejmě byl nevyspalý, ale ve skutečnosti to není na první pohled patrné, takže to podložím příkladem.
Úkol:
- Zapněte displej.
- Vymazat obsah.
- Posuňte kurzor o jednu pozici.
- A napište tam "1".
První věc Inicializace displej, bez kterého většina displejů na HD44780 prostě odmítne fungovat. Některé typy mají výchozí stav (8bitová sběrnice, kurzor na 0) a stačí jim pouze rozsvítit displej. Ale stále je lepší to udělat, nikdy nevíte, co vývojář udělal. Nic navíc nebude.
- 001 11000 Bus 8 bitů, 2 linky
- 00000001 Čištění obrazovky
- 000001 10 Přírůstek adresy. Obrazovka se nehýbe
- 00001 100 Displej zapnutý (D=1)
- 00000001 Vymazal displej. Ukazatel je na DDRAM
- 0001 0100 Přesunul kurzor (S/C=0) doprava (R/L=1)
- 00110001 - data jsme již zaznamenali (RS pin = 1) kód “1” 0x31
Úkol: vytvořte si vlastní symbol. S kódem 01 a zobrazte jej na obrazovce.
Věříme, že náš displej již byl inicializován a je připraven přijímat data.
Řešení:
- 01 001000 Vyberte v CGRAM adresa 0x08 je jen začátek druhého znaku (připomínám, že jeden znak zabírá 8 bajtů)
- 00000001 Toto je 8 bajtů dat. ( RS = 1)
- 0000001 0 Nakreslete ikonu blesku nebo
- 000001 00 runa SS Zig, jak si přejete
- 00001 Mám radši 000.
- 00011111 Nejvýznamnější tři bity nemají žádný vliv
- 0000001 0 Tam můžete napsat cokoliv, na
- 000001 00 neovlivní výsledek.
- 00001 000 Poslední bajt dat
- 1 0000000 A toto je příkaz - přepnutí adresy na DDRAM a ukazatel na adresu 0000000 — první znak v prvním řádku.
- 00000001 A znovu data ( RS = 1), kód 01 - sem dáváme zip.
Takže jsme vyřešili logiku, je čas ponořit se do fyziky komunikačního protokolu. Kód poskytnu o něco později, až vyčistím svou knihovnu a optimalizuji ji k dokonalosti. Prozatím vám dám algoritmus a lze jej implementovat v jakémkoli programovacím jazyce. Alespoň v assembleru, alespoň v Syah a dokonce i ve Vasiku :)
Algoritmus pro čtení/zápis na LCD ovladač HD44780
Směr, stejně jako příkaz/data, určují nohy a čtení a zápis se provádí přechodem stroboskopu (pin E) z 1 na 0
Inicializace portů
- RS, RW, E - pro ukončení režimu.
- DB7..DB0 do vstupního režimu. Nemusíte se jich však dotýkat; později je předefinujeme.
- RS=0 (příkaz)
- RW=1 (čtení)
- E=1 (připravte se!!!)
- Pauza (stačilo 14 cyklů procesoru při 8 MHz)
- E=0 (Pli!)
- Čtení z přístavu. Pokud je nastaven bit 7 (příznak Busy), pak vše opakujeme znovu, dokud není resetován.
- Čekání na připravenost
- RS=0 (příkaz)
- RW=0 (zápis)
- E=1 (připravte se!!!)
- Výstupní port
- Zadejte příkazový kód do portu
- Pauza
- E=0 (Pli!)
- Ramenní pistole Port pro vstup, jen pro případ.
- Čekání na připravenost
- RS=1 (data)
- RW=0 (zápis)
- E=1 (připravte se!!!)
- Výstupní port
- Zadejte příkazový kód do portu
- Pauza
- E=0 (Pli!)
- Port pro vstup, pro každý případ.
- Čekání na připravenost
- Datový port pro vstup s pull-up (DDR=0, PORT=1)
- RS=0 (příkaz)
- RW=1 (čtení)
- Pauza
- Čtení dat z portu
- E=0 (A!)
- Čekání na připravenost
- Datový port pro vstup s pull-up (DDR=0, PORT=1)
- RS=1 (data)
- RW=1 (čtení)
- E = 1 (Připravte se! V tuto chvíli jsou data z LCD odesílána na sběrnici)
- Pauza
- Čtení dat z portu
- E=0 (A!)
U čtyřbitové sběrnice je vše úplně stejné, jen tam každá operace čtení/zápisu probíhá na dva zábleskové záblesky.
Vstup:
- Pauza
- Seniorský zápisník byl odeslán do přístavu
- Pauza
- Pauza
- Mladší tetráda byla přivedena do přístavu
- Pauza
- Čtení staršího zápisníku z portu
- Pauza
- Pauza
- Čtení nízké tetrády z přístavu
Počkejte na kód :) Již brzy :)
UPD: