<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title> LCD2L4P01A </title>
    <meta name="keywords" content="stavebnice MLAB modul LCD displeje LCD2L4P01A">
    <meta name="description" content="Projekt MLAB, Modul LCD displeje">
    <!-- AUTOINCLUDE START "Page/Head.cs.ihtml" DO NOT REMOVE -->
    <link rel="StyleSheet" href="../../../../../Web/CSS/MLAB.css" type="text/css" title="MLAB základní styl">
    <link rel="shortcut icon" type="image/x-icon" href="../../../../../Web/PIC/MLAB.ico">
    <script type="text/javascript" src="../../../../../Web/JS/MLAB_Menu.js"></script>
    <!-- AUTOINCLUDE END -->
  </head>

  <body lang="cs">

    <!-- AUTOINCLUDE START "Page/Header.cs.ihtml" DO NOT REMOVE -->
    <!-- ============== HLAVICKA ============== -->
    <div class="Header">
      <script type="text/javascript">
      <!--
        SetRelativePath("../../../../../");
        DrawHeader();
      // -->
      </script>
      <noscript>
        <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
      </noscript>
    </div>
    <!-- AUTOINCLUDE END -->

    <!-- AUTOINCLUDE START "Page/Menu.cs.ihtml" DO NOT REMOVE -->
    <!-- ============== MENU ============== -->
    <div class="Menu">
      <script type="text/javascript">
      <!--
        SetRelativePath("../../../../../");
        DrawMenu();
      // -->
      </script>
      <noscript>
        <p><b> Pro zobrazení (vložení) menu je potřeba JavaScript </b></p>
      </noscript>
    </div>
    <!-- AUTOINCLUDE END -->

    <!-- ============== TEXT ============== -->
    <div class="Text">
      <p class="Title">
        Modul LCD displeje se čtyřmi tlačítky
      </p>
      <p class=Autor>
        Milan Horkel
      </p>
      <p class="Subtitle">
        Modul LCD2L4P obsahuje dvouřádkový LCD displej s obvyklým Hitachi
        řadičem a čtveřici tlačítek. Používá se jako univerzální uživatelský
        interfejs při pokusech s mikroprocesorovými konstrukcemi
      </p>
      <p class="Subtitle">
        <img width="454" height="285" src="Pictures/image001.jpg"
         alt="Pohled na modul">
      </p>
      <p>
        <a href="../LCD2L4P01A.cs.pdf"><img class="NoBorder"
           src="../../../../../Web/PIC/FileIco_PDF.ico"
           alt="Acrobat">&nbsp;PDF verze</a>
      </p>

      <h1> Technické parametry </h1>

      <table>
        <tr>
          <th> Parametr </th>
          <th> Hodnota </th>
          <th> Poznámka </th>
        </tr>
        <tr>
          <td> Napájení </td>
          <td> +5V nebo +3V/-2V </td>
          <td> Záporné napětí pro řízení kontrastu </td>
        </tr>
        <tr>
          <td> Spotřeba </td>
          <td> cca 1mA </td>
          <td> Při +5V </td>
        </tr>
        <tr>
          <td> Displej </td>
          <td> LCD, 2 řádky po 16 znacích </td>
          <td> Hitachi řadič </td>
        </tr>
        <tr>
          <td> Tlačítka </td>
          <td> 4 spínací tlačítka do země </td>
          <td> Volitelný pull-up odpor </td>
        </tr>
        <tr>
          <td> Rozměry </td>
          <td> 61 x 101 x 22 mm </td>
          <td> Výška nad nosnou deskou </td>
        </tr>
      </table>

      <h1> Popis konstrukce </h1>

      <h2> Úvodem </h2>

      <p>
        Na modulu je osazen obyčejný standardní dvouřádkový LCD displej s Hitachi
        řadičem (to jsou skoro všechny dostupné řádkové displeje). Z displeje je
        vyveden jen 4 bitový interfejs a příslušné řídící signály. Pomocí
        propojek je možné připojit trimr pro řízení kontrastu displeje a trvale
        nastavit řídící signál RW na režim jen zápis (v obvyklých konstrukcích se
        z LCD displeje nic nečte).
      </p>

      <p>
        Pod displejem jsou umístěna 4 velká spínací tlačítka do země. Pomocí řady
        propojek označené „PULL UPS“ je možné připojit pull-up odpory do plusu
        (hodnota 10k).
      </p>

      <h2> Zapojení modulu </h2>

      <p>
        <img width="222" height="146" src="Pictures/image002.gif"
         alt="Zapojení napájení">
      </p>

      <p>
        Dioda D1 je ochranná dioda proti přepólování napájení.
        Standardní napájení je +5V ale v případě potřeby může být napájení menší
        ale je třeba použít záporného napětí pro řízení kontrastu LCD displeje
        (potřebný rozdíl mezi kladným napájením a záporným předpětím jej cca 5V).
        Při sníženém napájecím napětí je podstatně snížena spotřeba. Napájecí
        proud pro řízení kontrastu je velmi malý a je možné snadno jej nastřídat.
      </p>

      <p>
        <img width="648" height="342" src="Pictures/image003.gif"
         alt="Připojení displeje">
        <img width="308" height="476" src="Pictures/image004.gif"
         alt="Připojení tlačítek">
      <p>
        Zapojení tlačítek je přímočaré. Odpory R6 až R9 jsou volitelné
        (propojkami J9) pull-up odpory. Tlačítka jsou napevno zapojená
        „do země“.

      <table class="Soupiska">
        <tr>
          <th> Reference </th>
          <th> Název </th>
        </tr>
        <tr>
          <th colspan="2"> Odpory </th>
        </tr>
        <tr>
          <td> R1, R2, R3, R4 </td>
          <td> 1k </td>
        </tr>
        <tr>
          <td> R6, R7, R8, R9 </td>
          <td> 10k </td>
        </tr>
        <tr>
          <td> R5 </td>
          <td> 47k </td>
        </tr>
        <tr>
          <th colspan="2"> Odporové trimry </th>
        </tr>
        <tr>
          <td> P1 </td>
          <td> 47k </td>
        </tr>
        <tr>
          <th colspan="2"> Keramické kondenzátory </th>
        </tr>
        <tr>
          <td> C1 </td>
          <td> 100nF </td>
        </tr>
        <tr>
          <th colspan="2"> Polovodiče </th>
        </tr>
        <tr>
          <td> D1 </td>
          <td> 1N4004 </td>
        </tr>
        <tr>
          <td> U1 </td>
          <td> LCD SC1602A </td>
        </tr>
        <tr>
          <th colspan="2"> Mechanické součástky </th>
        </tr>
        <tr>
          <td> SW1, SW2, SW3, SW4 </td>
          <td> P-DT6GE </td>
        </tr>
        <tr>
          <td> J4 </td>
          <td> JUMP1 </td>
        </tr>
        <tr>
          <td> J5, J7 </td>
          <td> JUMP2 </td>
        </tr>
        <tr>
          <td> J6 </td>
          <td> JUMP3 </td>
        </tr>
        <tr>
          <td> J1+J2 </td>
          <td> JUMP2X3 </td>
        </tr>
        <tr>
          <td> J8, J9 </td>
          <td> JUMP2X4 </td>
        </tr>
        <tr>
          <td> J3 </td>
          <td> JUMP2X8 </td>
        </tr>
      </table>

      <h2> Ovládání LCD displeje </h2>

      <p>
        LCD displej se ovládá zápisem do řídících registrů (RS=0), do paměti pro
        zobrazovaný text (DD RAM) nebo do paměti definice znaků (CG RAM). Z
        pamětí DD RAM a CG RAM je možné rovněž číst ale tato funkce nebývá
        potřebná a je možné trvale čtení deaktivovat (RW=0).
      </p>

      <p>
        Zápis (i čtení) může buď probíhat najednou po 8 bitech nebo nadvakrát po
        4 bitech. Druhý způsob je výhodný z hlediska snížení počtu portů
        procesoru, ke kterému je displej připojen. Pozor, pro čtyřbitový provoz
        se používají vývody D7 až D4.
      </p>

      <p>
        Obsah paměti DD RAM definuje (v ASCII kódu + japonské znaky), co se bude
        zobrazovat. Pro jednotlivé řádky je vyhrazen určitý rozsah adres v DD RAM
        ze kterého je vidět jen výřez. Je možné volit, zda se při zápisu znaků do
        DD RAM automaticky zvyšuje adresa do které se zapisuje nebo zda se
        posouvá okno. Posouvání okna je možné řídit nezávisle a je tam možné
        snadno realizovat běžící text.
      </p>

      <table>
        <tr>
          <th rowspan="2"> Instrukce </th>
          <th colspan="2" class="Center"> Řízení </th>
          <th colspan="8" class="Center"> Datová sběrnice </th>
        </tr>
        <tr>
          <th> RS </th>
          <th> RW </th>
          <th> D7 </th>
          <th> D6 </th>
          <th> D5 </th>
          <th> D4 </th>
          <th> D3 </th>
          <th> D2 </th>
          <th> D1 </th>
          <th> D0 </th>
        </tr>
        <tr>
          <td> <b>Smaž displej a nuluj adresu DD</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
        </tr>
        <tr>
          <td> <b>Nuluj adresu DD na 0 a zruš posunutí</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> * </td>
        </tr>
        <tr>
          <td> <b>Nastavení pohybu kurzoru</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> ID </td>
          <td> S </td>
        </tr>
        <tr>
          <td> <b>Nastavení módu displeje</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> D </td>
          <td> C </td>
          <td> B </td>
        </tr>
        <tr>
          <td> <b>Okamžitý posuv kurzoru nebo textu</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> SC </td>
          <td> RL </td>
          <td> * </td>
          <td> * </td>
        </tr>
        <tr>
          <td> <b>Nastavení funkce displeje</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> DL </td>
          <td> N </td>
          <td> F </td>
          <td> * </td>
          <td> * </td>
        </tr>
        <tr>
          <td> <b>Nastavení adresy CG</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> A5 </td>
          <td> A4 </td>
          <td> A3 </td>
          <td> A2 </td>
          <td> A1 </td>
          <td> A0 </td>
        </tr>
        <tr>
          <td> <b>Nastavení adresy DD</b> </td>
          <td> 0 </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> A6 </td>
          <td> A5 </td>
          <td> A4 </td>
          <td> A3 </td>
          <td> A2 </td>
          <td> A1 </td>
          <td> A0 </td>
        </tr>
        <tr>
          <td> <b>Čtení adresy a busy bitu</b> </td>
          <td> 0 </td>
          <td> 1 </td>
          <td> BF </td>
          <td> A6 </td>
          <td> A5 </td>
          <td> A4 </td>
          <td> A3 </td>
          <td> A2 </td>
          <td> A1 </td>
          <td> A0 </td>
        </tr>
        <tr>
          <td> <b>Zápis dat</b> </td>
          <td> 1 </td>
          <td> 0 </td>
          <td> D7 </td>
          <td> D6 </td>
          <td> D5 </td>
          <td> D4 </td>
          <td> D3 </td>
          <td> D2 </td>
          <td> D1 </td>
          <td> D0 </td>
        </tr>
        <tr>
          <td> <b>Čtení dat</b> </td>
          <td> 1 </td>
          <td> 1 </td>
          <td> D7 </td>
          <td> D6 </td>
          <td> D5 </td>
          <td> D4 </td>
          <td> D3 </td>
          <td> D2 </td>
          <td> D1 </td>
          <td> D0 </td>
        </tr>
      </table>

      <table>
        <tr>
          <th> Bit </th>
          <th> Popis </th>
        </tr>
        <tr>
          <td> S=1 </td>
          <td> Při zápisu/čtení dat se bude posouvat celý displej (směr určuje bit ID) </td>
        </tr>
        <tr>
          <td> S=0 </td>
          <td> Při zápisu/čtení dat se bude posouvat jen kursor (směr určuje bit ID) </td>
        </tr>
        <tr>
          <td> ID=1 </td>
          <td> Při zápisu/čtení dat je ukazatel adresy inkrementován </td>
        </tr>
        <tr>
          <td> ID=0 </td>
          <td> Při zápisu/čtení dat je ukazatel adresy dekrementován </td>
        </tr>
        <tr>
          <td> B=1 </td>
          <td> Blikající znak na pozici kurzoru </td>
        </tr>
        <tr>
          <td> B=0 </td>
          <td> Znak nebliká </td>
        </tr>
        <tr>
          <td> C=1 </td>
          <td> Zapnutí kurzoru </td>
        </tr>
        <tr>
          <td> C=0 </td>
          <td> Vypnutí kurzoru </td>
        </tr>
        <tr>
          <td> D=1 </td>
          <td> Zapnutí displeje </td>
          </tr>
          <tr>
            <td> D=0 </td>
            <td> Vypnutí displeje </td>
          </tr>
        <tr>
          <td> RL=1 </td>
          <td> Okamžitý posuv doprava </td>
        </tr>
        <tr>
          <td> RL=0 </td>
          <td> Okamžitý posuv doleva </td>
        </tr>
        <tr>
          <td> SC=1 </td>
          <td> Okamžitý posuv textu </td>
        </tr>
        <tr>
          <td> SC=0 </td>
          <td> Okamžitý posuv kurzoru </td>
        </tr>
        <tr>
          <td> F=1 </td>
          <td> Znaky v rastru 5x10 </td>
        </tr>
        <tr>
          <td> F=0 </td>
          <td> Znaky v rastru 5x7 (běžné) </td>
        </tr>
        <tr>
          <td> N=1 </td>
          <td> Počet řádek displeje 2 nebo 4 </td>
        </tr>
        <tr>
          <td> N=0 </td>
          <td> Počet řádek displeje 1 (některé jednořádkové displeje jsou
               dvouřádkové – místo řádek mají levou a pravou polovinu) </td>
        </tr>
        <tr>
          <td> DL=1 </td>
          <td> Přenos dat 8 bitů </td>
        </tr>
        <tr>
          <td> DL=0 </td>
          <td> Přenos dat 4 bity (používají se vodiče D7 až D4) </td>
        </tr>
        <tr>
          <td> BF=1 </td>
          <td> Bussy – probíhá vnitřní operace </td>
        </tr>
        <tr>
          <td> BF=0 </td>
          <td> Ready – je možné posílat instrukce </td>
        </tr>
      </table>

      <h2> Mechanická konstrukce </h2>

      <p>
        Mechanická konstrukce je standardní. Displej je přišroubován šrouby M2.5,
        jako distanční podložky mezi displej a plošný spoj je možné použít
        matičky M3.
      </p>

      <h1> Osazení a oživení </h1>

      <h2> Osazení </h2>

      <p>
        Strana součástí
      </p>

      <p>
        <img width="530" height="319" src="Pictures/image005.jpg"
         alt="Oszení, strana součástí">
      </p>

      <p>
        Strana spojů
      </p>

      <p>
        <img width="529" height="319" src="Pictures/image006.jpg"
         alt="Osazení, strana spojů">
      </p>

      <h2> Oživení </h2>

      <p>
        Pokud jsou součásti, plošný spoj a pájení v pořádku není co oživovat.
      </p>
      
      <h1> Programové vybavení </h1>

      <p>
        Pro ovládání LCD displeje procesorem PIC je připraven knihovní modul
        LCD.C napsaný v jazyce C pro překladač CCS.
      </p>

      <h2> Uživatelský návod </h2>

      <p>
        V programu, který bude ovládat LCD displeje je třeba definovat připojení
        LCD displeje a včlenit knihovnu LCD.C do zdrojového programu. První
        příklad ukazuje jak se definuje připojení LCD displeje, když jsou datové
        bity displeje připojeny na libovolné porty procesoru:
      </p>

      <p>
        <code>#define LCD_RS PIN_A2 // Signal RS</code><br>
        <code>#define LCD_E  PIN_A3 // Signal E</code><br>
        <code>#define LCD_D0 PIN_A4 // Data</code><br>
        <code>#define LCD_D1 PIN_B1</code><br>
        <code>#define LCD_D2 PIN_B2</code><br>
        <code>#define LCD_D3 PIN_B3</code><br>
        <code>#include &lt;LCD.C&gt;</code>
      <p>

      <p>
        Následující příklad zobrazuje připojení, kdy jsou jednotlivé bity datové
        sběrnice displeje připojeny na jediný port procesoru za sebou:
      </p>

      <p>
        <code>#define LCD_RS PIN_A2 // Signal RS</code><br>
        <code>#define LCD_E  PIN_A3 // Signal E</code><br>
        <code>#define LCD_DATA_LSB PIN_C2 // 4 bity za sebou</code><br>
        <code>#include &lt;LCD.C&gt;</code>
      <p>

      <p>
        Pak je třeba LCD displej inicializovat (například ve funkci main() ):
      </p>

      <p>
        <code>lcd_init();</code>
      </p>

      <p>
        Pak je možné buď posílat znaky na displej rovnou pomocí funkce LCD_putc()
        nebo prostřednictvím funkce printf():
      </p>

      <p>
        <code>LCD_Putc(0x40);</code><br>
        <code>printf(LCD_Putc,"\n\rText1\r\nText2\n\r");</code>
      </p>

      <p>
        V případě potřeby je možné nadefinovat nové znaky (až 8 znaků najednou).
        Jejich tvar se uloží do CG RAM v displeji a je možné je zobrazit jako
        znaky s kódem 0x00 až 0x07 (nebo 0x08 až 0x0F, 0x10 až 0x17 a 0x18 až
        0x1F). Tvary českých znaků a některých užitečných symbolů je již
        předpřipravena a používá se takto:
      </p>

      <p>
        <code>lcd_define_char(0,LCD_CHAR_BAT50);</code><br>
        <code>// Definice znaku baterie do pozice 0</code><br>
        <code>lcd_define_char(2,LCD_CHAR_HLE LCD_CHAR_LUI);</code><br>
        <code>// Definice znaků ě a Í od pozice 2</code><br>
        <code>// Mezi retezci s definici není carka</code><br>
        <code>printf(lcd_putc,"\fZnaky:\20\22\23");</code><br>
        <code>// Vypis znaku z pozice 0, 2 a 3</code><br>
        <code>delay_ms(1000);</code><br>
        <code>// Prodleva</code><br>
        <code>lcd_define_char(0,LCD_CHAR_BAT0);</code><br>
        <code>// Predefinovani tvaru znaku v pozici 0</code><br>
        <code>delay_ms(1000);</code><br>
        <code>// Prodleva</code>
      </p>

      <p>
        Do displeje je možné posílat řídící příkazy nebo displej řídit pomocnými
        funkcemi takto:
      </p>

      <p>
        \f = \x0C nová stránka = smazání displeje <br>
        \n = \x0A odřádkování = přechod na druhou řádku <br>
        \b = \x08 backspace = posunutí kurzoru o 1 pozici vlevo <br>
        \r = \x0D přesune se na pozici 1,1 <br>
        \0 .. \7 uživatelsky definovaný znak v pozici 0 až 7 v CG RAM <br>
        \20 .. \27 alternativní způsob jak vypsat uživatelsky definované znaky <br>
        (funkce printf() chápe znak 0 jako ukončení tisku)
      </p>

      <p>
        lcd_gotoxy(x,y) přesuň kurzor na uvedenou pozici (1,1 znamená domu)
        lcd_cursor_on() zapne kurzor
        lcd_cursor_off() vypne kurzor
      </p>

      <h2> Popis programu </h2>

      <p>
        V případě nejasnosti je vhodné nahlédnout do zdrojového textu LCD.C a
        případně vyhledat podrobnosti. Na konci souboru je uveden příklad
        definování uživatelských LCD znaků a hned před ním je definice konstant
        pro české znaky a některé pomocné znaky včetně jejich popisu.
      </p>

      <p>
        Aktuální verze LCD.C se může mírně lišit od výše uvedeného popisu, je
        proto třeba primárně vycházet z komentářů ve zdrojovém kódu.
      </p>

    </div>

    <!-- AUTOINCLUDE START "Page/Footer.cs.ihtml" DO NOT REMOVE -->
    <!-- ============== PATIČKA ============== -->
    <div class="Footer">
      <script type="text/javascript">
      <!--
        SetRelativePath("../../../../../");
        DrawFooter();
      // -->
      </script>
      <noscript>
        <p><b> Pro zobrazení (vložení) hlavičky je potřeba JavaScript </b></p>
      </noscript>
    </div>
    <!-- AUTOINCLUDE END -->

  </body>
</html>