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 #zahrnout #define RS PC0 #define EN PC2 // Funkce pro zápis příkazu na LCD void lcd_com(unsigned char p) ( PORTC &= ~(1)<< RS); // RS = 0 (запись команд) PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // Выделяем старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // Выделяем младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция записи данных в ЖКИ void lcd_dat(unsigned char p) { PORTC |= (1 << RS)|(1 << EN); // RS = 1 (запись данных), EN - 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p & 0xF0); // Выделяем старший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); PORTC |= (1 << EN); // EN = 1 (начало записи команды в LCD) PORTD &= 0x0F; PORTD |= (p << 4); // Выделяем младший нибл _delay_us(100); PORTC &= ~(1 << EN); // EN = 0 (конец записи команды в LCD) _delay_us(100); } // Функция инициализации ЖКИ void lcd_init(void) { DDRC |= (1 << PC2)|(1 << PC0); // PC1, PC0 - выходы PORTC = 0x00; DDRD = 0xFF; // порт D - выход PORTD = 0x00; _delay_ms(50); // Ожидание готовности ЖК-модуля // Конфигурирование четырехразрядного режима PORTD |= (1 << PD5); PORTD &= ~(1 << PD4); // Активизация четырехразрядного режима PORTC |= (1 << EN); PORTC &= ~(1 << EN); _delay_ms(5); lcd_com(0x28); // Шина 4 бит, LCD - 2 строки lcd_com(0x08); // Полное выключение дисплея lcd_com(0x01); // Очистка дисплея _delay_us(100); lcd_com(0x06); // Сдвиг курсора вправо _delay_ms(10); lcd_com(0x0C); // Включение дисплея, курсор не видим } // Основная программа int main (void) { unsigned char znak = 0; // определяем переменную lcd_init(); // Инициализация дисплея while (1) { lcd_com(0x80); // Вывод в верхнюю левую позицию 1 строки lcd_dat(znak/100 + "0"); // Выделяем сотни lcd_dat((znak/10)%10 + "0"); // Выделяем десятки lcd_dat(znak%10 + "0"); // Выделяем единицы lcd_dat("="); // Выводим знак равенства lcd_dat(znak); // Выводим содержимое знакогенератора _delay_ms(100); // Тут можно поменять задержку вывода символов znak++; // Следующий символ знакогенератора } }

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í:

void setup())( OBJECT.begin(NUM_COLUMN, NUMBER_ROWS); )


LiquidCrystal OBJECT (RS, E, DO, D1, D2, D3, D4, D5, D6, D7);


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í:
LiquidCrystal_I2C OBJECT (I2C_ADDRESS, COLUMNS_COLUMN, ROW_COUNTY);
// I2C_ADDRESS může být 0x27 nebo 0x3F

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í:
LiquidCrystal OBJECT(RS, E, D4, D5, D6, D7);
void setup())( OBJECT.begin(COLUMNS, ROWS); )

// Pokud je použito 8 vodičů datové sběrnice, uveďte je všechny
LiquidCrystal OBJECT (RS, E, DO, D1, D2, D3, D4, D5, D6, D7);

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í:
LiquidCrystal_I2C OBJECT (I2C_ADDRESS, COLUMNS_COLUMN, ROW_COUNTY);
// I2C_ADDRESS může být 0x27 nebo 0x3F

#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 // Připojení knihovny pro práci s LCD displejem přes I2C sběrnici LiquidCrystal_I2C lcd(0x27,16,2); // Deklarujte objekt knihovny s uvedením parametrů zobrazení (adresa I2C = 0x27, počet sloupců = 16, počet řádků = 2) // Pokud se nápis nezobrazí, nahraďte adresu 0x27 0x3F void setup())( / / lcd.init( // Zahájení práce s LCD displejem lcd.backlight(); // Zapnutí podsvícení LCD displeje lcd.setCursor(0, 0); , 0 řádek) lcd.print("LCD" // Vytiskne text "LCD", počínaje od nastavené pozice kurzoru lcd.setCursor(0, 1) // Nastavte kurzor na pozici (0 sloupec, 1 řádek); ) lcd.print("www.iarduino.ru" Zobrazíme text "www.iarduino.ru", počínaje od nastavené pozice kurzoru) // // void loop()() // Kód uvnitř smyčky); funkce se provádí nepřetržitě. Ale protože zobrazujeme statický text, potřebujeme jej zobrazit pouze jednou při spuštění, bez použití kódu smyčky

