Operácie

LCD displej s radičom HD44780: Rozdiel medzi revíziami

Z SensorWiki

(Pripojenie)
(38 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
 +
[[Súbor:lcd_automatMHD.jpg|200px|right]]
  
 
== Opis displeja ==
 
== Opis displeja ==
 +
 +
LCD displeje s radičom Hitachi HD44780<ref group="REF" name="hd44780">Hitachi [http://senzor.robotika.sk/mmp/HD44780.pdf HD44780U Dot Matrix Liquid Crystal Display Controller/Driver]. ADE-207-272(Z), Japan, 1999.</ref>  sa často sa používajú v kopírkach, priemyselných strojoch, automatoch, napríklad na lístky MHD v Bratislave. Sú to monochromatické alfanumerické displeje
 +
(nie grafické), ktoré sa vyrábajú s podsvietením v rozličných farebných kombináciach. Aj veľkosti displeja sú premenlivé, pohybujú sa od najmenších, ktoré majú len jeden riadok s ôsmimi znakmi
 +
(1 × 8) cez bežnejšie formáty 2 × 8, 2 × 16 až po 2 × 40, či dokonca 4 × 20 a 4 × 40. Okrem typov bez podsvietenia, ktoré majú vzadu odrazivú plochu a ich čitateľnosť závisí od osvetlenia okolia,
 +
sa vyrába väčšina s podsvietením, ktoré býva najčastejšie LED, ale vyskytuje sa napr. aj elektroluminiscenčné. Okrem LCD technológie sa vyskytujú aj displeje vyrobené technológiou OLED, ale ich
 +
radiče bývajú obvykle kompatibilné. My budeme používať displej s veľkosťou 16x2 typu 1602-A<ref group="REF">Character Module Datasheet [http://senzor.robotika.sk/mmp/CFAH1602B-Datasheet.pdf CFAH1602B]. Crystalfontz America, 2020.</ref> ale pod týmto označením sa predávajú displeje viacerých výrobcov.
 +
 +
Na pripojenie k mikropočítaču používajú alfanumerické LCD displeje rozhranie, ktoré pozostáva z troch riadiacich signálov a 8 dátových. Pre pripojenie sa však bežne používa len modifikované zapojenie so 4 datovými vodičmi. Okrem toho má displej dva vývody na napájanie podsvietenia a dva napájacie vývody pre samotný displej. Okrem toho je jeden vstup určený na ovládanie kontrastu displeja analógovým napätím. Ak je zle nastavený kontrast, na displeji vôbec nič nevidno a často je potom považovaný za poškodený.
  
  
Riadok 78: Riadok 87:
  
  
 +
== Pripojenie ==
 +
 +
Schéma zapojenia
 +
 +
<div style='text-align: center;'>
 +
[[Súbor:MIPS_lcdDemoSchema01.png|500px]]<BR>
 +
''Schéma pripojenia LCD displeja k procesoru.''
 +
</div>
 +
 +
Pokúste sa najprv pripojiť displej len podľa schémy zapojenia. Ak sa vám to nepodarí, alebo si chcete byť naistom,
 +
skontrolujte si zapojenie aj podľa zapojovacej schémy.
 +
<div style='text-align: center;'>
 +
[[Súbor:MIPS_lcdDemoSchema02.png|500px]]<BR>
 +
''Schéma pripojenia vodičov LCD displeja k procesoru.''
 +
</div>
 +
 +
 +
== Ovládcí program - demo ==
 +
 +
 +
To, či máte displej pripojený správne si môžete vyskúšať týmto demo programom, ktorý preložíte a nahráte buď priamo z AVR Studia, alebo jednoduchšiu verziu z prostredia Arduino.
 +
 +
<
 +
 +
 +
<tabs>
 +
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 +
/* Ukazkovy program pre LCD displej */
 +
 +
#include <avr/io.h>
 +
#include "lcd_ch.h"
 +
 +
#define LCD_CTRL_PORT DDRD
 +
#define LCD_DATA_PORT DDRB
 +
 +
#define LCD_RS_pin 2
 +
#define LCD_RW_pin 3
 +
#define LCD_EN_pin 4
 +
 +
#define LCD_D4_pin 1
 +
#define LCD_D5_pin 2
 +
#define LCD_D6_pin 3
 +
#define LCD_D7_pin 4
 +
 +
 +
int main(void)
 +
 +
 +
/* inicializacia portov - vstupy / vystupy */
 +
 +
DDRD |= (1<<LCD_EN_pin); // Pin D4 (Enable)  PORTD  output 
 +
DDRD |= (1<<LCD_RW_pin); // Pin D3 (RW)      PORTD  output 
 +
DDRD |= (1<<LCD_RS_pin); // Pin D2 (RS)      PORTD  output 
 +
 
 +
LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin); // Piny 1,2,3,4, PORTB ako output (Data pre display)
 +
 +
/* displej je spravne pripojeny, mozeme zacat inicializaciu podla datasheetu */
 +
 +
lcd_init();  // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c
 +
 +
/* po ukonceni inicializacie je displej zapnuty a ak posleme nejake data, tak
 +
  sa zacnu zobrazovat od prvej pozicie (riadok 0, stlpec 0)              */
 +
 +
 +
// zapišeme niekolko znakov do 1 riadku
 +
lcd_data('A'); // znak A zadany ako znakova konstanta
 +
lcd_data(' '); // znak MEDZERA zadany znakova konstanta
 +
lcd_data(0x68); // znak h zadany jeho ASCII kodom  (pozri tabulku)
 +
lcd_data('\x20'); // znak MEDZERA: zadany ako escape sequence
 +
lcd_data('o'); // znak o zadany ako znakova konstanta
 +
lcd_data(32); // znak MEDZERA zadany ASCII kodom v desiatkovej sustave
 +
lcd_data('j'); // znak j zadany ako znakova konstanta
 +
 +
    while(1);  /* stop here */ 
 +
 
 +
}
 +
</source></tab>
 +
<tab name="Arduino code"><source lang="arduino" style="background: #9dd1e1;">
 +
 +
#include <LiquidCrystal.h>
 +
// connection      RS R/W E D4 D5 D6 D7
 +
LiquidCrystal lcd ( 2,  3,4, 9,10,11,12);
 +
 +
// define some user characters
 +
byte smiley[8] = {
 +
  0b00000,
 +
  0b00000,
 +
  0b01010,
 +
  0b00000,
 +
  0b00000,
 +
  0b10001,
 +
  0b01110,
 +
  0b00000 };
 +
 +
byte step1[8] = {
 +
  0b01100, 0b01100, 0b00000, 0b01110,
 +
  0b11100, 0b01100, 0b11010, 0b10011};
 +
 +
byte step2[8] = {
 +
  0b01100, 0b01100, 0b00000, 0b01100,
 +
  0b01100, 0b01100, 0b1100,  0b01110};
 +
 +
void setup() {
 +
  lcd.begin(16, 2);    // init LCD + set number of columns and rows
 +
 +
  lcd.createChar(1, smiley);    // create a new characters
 +
  lcd.createChar(3, step1);
 +
  lcd.createChar(4, step2);
 +
 +
  lcd.setCursor(0, 0);          // set the cursor to the top left
 +
 +
  lcd.write(byte(1));          // smiley
 +
  lcd.print(" UAMT FEI STU ");  // normal text
 +
  lcd.write((byte)1);          // smiley
 +
}
 +
 +
void loop() {
 +
    lcd.setCursor(2, 1);        // set curspr to line 2 col 3
 +
    lcd.print("time: ");        // print the number of seconds since reset:
 +
    lcd.print(millis() / 1000);
 +
    lcd.setCursor(12, 1);
 +
    lcd.write(3);                // draw the little man
 +
    delay(300);
 +
    lcd.setCursor(12, 1);
 +
    lcd.write(4);
 +
    delay(300);
 +
}
 +
</source></tab>
 +
</tabs>
 +
 +
 +
Program pre AVR-GCC vyžaduje externé knižnice [http://senzor.robotika.sk/mmp/src/lcd_ch.h lcd_ch.h] a [http://senzor.robotika.sk/mmp/src/lcd_ch.c lcd_ch.c], ktoré si stiahnite odtiaľto
 +
http://senzor.robotika.sk/mmp/src/
  
 +
[http://senzor.robotika.sk/mmp/AVRstudioLibraries.pdf  Návod na inštaláciu knižníc].
 +
 +
Program pre Arduino vyžaduje zasa knižnicu  <code>LiquidCrystal.h</code> , ktorá by však mala byť už nainštalovaná.
 +
 +
Na displeji by sa vám mal zobraziť jednoduchý text, alebo text, počítadlo a jednoduchá animácia ako na obrázkoch nižšie
 +
 +
<div style='text-align: center;'>
 +
[[Súbor:MIPS_lcdDemoFoto1.jpg|500px]][[Súbor:MIPS_lcdDemoFoto.jpg|500px]]<BR>
 +
''Príklady programov po nahratí do procesora na pripojenom LCD displeji.''
 +
</div>
 +
 +
 +
'''Q: Čo s nepoužitými vstupmi?'''
 +
 +
'''A1:''' pripojiť na definovanú úroveň, najlepšie cez pull-up/pull-down rezistor.
 +
 +
'''A2:''' Keďže podľa datasheetu<ref group="REF"  name="hd44780"></ref> má riadiaci obvod Hitachi HD44780 zapojené pull-upy interne, tak nie sú potrebné.
 +
 +
'''A3:''' Keďže však nevieme, aký riadiaci čip je v skutočnosti použitý, pre istotu ich môžeme zapojiť.
 +
 +
 +
Vysvetlivky, prečo sú nezapojené vstupy nebezpečné:
 +
 +
Nezapojené (plávajúce) vstupy sú oveľa citlivejšie na ESD (elektrostatický výboj) a taktiež zvyšujú zbytočne spotrebu obvodu. Odporúča sa pripojenie cez tzv. pull-up odpor priamo na zem, prípadne aj bez odporu.
 +
Druhá možnosť, pripojenie na kladné napájacie napätie je tiež možná, ale v tomto prípade sa vynechanie pull-up rezistora neodporúča.
 +
 +
Toto je jeden z príkladov mnohých takýchto odporúčaní<ref group="REF">Murray Stewart: [https://www.nxp.com/docs/en/application-note/AN3393.pdf AN3393: MC9RS08KA Application Hints]. NxP/Freescale Semiconductor Application Note, 2007.</REF> priamo od firmy NxP:
 +
 +
{| style="padding:0 0.5em;"|
 +
| style="width:70%; vertical-align:top; border:1px solid #fad67d; background:#f3f0c6;"|
 +
<div style="border-bottom:1px solid #fad67d; background:#faecc8; padding:0.2em 0.5em; font-size:110%; font-weight:bold;">'''5.3 Line Termination and Pullup/Pulldown Resistors'''</div>
 +
<div style="border-bottom:1px solid #fad67d; padding:0.4em 1em 1em;">
 +
* Line termination and pullup/pulldown resistors may be required to guarantee voltage levels at high impedance or unused pins (do not tie directly to VDD/VSS)
 +
* Floating input pins may store intermediate voltage levels that would cause current drain on internal logic gates
 +
* Floating pins are also prone to pick up noise and suffer electrostatic discharge stress (ESD)
 +
|}
  
 
== Inštrukcie radiča LCD displeja ==
 
== Inštrukcie radiča LCD displeja ==
  
Inštrukčná sada radiča HD44780 je uvedená v nasledovnej tabuľke:<ref group="REF">Napriklad nejaka kniha, alebo datasheet</ref>
+
[[Súbor:HD44780foto.jpg|300px|right]]
 +
Okrem zobrazovania jednotlivých znakov dokážeme pomocou riadiacich príkazov <code>lcd_command()</code> ovládať spôsob zobrazenia, meniť aktuálnu polohu kurzora, ako aj to či vôbec bude kurzor zobrazený, alebo nie. Príkladom jednej z najjednoduchších inštrukcií je <code>0000 0001</code>, ktorým sa vymaže celý zobrazený obsah a kurzor sa vráti do počiatočenej pozície 0,0 - pozri prvý riadok v tabuľke nižšie.
 +
 
 +
V jazyku C sa dané inštrukcie dajú posielať pomocou príkazu  <code>lcd_command()</code>, ktorý máte definovaný v <code>lcd_ch.h</code>
 +
 
 +
Nasledovné inštrukcie ilustrujú využitie, pričom pre správne pochopenie by ste mali nahliadnuť aj do tabuľky nižšie.
 +
 
 +
<source lang="cpp">
 +
lcd_command(0x01);  /* Clear screen  - vid riadok 1 v tabulke */
 +
 
 +
lcd_command(0x02);  /* Cursor to home position - vid riadok 2 v tabulke */
 +
 
 +
</source>
 +
 
 +
Prípadne si to môžete zapísať aj prehľadnejšie pomocou už známych operácií s bitmi:
 +
 
 +
<source lang="cpp">
 +
#define LCD_CLR              0      /* DB0: clear display                  */
 +
#define LCD_HOME              1      /* DB1: return to home position        */
 +
 
 +
 
 +
lcd_command(1<<LCD_CLR);  /* Clear screen */
 +
lcd_command(1<<LCD_HOME);  /* Set cursor to home position */
 +
 
 +
</source>
 +
 
 +
Iným užitočným a často používaným príkazom je nastavenie aktuálnej pozície kurzora, teda miesto na displeji, kam sa bude vypisovať text. Je to vlastne nastavenie adresy DDRAM, pričom jednotlivé adresy zodpovedajú pozíciam na displeji podľa tejto tabuľky.
 +
 
 +
[[Súbor:MIPS_lcdAddressingDDRAM.png|800px]]
 +
 
 +
<source lang="cpp">
 +
// Nastavíme kurzor na 1. riadok pozicia 05 (6. v poradi)
 +
  lcd_command(0x80 + 5);        // 0b1000 0000 + 5
 +
 
 +
// Nastavíme kurzor na 2. riadok pozicia 05
 +
  lcd_command(0xC0 + 5); //  (0b1000 0000 + 0x40) + 5
 +
</source>
 +
 
 +
 
 +
=== Úloha ===
 +
 +
Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval kurzor. Požadovaný príkaz '''Cursor on/off (C)''' nájdete v tabuľke s inštrukciami.
 +
 
 +
 
 +
Kompletná inštrukčná sada radiča HD44780 je uvedená v nasledovnej tabuľke:<ref group="REF"  name="hd44780"></ref>
  
 
{|  border="1" cellpadding="5" cellspacing="0" align="center"
 
{|  border="1" cellpadding="5" cellspacing="0" align="center"
Riadok 242: Riadok 464:
  
 
'''Vysvetlivky:'''
 
'''Vysvetlivky:'''
CGRAM je pamäť tvarov špeciálnych znakov, ktoré si môže užívateľ nadefinovať sám (Character Generator RAM)<ref group="REF">Web source: [https://www.sparkfun.com/datasheets/LCD/HD44780.pdf HD44780U datasheet]</ref>   
+
CGRAM je pamäť tvarov špeciálnych znakov, ktoré si môže užívateľ nadefinovať sám (Character Generator RAM)<ref group="REF" name="hd44780"></ref>   
  
 
DDRAM je pamäť aktuálne zobrazených znakov (Display Data RAM). Každý zobrazený znak zodpovedá jednej pozícii v DDRAM. Prvý riadok má adresy od 0 po 39 pre 40 znakov a to aj vtedy, ak má displej v skutočnosti menej pozícií. Druhý riadok má pridelené adresy 64 až 103. Tretí riadok má potom vložené adresy 40 až 63 a štvrtý riadok 104 až 159.     
 
DDRAM je pamäť aktuálne zobrazených znakov (Display Data RAM). Každý zobrazený znak zodpovedá jednej pozícii v DDRAM. Prvý riadok má adresy od 0 po 39 pre 40 znakov a to aj vtedy, ak má displej v skutočnosti menej pozícií. Druhý riadok má pridelené adresy 64 až 103. Tretí riadok má potom vložené adresy 40 až 63 a štvrtý riadok 104 až 159.     
Riadok 248: Riadok 470:
 
Doba trvania (execution time) je stanovená pre oscilátor s frekvenciou 270 kHz. Avšak táto frekvencia záleží aj od napájacieho napätia a ďalších faktorov a môže sa pohybovať od 190 kHz po 350 kHz, takže ak nepoužívame bit BUSY ale pevné čakacie slučky, treba to zobrať do úvahy.
 
Doba trvania (execution time) je stanovená pre oscilátor s frekvenciou 270 kHz. Avšak táto frekvencia záleží aj od napájacieho napätia a ďalších faktorov a môže sa pohybovať od 190 kHz po 350 kHz, takže ak nepoužívame bit BUSY ale pevné čakacie slučky, treba to zobrať do úvahy.
  
== Pripojenie ==
+
== Výpis textových reťazcov ==
 +
 
 +
=== Úloha: ===
  
Schéma zapojenia
 
  
<div style='text-align: center;'>
+
Namiesto vypisovania textov po jednom znaku si naprogramujte vlastnú funkciu na výpis textového reťazca. Potom demonštrujte jej využitie tak, že na druhý riadok
[[Súbor:MIPS_lcdDemoSchema01.png|500px]]<BR>
+
displeja vypíšete svoje meno.  
''Schéma pripojenia LCD displeja k procesoru.''
 
</div>
 
  
Pokúste sa najprv pripojiť displej len podľa schémy zapojenia. Ak sa vám to nepodarí, alebo si chcete byť naistom,
+
<tabs>
skontrolujte si zapojenie aj podľa zapojovacej schémy.
+
<tab  name="AVR C"><source lang="cpp">
<div style='text-align: center;'>
 
[[Súbor:MIPS_lcdDemoSchema02.png|500px]]<BR>
 
''Schéma pripojenia vodoočov LCD displeja k procesoru.''
 
</div>
 
  
 +
void lcd_puts(const char *s);  /* deklaracia funkcie  */
  
To, či máte displej pripojený správne si môžete vyskúšať týmto demo programom, ktorý preložíte a nahráte z prostredia Arduino.  
+
void lcd_puts(const char *s)  /* definicia funkcie  */
 +
{
 +
  // sem pride vas vlastny kod...
 +
}
  
<tabs><tab name="Arduino">
 
<source lang="arduino">
 
#include <LiquidCrystal.h>
 
// connection      RS R/W E D4 D5 D6 D7
 
LiquidCrystal lcd ( 2,  3,4, 9,10,11,12);
 
  
// define some user characters
+
prikaz_na_presun_na_riadok2(); /* nahradte vlastnym prikazom */
byte smiley[8] = {
 
  0b00000,
 
  0b00000,
 
  0b01010,
 
  0b00000,
 
  0b00000,
 
  0b10001,
 
  0b01110,
 
  0b00000 };
 
  
byte step1[8] = {
+
lcd_puts("Meno Priezvisko");
  0b01100, 0b01100, 0b00000, 0b01110,
 
  0b11100, 0b01100, 0b11010, 0b10011};
 
  
byte step2[8] = {
+
</source></tab>
  0b01100, 0b01100, 0b00000, 0b01100,
+
</tabs>
  0b01100, 0b01100, 0b1100,  0b01110};
 
  
void setup() {
+
Často však potrebujeme vypisovať aj hodnoty premenných a náročnejšie formátované výstupy. Ak vám chýba funkcia <code>printf()</code> s jej rozsiahlymi formátovacími možnosťami, oceníte ukážku využitia pomocou jej sesterskej funkcie <code>sprintf()</code>, ktorá vám pripraví požadovaný reťazec na výstup.
  lcd.begin(16, 2);    // init LCD + set number of columns and rows
+
<tabs>
 +
<tab  name="AVR C"><source lang="cpp">
  
  lcd.createChar(1, smiley);    // create a new characters
+
/* zadefinujeme pole znakov, t.j. reťazec dlhý ako je riadok na displeji
  lcd.createChar(3, step1);
+
* t.j. 16 plus jeden naviac na ukončovací znak reťazca \0                      */
  lcd.createChar(4, step2);
 
  
  lcd.setCursor(0, 0);          // set the cursor to the top left
+
              // 01234567890123456 +1 na koniec retazca
 +
char riadok[]= {"                "};
  
  lcd.write(byte(1));          // smiley
+
int value = 42;  // premenná, ktorej hodnotu by sme chceli zobraziť na LCD
  lcd.print(" UAMT FEI STU "); // normal text
 
   lcd.write((byte)1);          // smiley
 
}
 
  
void loop() {
+
sprintf(riadok,"Dec %d = %03X Hex",value,value); // Zobrazíme ju 2x: raz desiatkovo a potom hexa
    lcd.setCursor(2, 1);        // set curspr to line 2 col 3
 
    lcd.print("time: ");        // print the number of seconds since reset:
 
    lcd.print(millis() / 1000);
 
    lcd.setCursor(12, 1);
 
    lcd.write(3);                // draw the little man
 
    delay(delayTime);
 
    lcd.setCursor(12, 1);
 
    lcd.write(4);
 
    delay(delayTime);
 
}
 
</source></tab>
 
<tab  name="AVR C"><source lang="cpp">
 
  
ToDo
+
lcd_puts(riadok);
  
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Na displeji by sa vám mal zobraziť text, počítadlo a jednoduchá animácia ako na obrázku
+
== Vytváranie vlastných znakov ==
 +
 
 +
Displej (resp. jeho radič HD44780) okrem iného obsahuje aj malú pamäť vyhradenú na užívateľom vytvorené znaky. Môže ich byť max. 8 a prístupné sú ako znaky s ASCII kódmi 0x00 až 0x08.
 +
S prvým zo znakov, ktorého kód je 0x00 je trocha problém, pretože aj reťazce v jazyku C používajú tento znak ako príznak konca reťazca. Znaky sa vytvárajú v matici 5x8 a ukladajú sa po riadkoch do pamäti CGRAM ('''C'''haracter '''G'''enerator RAM) a mapujú sa na pozície 0-8 v DD RAM ('''D'''isplay  '''D'''ata RAM), alebo zrkadlene na adresy 9-F.
 +
 
 +
Vytváranie znakov ilustruje nasledovný obrázok. Keďže na hodnote najvyšších troch bitov nezáleží, budeme uvažovať s nulou.
 +
 
 +
[[Súbor:MIPS_LCD_CGRAM.png]]
 +
 
 +
 
 +
 
 +
=== Úloha: ===
 +
 
 +
Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.
  
<div style='text-align: center;'>
+
<tabs>
[[Súbor:MIPS_lcdDemoFoto.jpg|500px]]<BR>
+
<tab  name="AVR C"><source lang="cpp">
''Schéma pripojenia vodoočov LCD displeja k procesoru.''
+
 
</div>
+
// vytvorenie specialneho znaku, ulozeny v IRAM, potom ho ulozime do CGRAM
 +
 
 +
unsigned char Znak_SC[8]= {0x1A,0x1D,0x04,0x04,0x04,0x05,0x02,0};// st.C
  
 +
// zapis specialneho znaku do CGRAM  na poziciu 4
 +
def_znak( Znak_SC,4);// supen Celzia
  
'''Q: Čo s nepoužitými vstupmi?'''
+
lcd_data(0x04); // znak zadany priamo kodom
  
'''A1:''' pripojiť na definovanú úroveň, najlepšie cez pull-up/pull-down rezistor.
+
alebo ako súčasť reťazca
 +
        // 0123456789012345 
 +
lcd_puts("Teplota: 37\x04");
  
'''A2:''' Keďže podľa datasheetu<ref group="REF">Hitachi [http://senzor.robotika.sk/mmp/HD44780.pdf HD44780U Dot Matrix Liquid Crystal Display Controller/Driver]. ADE-207-272(Z), Japan, 1999.</ref> má riadiaci obvod Hitachi HD44780 zapojené pull-upy interne, tak nie sú potrebné.
+
</source></tab>
 +
</tabs>
  
'''A3:''' Keďže však nevieme, aký riadiaci čip je v skutočnosti použitý, pre istotu ich môžeme zapojiť.
+
== Zoznam úloh na odovzdanie ==
  
 +
* Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval  kurzor.
 +
* Naprogramujte vlastnú funkciu na výpis textového reťazca. Demonštrujte jej využitie tak, že na druhý riadok displeja vypíšete svoje meno.
 +
* Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.
  
Vysvetlivky, prečo sú nezapojené vstupy nebezpečné:
 
  
Nezapojené (plávajúce) vstupy sú oveľa citlivejšie na ESD (elektrostatický výboj) a taktiež zvyšujú zbytočne spotrebu obvodu. Odporúča sa pripojenie cez tzv. pull-up odpor priamo na zem, prípadne aj bez odporu.
+
== Zoznam bonusových úloh  ==
Druhá možnosť, pripojenie na kladné napájacie napätie je tiež možná, ale v tomto prípade sa vynechanie pull-up rezistora neodporúča.
 
  
Toto je jeden z príkladov mnohých takýchto odporúčaní<ref group="REF">Murray Stewart: [https://www.nxp.com/docs/en/application-note/AN3393.pdf AN3393: MC9RS08KA Application Hints]. NxP/Freescale Semiconductor Application Note, 2007.</REF> priamo od firmy NxP:
+
# Funkcia <code>lcd_init()</code> nie je napísaná optimálne. Ak sa dá napísať efektívnejšie, uveďte čo a ako pozmeníte.
 +
# Pripravená knižnica netestuje príznak BF (busy flag). Namiesto testu bitu BF registra AC funkcia busy_flag len počká cca 1ms (čas ktorý väčšine príkazov displeja vyhovuje). Upravte túto funkciu tak, aby testovala príznak BF registra AC.
 +
# Zadefinujte vlastný špeciálny znak (znak s diakritikou) na pozíciu 0 (nula) CGRAM a zobrazte ako súčasť formátovaného príkazu do druhého riadku.
 +
# Pripojte k mikropočítaču dve tlačítka, pomocou ktorých budete text na displeji posúvať vľavo a vpravo.
  
{| style="padding:0 0.5em;"|
+
== '''Literatúra''' ==
| style="width:70%; vertical-align:top; border:1px solid #fad67d; background:#f3f0c6;"|
 
<div style="border-bottom:1px solid #fad67d; background:#faecc8; padding:0.2em 0.5em; font-size:110%; font-weight:bold;">'''5.3 Line Termination and Pullup/Pulldown Resistors'''</div>
 
<div style="border-bottom:1px solid #fad67d; padding:0.4em 1em 1em;">
 
* Line termination and pullup/pulldown resistors may be required to guarantee voltage levels at high impedance or unused pins (do not tie directly to VDD/VSS)
 
* Floating input pins may store intermediate voltage levels that would cause current drain on internal logic gates
 
* Floating pins are also prone to pick up noise and suffer electrostatic discharge stress (ESD)
 
|}
 
  
 +
Možnosti LCD displejov s radičom HD44780 a kompatibilných je oveľa viac a preto vám isto príde vhod nasledujúci zoznam literatúry a odkazov.
 +
Ako zaujímavosť navyše pridávame aj originálny manuál<ref group="REF">[http://senzor.robotika.sk/mmp/HD44780_v1985.pdf LCD Driver Data Book]. Hitachi, 1985</ref> k radiču od firmy Hitachi z roku 1980.
  
'''Literatúra'''
 
 
<references group="REF"/>
 
<references group="REF"/>
  
 +
<BR><BR>
  
 +
=== '''Odkazy''' ===
  
'''Odkazy'''
+
* [http://senzor.robotika.sk/mmp/MIPS-LCD-i2cDemo.zip Fungujúci projekt aj s knižnicami pre LCD displej s i2c modulom]
* Datasheets
+
* Tinkercad model s LCD displejom a demo programom https://www.tinkercad.com/things/iO56bA1E68T-copy-of-lcd/editel?sharecode=vmfhh-3g1G2NVAtB_BFJZQtqwN3hdpEsSGQGGtChMDc
** Basic LCD Datasheet (PDF)
+
* '''Generátor vlastných znakov'''
** HD44780 (PDF)
 
** Wikipedia o HD44780 https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller
 
* Generátor vlastných znakov
 
 
** Online [https://www.quinapalus.com/hd44780udg.html Custom Character Generator]
 
** Online [https://www.quinapalus.com/hd44780udg.html Custom Character Generator]
 
** https://maxpromer.github.io/LCD-Character-Creator/
 
** https://maxpromer.github.io/LCD-Character-Creator/
* Arduino Reference [http://arduino.cc/en/Reference/LiquidCrystal Library: LiquidCrystal]
+
* '''Arduino''' Reference [http://arduino.cc/en/Reference/LiquidCrystal Library: LiquidCrystal]
* Kniznice lcd.c a lcd.h od P. Fleuryho https://github.com/damadmai/pfleury
+
* Knižnice lcd.c a lcd.h od P. Fleuryho https://github.com/damadmai/pfleury
* Tinkercad model s LCD displejom a demo programom https://www.tinkercad.com/things/iO56bA1E68T-copy-of-lcd/editel?sharecode=vmfhh-3g1G2NVAtB_BFJZQtqwN3hdpEsSGQGGtChMDc
+
* Veľmi pekne spracovaný návod na prácu s displejom https://lastminuteengineers.com/arduino-1602-character-lcd-tutorial/
 +
* Wikipedia o HD44780 https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller
  
  
 
[[Category:AVR]][[Category:MIPS]]
 
[[Category:AVR]][[Category:MIPS]]

Verzia zo dňa a času 22:12, 11. marec 2021

Lcd automatMHD.jpg

Opis displeja

LCD displeje s radičom Hitachi HD44780[REF 1] sa často sa používajú v kopírkach, priemyselných strojoch, automatoch, napríklad na lístky MHD v Bratislave. Sú to monochromatické alfanumerické displeje (nie grafické), ktoré sa vyrábajú s podsvietením v rozličných farebných kombináciach. Aj veľkosti displeja sú premenlivé, pohybujú sa od najmenších, ktoré majú len jeden riadok s ôsmimi znakmi (1 × 8) cez bežnejšie formáty 2 × 8, 2 × 16 až po 2 × 40, či dokonca 4 × 20 a 4 × 40. Okrem typov bez podsvietenia, ktoré majú vzadu odrazivú plochu a ich čitateľnosť závisí od osvetlenia okolia, sa vyrába väčšina s podsvietením, ktoré býva najčastejšie LED, ale vyskytuje sa napr. aj elektroluminiscenčné. Okrem LCD technológie sa vyskytujú aj displeje vyrobené technológiou OLED, ale ich radiče bývajú obvykle kompatibilné. My budeme používať displej s veľkosťou 16x2 typu 1602-A[REF 2] ale pod týmto označením sa predávajú displeje viacerých výrobcov.

Na pripojenie k mikropočítaču používajú alfanumerické LCD displeje rozhranie, ktoré pozostáva z troch riadiacich signálov a 8 dátových. Pre pripojenie sa však bežne používa len modifikované zapojenie so 4 datovými vodičmi. Okrem toho má displej dva vývody na napájanie podsvietenia a dva napájacie vývody pre samotný displej. Okrem toho je jeden vstup určený na ovládanie kontrastu displeja analógovým napätím. Ak je zle nastavený kontrast, na displeji vôbec nič nevidno a často je potom považovaný za poškodený.


HD44780pinout.png


1 GND Ground, zem
2 Vcc Napájanie, typ. +5V
3 Vo Nastavenie kontrastu, 0 < Vo < Vcc
4 RS Register Select, výber registra - Command RS=0 alebo Data RS=1
5 R/W Read/Write 0: Write, 1: Read (zriedkavo používaný)
6 E Enable - aktivačný signál, aktívna je dobežná hrana
7 D0 Data bit D0
8 D1 Data bit D1
9 D2 Data bit D2
10 D3 Data bit D3
11 D4 Data bit D4 (používa sa v 4-bitovom zapojení)
12 D5 Data bit D5 (používa sa v 4-bitovom zapojení)
13 D6 Data bit D6 (používa sa v 4-bitovom zapojení)
14 D7 Data bit D7 (poižíva sa v 4-bitovom zapojení)
15 A+ Podsvietenie - anóda
16 K-
Podsvietenie - katóda









Pripojenie

Schéma zapojenia

MIPS lcdDemoSchema01.png
Schéma pripojenia LCD displeja k procesoru.

Pokúste sa najprv pripojiť displej len podľa schémy zapojenia. Ak sa vám to nepodarí, alebo si chcete byť naistom, skontrolujte si zapojenie aj podľa zapojovacej schémy.

MIPS lcdDemoSchema02.png
Schéma pripojenia vodičov LCD displeja k procesoru.


Ovládcí program - demo

To, či máte displej pripojený správne si môžete vyskúšať týmto demo programom, ktorý preložíte a nahráte buď priamo z AVR Studia, alebo jednoduchšiu verziu z prostredia Arduino.

<


/* Ukazkovy program pre LCD displej */

#include <avr/io.h>
#include "lcd_ch.h"

#define LCD_CTRL_PORT DDRD
#define LCD_DATA_PORT DDRB

#define LCD_RS_pin 2
#define LCD_RW_pin 3
#define LCD_EN_pin 4

#define LCD_D4_pin 1
#define LCD_D5_pin 2
#define LCD_D6_pin 3
#define LCD_D7_pin 4


int main(void) 
{  
	
	/* inicializacia portov - vstupy / vystupy */
	
	DDRD |= (1<<LCD_EN_pin);	// Pin D4 (Enable)  PORTD  output  
	DDRD |= (1<<LCD_RW_pin);	// Pin D3 (RW)      PORTD  output  
	DDRD |= (1<<LCD_RS_pin);	// Pin D2 (RS)      PORTD  output  
  
	LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin);	// Piny 1,2,3,4, PORTB ako output (Data pre display)
	
	/* displej je spravne pripojeny, mozeme zacat inicializaciu podla datasheetu */
	
	lcd_init();  // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c

	/* po ukonceni inicializacie je displej zapnuty a ak posleme nejake data, tak 
	   sa zacnu zobrazovat od prvej pozicie (riadok 0, stlpec 0)               */
	
		
	// zapišeme niekolko znakov do 1 riadku
	lcd_data('A');		// znak A zadany ako znakova konstanta
	lcd_data(' ');		// znak MEDZERA zadany znakova konstanta
	lcd_data(0x68);		// znak h zadany jeho ASCII kodom  (pozri tabulku)
	lcd_data('\x20');	// znak MEDZERA: zadany ako escape sequence
	lcd_data('o');		// znak o zadany ako znakova konstanta
	lcd_data(32);		// znak MEDZERA zadany ASCII kodom v desiatkovej sustave
	lcd_data('j');		// znak j zadany ako znakova konstanta
		
    while(1);   /* stop here */   
   
}
#include <LiquidCrystal.h>
// connection      RS R/W E D4 D5 D6 D7
LiquidCrystal lcd ( 2,  3,4, 9,10,11,12);

// define some user characters
byte smiley[8] = {
  0b00000,
  0b00000,
  0b01010,
  0b00000,
  0b00000,
  0b10001,
  0b01110,
  0b00000 };

byte step1[8] = {
  0b01100, 0b01100, 0b00000, 0b01110,
  0b11100, 0b01100, 0b11010, 0b10011};

byte step2[8] = {
  0b01100, 0b01100, 0b00000, 0b01100,
  0b01100, 0b01100, 0b1100,  0b01110};

void setup() {
  lcd.begin(16, 2);    // init LCD + set number of columns and rows

  lcd.createChar(1, smiley);    // create a new characters
  lcd.createChar(3, step1);
  lcd.createChar(4, step2);

  lcd.setCursor(0, 0);          // set the cursor to the top left

  lcd.write(byte(1));           // smiley
  lcd.print(" UAMT FEI STU ");  // normal text
  lcd.write((byte)1);           // smiley 
}

void loop() {
    lcd.setCursor(2, 1);         // set curspr to line 2 col 3
    lcd.print("time: ");         // print the number of seconds since reset:
    lcd.print(millis() / 1000);
    lcd.setCursor(12, 1);
    lcd.write(3);                // draw the little man
    delay(300);
    lcd.setCursor(12, 1);
    lcd.write(4);
    delay(300);
}


Program pre AVR-GCC vyžaduje externé knižnice lcd_ch.h a lcd_ch.c, ktoré si stiahnite odtiaľto http://senzor.robotika.sk/mmp/src/

Návod na inštaláciu knižníc.

Program pre Arduino vyžaduje zasa knižnicu LiquidCrystal.h , ktorá by však mala byť už nainštalovaná.

Na displeji by sa vám mal zobraziť jednoduchý text, alebo text, počítadlo a jednoduchá animácia ako na obrázkoch nižšie

MIPS lcdDemoFoto1.jpgMIPS lcdDemoFoto.jpg
Príklady programov po nahratí do procesora na pripojenom LCD displeji.


Q: Čo s nepoužitými vstupmi?

A1: pripojiť na definovanú úroveň, najlepšie cez pull-up/pull-down rezistor.

A2: Keďže podľa datasheetu[REF 1] má riadiaci obvod Hitachi HD44780 zapojené pull-upy interne, tak nie sú potrebné.

A3: Keďže však nevieme, aký riadiaci čip je v skutočnosti použitý, pre istotu ich môžeme zapojiť.


Vysvetlivky, prečo sú nezapojené vstupy nebezpečné:

Nezapojené (plávajúce) vstupy sú oveľa citlivejšie na ESD (elektrostatický výboj) a taktiež zvyšujú zbytočne spotrebu obvodu. Odporúča sa pripojenie cez tzv. pull-up odpor priamo na zem, prípadne aj bez odporu. Druhá možnosť, pripojenie na kladné napájacie napätie je tiež možná, ale v tomto prípade sa vynechanie pull-up rezistora neodporúča.

Toto je jeden z príkladov mnohých takýchto odporúčaní[REF 3] priamo od firmy NxP:

5.3 Line Termination and Pullup/Pulldown Resistors
  • Line termination and pullup/pulldown resistors may be required to guarantee voltage levels at high impedance or unused pins (do not tie directly to VDD/VSS)
  • Floating input pins may store intermediate voltage levels that would cause current drain on internal logic gates
  • Floating pins are also prone to pick up noise and suffer electrostatic discharge stress (ESD)

Inštrukcie radiča LCD displeja

HD44780foto.jpg

Okrem zobrazovania jednotlivých znakov dokážeme pomocou riadiacich príkazov lcd_command() ovládať spôsob zobrazenia, meniť aktuálnu polohu kurzora, ako aj to či vôbec bude kurzor zobrazený, alebo nie. Príkladom jednej z najjednoduchších inštrukcií je 0000 0001, ktorým sa vymaže celý zobrazený obsah a kurzor sa vráti do počiatočenej pozície 0,0 - pozri prvý riadok v tabuľke nižšie.

V jazyku C sa dané inštrukcie dajú posielať pomocou príkazu lcd_command(), ktorý máte definovaný v lcd_ch.h

Nasledovné inštrukcie ilustrujú využitie, pričom pre správne pochopenie by ste mali nahliadnuť aj do tabuľky nižšie.

 lcd_command(0x01);   /* Clear screen  - vid riadok 1 v tabulke */

 lcd_command(0x02);   /* Cursor to home position - vid riadok 2 v tabulke */

Prípadne si to môžete zapísať aj prehľadnejšie pomocou už známych operácií s bitmi:

#define LCD_CLR               0      /* DB0: clear display                  */
#define LCD_HOME              1      /* DB1: return to home position        */


 lcd_command(1<<LCD_CLR);   /* Clear screen */
 lcd_command(1<<LCD_HOME);  /* Set cursor to home position */

Iným užitočným a často používaným príkazom je nastavenie aktuálnej pozície kurzora, teda miesto na displeji, kam sa bude vypisovať text. Je to vlastne nastavenie adresy DDRAM, pričom jednotlivé adresy zodpovedajú pozíciam na displeji podľa tejto tabuľky.

MIPS lcdAddressingDDRAM.png

// Nastavíme kurzor na 1. riadok pozicia 05 (6. v poradi)
   lcd_command(0x80 + 5);        // 0b1000 0000 + 5

// Nastavíme kurzor na 2. riadok pozicia 05 
   lcd_command(0xC0 + 5);	//  (0b1000 0000 + 0x40) + 5


Úloha

Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval kurzor. Požadovaný príkaz Cursor on/off (C) nájdete v tabuľke s inštrukciami.


Kompletná inštrukčná sada radiča HD44780 je uvedená v nasledovnej tabuľke:[REF 1]

HD44780U based instruction set
Instruction Code Description Execution
time (max)
(when fcp = 270 kHz)
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
Clear display 0 0 0 0 0 0 0 0 0 1 Clears display and returns cursor to the home position (address 0). 1.52 ms
Cursor home 0 0 0 0 0 0 0 0 1 * Returns cursor to home position. Also returns display being shifted to the original position. DDRAM content remains unchanged. 1.52 ms
Entry mode set 0 0 0 0 0 0 0 1 I/D S Sets cursor move direction (I/D); specifies to shift the display (S). These operations are performed during data read/write. 37 μs
Display on/off control 0 0 0 0 0 0 1 D C B Sets on/off of all display (D), cursor on/off (C), and blink of cursor position character (B). 37 μs
Cursor/display shift 0 0 0 0 0 1 S/C R/L * * Sets cursor-move or display-shift (S/C), shift direction (R/L). DDRAM content remains unchanged. 37 μs
Function set 0 0 0 0 1 DL N F * * Sets interface data length (DL), number of display line (N), and character font (F). 37 μs
Set CGRAM address 0 0 0 1 CGRAM address Sets the CGRAM address. CGRAM data are sent and received after this setting. 37 μs
Set DDRAM address 0 0 1 DDRAM address Sets the DDRAM address. DDRAM data are sent and received after this setting. 37 μs
Read busy flag &
address counter
0 1 BF CGRAM/DDRAM address Reads busy flag (BF) indicating internal operation being performed and reads CGRAM or DDRAM address counter contents (depending on previous instruction). 0 μs
Write CGRAM or
DDRAM
1 0 Write Data Write data to CGRAM or DDRAM. 37 μs
Read from CG/DDRAM 1 1 Read Data Read data from CGRAM or DDRAM. 37 μs
Instruction bit names —

I/D - 0 = decrement cursor position, 1 = increment cursor position; S - 0 = no display shift, 1 = display shift; D - 0 = display off, 1 = display on; C - 0 = cursor off, 1 = cursor on; B - 0 = cursor blink off, 1 = cursor blink on ; S/C - 0 = move cursor, 1 = shift display; R/L - 0 = shift left, 1 = shift right; DL - 0 = 4-bit interface, 1 = 8-bit interface; N - 0 = 1/8 or 1/11 duty (1 line), 1 = 1/16 duty (2 lines); F - 0 = 5×8 dots, 1 = 5×10 dots; BF - 0 = can accept instruction, 1 = internal operation in progress.


Vysvetlivky: CGRAM je pamäť tvarov špeciálnych znakov, ktoré si môže užívateľ nadefinovať sám (Character Generator RAM)[REF 1]

DDRAM je pamäť aktuálne zobrazených znakov (Display Data RAM). Každý zobrazený znak zodpovedá jednej pozícii v DDRAM. Prvý riadok má adresy od 0 po 39 pre 40 znakov a to aj vtedy, ak má displej v skutočnosti menej pozícií. Druhý riadok má pridelené adresy 64 až 103. Tretí riadok má potom vložené adresy 40 až 63 a štvrtý riadok 104 až 159.

Doba trvania (execution time) je stanovená pre oscilátor s frekvenciou 270 kHz. Avšak táto frekvencia záleží aj od napájacieho napätia a ďalších faktorov a môže sa pohybovať od 190 kHz po 350 kHz, takže ak nepoužívame bit BUSY ale pevné čakacie slučky, treba to zobrať do úvahy.

Výpis textových reťazcov

Úloha:

Namiesto vypisovania textov po jednom znaku si naprogramujte vlastnú funkciu na výpis textového reťazca. Potom demonštrujte jej využitie tak, že na druhý riadok displeja vypíšete svoje meno.

 void lcd_puts(const char *s);  /* deklaracia funkcie  */

 void lcd_puts(const char *s)   /* definicia funkcie   */
{
  // sem pride vas vlastny kod...
}


 prikaz_na_presun_na_riadok2();	/* nahradte vlastnym prikazom */

 lcd_puts("Meno Priezvisko");

Často však potrebujeme vypisovať aj hodnoty premenných a náročnejšie formátované výstupy. Ak vám chýba funkcia printf() s jej rozsiahlymi formátovacími možnosťami, oceníte ukážku využitia pomocou jej sesterskej funkcie sprintf(), ktorá vám pripraví požadovaný reťazec na výstup.

/* zadefinujeme pole znakov, t.j. reťazec dlhý ako je riadok na displeji 
 * t.j. 16 plus jeden naviac na ukončovací znak reťazca \0                      */

              // 01234567890123456 +1 na koniec retazca
char riadok[]= {"                "};	

int value = 42;   // premenná, ktorej hodnotu by sme chceli zobraziť na LCD

sprintf(riadok,"Dec %d = %03X Hex",value,value); // Zobrazíme ju 2x: raz desiatkovo a potom hexa

lcd_puts(riadok);

Vytváranie vlastných znakov

Displej (resp. jeho radič HD44780) okrem iného obsahuje aj malú pamäť vyhradenú na užívateľom vytvorené znaky. Môže ich byť max. 8 a prístupné sú ako znaky s ASCII kódmi 0x00 až 0x08. S prvým zo znakov, ktorého kód je 0x00 je trocha problém, pretože aj reťazce v jazyku C používajú tento znak ako príznak konca reťazca. Znaky sa vytvárajú v matici 5x8 a ukladajú sa po riadkoch do pamäti CGRAM (Character Generator RAM) a mapujú sa na pozície 0-8 v DD RAM (Display Data RAM), alebo zrkadlene na adresy 9-F.

Vytváranie znakov ilustruje nasledovný obrázok. Keďže na hodnote najvyšších troch bitov nezáleží, budeme uvažovať s nulou.

MIPS LCD CGRAM.png


Úloha:

Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.

// vytvorenie specialneho znaku, ulozeny v IRAM, potom ho ulozime do CGRAM

 unsigned char Znak_SC[8]= {0x1A,0x1D,0x04,0x04,0x04,0x05,0x02,0};// st.C	

// zapis specialneho znaku do CGRAM  na poziciu 4 
 def_znak( Znak_SC,4);// supen Celzia

 lcd_data(0x04);		// znak zadany priamo kodom 

alebo ako súčasť reťazca
        // 0123456789012345  
 lcd_puts("Teplota: 37\x04");

Zoznam úloh na odovzdanie

  • Upravte vzorový program tak, aby sa na zobrazovanej pozícii nezobrazoval kurzor.
  • Naprogramujte vlastnú funkciu na výpis textového reťazca. Demonštrujte jej využitie tak, že na druhý riadok displeja vypíšete svoje meno.
  • Vypíšte na displej teplotu v stupňoch Celzia a svoje meno alebo iné slovo s diakritikou.


Zoznam bonusových úloh

  1. Funkcia lcd_init() nie je napísaná optimálne. Ak sa dá napísať efektívnejšie, uveďte čo a ako pozmeníte.
  2. Pripravená knižnica netestuje príznak BF (busy flag). Namiesto testu bitu BF registra AC funkcia busy_flag len počká cca 1ms (čas ktorý väčšine príkazov displeja vyhovuje). Upravte túto funkciu tak, aby testovala príznak BF registra AC.
  3. Zadefinujte vlastný špeciálny znak (znak s diakritikou) na pozíciu 0 (nula) CGRAM a zobrazte ako súčasť formátovaného príkazu do druhého riadku.
  4. Pripojte k mikropočítaču dve tlačítka, pomocou ktorých budete text na displeji posúvať vľavo a vpravo.

Literatúra

Možnosti LCD displejov s radičom HD44780 a kompatibilných je oveľa viac a preto vám isto príde vhod nasledujúci zoznam literatúry a odkazov. Ako zaujímavosť navyše pridávame aj originálny manuál[REF 4] k radiču od firmy Hitachi z roku 1980.

  1. 1,0 1,1 1,2 1,3 Hitachi HD44780U Dot Matrix Liquid Crystal Display Controller/Driver. ADE-207-272(Z), Japan, 1999.
  2. Character Module Datasheet CFAH1602B. Crystalfontz America, 2020.
  3. Murray Stewart: AN3393: MC9RS08KA Application Hints. NxP/Freescale Semiconductor Application Note, 2007.
  4. LCD Driver Data Book. Hitachi, 1985



Odkazy