#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 // Připojení knihovny LiquidCrystal pro práci s LCD displejem LiquidCrystal lcd(2,3,4,5,6,7); // Deklarujte objekt knihovny s uvedením pinů displeje (RS, E, D4, D5, D6, D7) // Pokud je použito 8 vodičů datové sběrnice, zadejte (RS, E, D0, D1, D2, D3, D4 , D5, D6,D7) void setup())( // lcd.begin(16, 2); // Zahájení práce s LCD displejem s uvedením čísla (sloupce, řádky) lcd.setCursor(0, 0); // Nastavte kurzor na pozici (0 sloupec, 0 řádek) lcd.print("LCD2004" // Vytiskne text "LDC1602", počínaje od nastavené pozice kurzoru lcd.setCursor(0, 1); Nastavte kurzor na pozici (0 sloupec, 1 řádek) ) lcd.print("www.iarduino.ru" // Vytiskne text "www.iarduino.ru", počínaje od nastavené pozice kurzoru ) // // void loop()() // Kód uvnitř funkce loop je vykonáván nepřetržitě. Ale protože zobrazujeme statický text, potřebujeme jej zobrazit pouze jednou při spuštění, bez použití kódu smyčky

#3 Příklad

Na displeji LCD1602 připojeném přes sběrnici I2C zobrazujeme nápis „Russian language“:

#zahrnout // Připojte knihovnu pro práci se sběrnicí I2C #include // Připojení knihovny pro práci s LCD displejem přes I2C sběrnici LiquidCrystal_I2C lcd(0x27,16,2); // Deklarujte objekt knihovny s uvedením parametrů zobrazení (adresa I2C = 0x27, počet sloupců = 16, počet řádků = 2) // uint8_t symbol = ( // Deklarujte pole 6 nativních symbolů (jazyků), každý symbol se skládá z 8 bajtů ( 0, 0,18,20,24,20,18, 0 ), // až ( 0, 0,17,19,21,25,17, 0 ), // a (10, 4, 17,19,21,25,17, 0 ), // th ( 0, 0,15,17,15, 5, 9, 0 ), // i ( 0, 0,14,17, 6,17 , 14,0), // z (0, 0,17,17,29,19,29, 0)); // s // void setup())( // lcd.init(); // Zahájení práce s LCD displejem lcd.backlight(); // Zapnutí podsvícení LCD displeje lcd.createChar(1, symbol ); // Načtení 1 symbolu "k" do paměti RAM lcd.createChar(2, symbol) // Načtení 2. symbolu "i" do paměti RAM lcd.createChar(3, symbol); symbol "th" do paměti RAM lcd.createChar (4, symbol // Načtení 4. symbolu "i" do paměti RAM lcd.createChar(5, symbol) // Načtení 5. symbolu "z" do display RAM lcd.createChar(6, symbol znak "s" na displeji RAM lcd.setCursor(0, 0) // Nastaví kurzor na pozici (0 sloupec, 0 řádek) lcd.print("Pycc\1\); 2\3 \4\5\6\1" ); // Vypíše text "Pyccy language", kde "Pycc" je napsáno latinkou a "kyy language" - ve znacích z paměti RAM ) // Pokud potřebujete vypsat znak z paměti RAM displeje, poté napsat \ a číslo znaku // void loop( )() // Kód uvnitř funkce loop je vykonáván nepřetržitě. Ale protože zobrazujeme statický text, potřebujeme jej zobrazit pouze jednou při spuštění, bez použití kódu smyčky

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:
#zahrnout
#zahrnout
LiquidCrystal_I2C lcd( adresa , kol , řádek );
void setup())(
lcd.init();
}

Parametr:
  • adresa: Adresa displeje na sběrnici I2C - 0x27 nebo 0x3F
  • col:
  • řádek:
// Pro 4vodičovou paralelní sběrnici:
#zahrnout
Tekutý krystal lcd( R.S. , E , D4 , D5 , D6 , D7 );
void setup())(
lcd.begin( kol , řádek );
}
Parametr:
  • RS:č. pinu Arduino, ke kterému je pin RS připojen
  • E:Číslo pinu Arduina, ke kterému je připojen pin E
  • D0...D3: Počet Arduino pinů, ke kterým jsou připojeny piny D0-D3
  • D4...D7: Počet pinů Arduino, ke kterým jsou připojeny piny D4-D7
  • col: počet sloupců implementovaných v zobrazení
  • řádek: počet řádků implementovaných na displeji
// 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:
  • col: počet sloupců implementovaných v zobrazení
  • řádek: počet řádků implementovaných na displeji
  • velikost: velikost znaku indikovaná konstantou:
    LCD_5x8DOTS (výchozí) nebo LCD_5x10DOTS
/* Pro sběrnici I2C: */ #include // Připojte knihovnu pro práci se sběrnicí I2C #include // Připojení knihovny pro práci s LCD displejem přes I2C sběrnici LiquidCrystal_I2C lcd(0x3F,20,4); // Deklarujte objekt knihovny s uvedením parametrů zobrazení (adresa I2C = 0x3F, počet sloupců = 20, počet řádků = 4) // void setup())( // lcd.init(); // Zahájení práce s the LCD display lcd.backlight ( // Zapnutí podsvícení LCD displeje... // Výstupní informace, které by se měly zobrazit při spuštění) // // void loop()() // ... //); Výstupní informace, které by se měly změnit podle algoritmu vašeho kódu) // /* Pro 4vodičovou paralelní sběrnici: */ #include // Připojení knihovny LiquidCrystal pro práci s LCD displejem LiquidCrystal lcd(2,3,4,5,6,7); // Deklarujte objekt knihovny s uvedením pinů displeje (RS, E, D4, D5, D6, D7) // Pokud je použito 8 vodičů datové sběrnice, zadejte (RS, E, D0, D1, D2, D3, D4 , D5, D6,D7) void setup())( // lcd.begin(16, 2); // Zahájení práce s LCD displejem s uvedením čísla (sloupce, řádky) ... // Výstup informací, které by měly zobrazí se při spuštění) / // void loop()() // ... // Výstupní informace, které by se měly změnit podle algoritmu vašeho kódu) //

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:
  • vlajka: true - zapne a false - vypne podsvícení.
Poznámka: Funkce je implementována pouze v knihovně LiquidCrystal_I2C.
/* Zobrazí zprávu pro sledování funkcí ovládání zobrazení: */ lcd.cursor(0,0); // Nastavte kurzor do horního rohu displeje (0 sloupec, 0 řádek) lcd.print("iarduino.ru"); // Zobrazte text "iarduino.ru" (první písmeno "i" bude na pozici "0.0" a poslední "u" na pozici "10.0", neviditelný kurzor na pozici "11.0")) // lcd.noDisplay (); // Vypnutí displeje (z displeje zmizí nápis) lcd.display(); // Zapnutí displeje (na stejném místě se na displeji objeví nápis) lcd.scrollDisplayLeft(); // Posun souřadnic sloupců doleva (na displeji se zobrazí "arduino.ru" bez prvního písmene "i", které překročí displej, ale zůstane v jeho RAM) lcd.scrollDisplayRight(); // Posune souřadnice sloupce doprava (na displeji se zobrazí "iarduino.ru" na stejném místě, kde bylo původně zobrazeno) lcd.clear(); // Vyčistěte displej (nápis z displeje nenávratně zmizí) lcd.noBacklight(); // Vypnutí podsvícení displeje lcd.backlight(); // Zapnutí podsvícení displeje lcd.setBacklight(0); // Vypnutí podsvícení displeje lcd.setBacklight(1); // Zapne podsvícení displeje

Funkce ovládání kurzoru:

setCursor( kol , řádek );
Umístí kurzor na zadanou pozici.
Parametr:
  • col:číslo sloupce (od 0).
  • řádek:číslo řádku (od 0)
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.
lcd.setCursor(0, 1); // Nastaví kurzor na první znak druhého řádku (číslování řádků a sloupců začíná od 0) lcd.home(); // Nastaví kurzor na první znak prvního řádku (jako při volání lcd.setCursor(0,0);) lcd.blink(); // Zviditelnění kurzoru (místo kurzoru bude blikat obdélník) lcd.noBlink(); // Zneviditelnění kurzoru (odstranění blikajícího obdélníku) lcd.cursor(); // Zviditelnění kurzoru (místo kurzoru se objeví podtržítko) lcd.noCursor(); // Zneviditelnění kurzoru (odstranění podtržítka) // Pokud kurzor narazí na místo, kde je znak, tento znak nezmizí

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)
lcd.leftToRight(); // Pokyn kurzoru, aby se posunul doprava (Jak je obvyklé v evropském psaní) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // Na displeji uvidíme: "ABC" (Po "A" se kurzor přesunul doprava a zobrazilo se "B", poté se kurzor přesunul doprava a zobrazilo se "C") lcd.rightToLeft(); // Řekněte kurzoru, aby se přesunul doleva (Stejně jako při psaní zprava doleva) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // Na displeji uvidíme: "CBA" (Po "A" se kurzor přesunul doleva a zobrazilo se "B", poté se kurzor přesunul doleva a zobrazilo se "C") lcd.noAutoscroll(); // Nastavení zarovnání doleva (Jako obvykle) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // Na displeji uvidíme: "ABC" (Jako obvykle) lcd.autoscroll(); // Nastaví zarovnání doprava (zobrazené souřadnice se posunou doleva o počet zobrazených znaků) lcd.clear(); lcd.setCursor(5,0); lcd.print("ABC"); // Na displeji uvidíme: "ABC" (Souřadnice zobrazení se posunou o 3 znaky doleva, protože po každém znaku je vyvolána funkce scrollDisplayLeft)

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:
  • číslo:číslo, pod kterým bude symbol napsán.
  • pole: pole představující znak, který má být zapsán.
Poznámka: Pole se skládá z několika bajtů, jejichž počet se rovná počtu řádků v symbolu. Každý nastavený bajtový bit odpovídá nastavenému (zobrazenému) znakovému pixelu.
tisknout(text);
Zobrazení textu, symbolů nebo čísel na displeji.
Parametr:
  • text: znak, číslo nebo řetězec, který se má zobrazit.
Poznámka: Syntaxe je podobná funkci třídy Serial se stejným názvem.
#zahrnout // Připojte knihovnu pro práci se sběrnicí I2C #include // Připojení knihovny pro práci s LCD displejem přes I2C sběrnici LiquidCrystal_I2C lcd(0x27,16,2); // Deklarace objektu knihovny s uvedením parametrů zobrazení (adresa I2C = 0x27, počet sloupců = 16, počet řádků = 2) // uint8_t symbol_d = (0b00000, // 1 řádek symbolu "d" 0b00000, / / 2. řádek znaku "d" " 0b00110, // 3. řádek znaku "d" 0b01010, // 4. řádek znaku "d" 0b01010, // 5. řádek znaku "d" 0b01010, // 6. řádek znaku "d" 0b11111, // 7. řádek znaku "d" " 0b10001); // 8. řádek symbolu "d" Celé pole lze zapsat na jeden řádek: uint8_t symbol_d=(0,0,6,10,10,10,31,17); // uint8_t symbol_i = (0b00000, // 1. řádek symbolu "and" 0b00000, // 2. řádek symbolu "and" 0b10001, // 3. řádek symbolu "and" 0b10011, // 4. řádek symbol "a" 0b10101, // 5. řádek symbolu "and" 0b11001, // 6. řádek symbolu "and" 0b10001, // 7. řádek symbolu "and" 0b00000); // 8. řádek symbolu "and" Celé pole lze zapsat na jeden řádek: uint8_t symbol_i=(0,0,17,19,21,25,17,0); void setup())( // lcd.init(); // Zahájení práce s LCD displejem lcd.backlight(); // Zapnutí podsvícení LCD displeje lcd.createChar(1,symbol_d); // Načíst první symbol do paměti displeje lcd .createChar(2,symbol_i); // Načtení druhého symbolu do paměti displeje lcd.clear( // Vymazání obrazovky lcd.setCursor(0,0); kurzor do horního rohu lcd.print("Pa\ 1\2o" // Výstup textu "Rádio" při psaní znaků "P", "a", "o" v latince, ) // a výstupu; znaky "d", "i" z paměti displeje s uvedením jejich čísel // void loop())( // lcd.setCursor(0,1); lcd.print(" "); // vymazání celého spodního řádku lcd.setCursor(0,1); lcd.print("arduino" // zobrazení textu "i" "arduino" "); ru" ve spodním řádku delay(2000); // počkejte 2 sekundy lcd.setCursor( 0,1); lcd.print(" "); // vymaže celý spodní řádek lcd.setCursor(0,1); lcd .print(12.345) // tisk čísla 12.34 (zobrazí se 2 desetinná místa) delay(2000) // čekání 2 sekundy lcd.setCursor(0,1); // vymazání celého spodního řádku lcd.setCursor(0,1); lcd.print(12, HEX); // zobrazí číslo 12 jako hexadecimální číslo delay(2000); // počkejte 2 sekundy lcd.setCursor(0,1); lcd.print(" "); // vymazání celého spodního řádku lcd.setCursor(0,1); lcd.print(1); // zobrazení čísla 1 delay(2000); // počkejte 2 sekundy)

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
Podívejme se na poslední dva body podrobněji.
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
Kde se vzalo zpoždění 2us?

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 #zahrnout void Write_Init_Command(uint8_t data) ( //nohy, kterými jsou příkazy/data přenášeny na výstup LCD_DDR |= DATA_BUS; //pošleme příkaz LCD_PORT &= ~(1<Vesele blikající kurzor znamená, že inicializace proběhla úspěšně. V

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.
Logická struktura řadiče HD44780 LCD

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ů:

DB7DB6DB5DB4DB3DB2DB1DB0Vý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/DSNastavení obrazovky a posunu kurzoru
0 0 0 0 1 DCBNastavení režimu zobrazení
0 0 0 1 S/CR/LPosun kurzoru nebo obrazovky v závislosti na bitech
0 0 1 D.L.NFVý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ÁTINZERÁTINZERÁTINZERÁTINZERÁTINZERÁTINZERÁTPř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:

  1. Zapněte displej.
  2. Vymazat obsah.
  3. Posuňte kurzor o jednu pozici.
  4. A napište tam "1".
Řešení (pořadí příkazů):

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.

  1. 001 11000 Bus 8 bitů, 2 linky
  2. 00000001 Čištění obrazovky
  3. 000001 10 Přírůstek adresy. Obrazovka se nehýbe
  1. 00001 100 Displej zapnutý (D=1)
  2. 00000001 Vymazal displej. Ukazatel je na DDRAM
  3. 0001 0100 Přesunul kurzor (S/C=0) doprava (R/L=1)
  4. 00110001 - data jsme již zaznamenali (RS pin = 1) kód “1” 0x31

Identifikátor týmu je zvýrazněn tučně, ale zbytek uvidíte v tabulce.

Ú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í:

  1. 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ů)
  2. 00000001 Toto je 8 bajtů dat. ( RS = 1)
  3. 0000001 0 Nakreslete ikonu blesku nebo
  4. 000001 00 runa SS Zig, jak si přejete
  5. 00001 Mám radši 000.
  6. 00011111 Nejvýznamnější tři bity nemají žádný vliv
  7. 0000001 0 Tam můžete napsat cokoliv, na
  8. 000001 00 neovlivní výsledek.
  9. 00001 000 Poslední bajt dat
  10. 1 0000000 A toto je příkaz - přepnutí adresy na DDRAM a ukazatel na adresu 0000000 — první znak v prvním řádku.
  11. 00000001 A znovu data ( RS = 1), kód 01 - sem dáváme zip.
Jejda a je na obrazovce!

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ů

  1. RS, RW, E - pro ukončení režimu.
  2. DB7..DB0 do vstupního režimu. Nemusíte se jich však dotýkat; později je předefinujeme.

Čekání na připravenost, čtení zaneprázdněné vlajky.
  1. RS=0 (příkaz)
  2. RW=1 (čtení)
  3. E=1 (připravte se!!!)
  4. Pauza (stačilo 14 cyklů procesoru při 8 MHz)
  5. E=0 (Pli!)
  6. Čtení z přístavu. Pokud je nastaven bit 7 (příznak Busy), pak vše opakujeme znovu, dokud není resetován.

Napište příkaz
  1. Čekání na připravenost
  2. RS=0 (příkaz)
  3. RW=0 (zápis)
  4. E=1 (připravte se!!!)
  5. Výstupní port
  6. Zadejte příkazový kód do portu
  7. Pauza
  8. E=0 (Pli!)
  9. Ramenní pistole Port pro vstup, jen pro případ.

Záznam dat
  1. Čekání na připravenost
  2. RS=1 (data)
  3. RW=0 (zápis)
  4. E=1 (připravte se!!!)
  5. Výstupní port
  6. Zadejte příkazový kód do portu
  7. Pauza
  8. E=0 (Pli!)
  9. Port pro vstup, pro každý případ.

Číst příkaz
  1. Čekání na připravenost
  2. Datový port pro vstup s pull-up (DDR=0, PORT=1)
  3. RS=0 (příkaz)
  4. RW=1 (čtení)
  5. Pauza
  6. Čtení dat z portu
  7. E=0 (A!)

Číst data
  1. Čekání na připravenost
  2. Datový port pro vstup s pull-up (DDR=0, PORT=1)
  3. RS=1 (data)
  4. RW=1 (čtení)
  5. E = 1 (Připravte se! V tuto chvíli jsou data z LCD odesílána na sběrnici)
  6. Pauza
  7. Čtení dat z portu
  8. 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:

  1. Pauza
  2. Seniorský zápisník byl odeslán do přístavu
  3. Pauza
  4. Pauza
  5. Mladší tetráda byla přivedena do přístavu

Čtení
  1. Pauza
  2. Čtení staršího zápisníku z portu
  3. Pauza
  4. Pauza
  5. Čtení nízké tetrády z přístavu

Počkejte na kód :) Již brzy :)
UPD: