Alfanumerický LCD

Seznámení s funkcí Znakového LCD displeje a  řadiče HD44780 od firmy HITACHI.

Řešené příklady :

Zadání

Příklad 1
Na první řádek LCD zobrazte nápis "PRVNI RADEK", na druhý řádek zobrazte statický text "DRUHY RADEK"

Příklad 2
Na první řádek napište text "promena i = x" a na druhý řádek "promena j = y". Kde x bude číslo v rozsahu 0-255 a bude se každých 100ms přičítat a y bude číslo v rozsahu 0-255 a bude se každých 100ms odečítat.

Příklad 3
Na druhém řádku nechte rotovat text "dlouhy text na hodne znaku klidne i 100"

Nápověda

Princip alfanumerického LCD

LCD-modry.png

Alfanumerické LCD dokáží zobrazovat pouze znaky, které mají uložené ve své ROM paměti. Komunikace s LCD probíhá přes řadič, kterému jen oznamujeme jaký znak má být zobrazen, to jak tento znak bude vypadat (font, velikost) je dáno vlastnostmi použitého LCD.  Standardním řadičem pro znakové LCD je HD44780 od firmy Hitachi (nebo jeho ekvivalent), to znamená že všechny znakové LCD od různých výrobců se ovládají stejně.  LCD se vyrábí v několika variantách co se týká počtu znaků na řádek (sloupců) a řádků a to 8x2, 16x1, 16x2, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4 (budeme pracovat s variantou 16x2 - 16 znaků na řádek, 2 řádky )

Pro komunikaci potřebujeme 3 řídicí bity (RS- registr select, R/W - Read/Write, E - Enable) a 8 datových bitů (DB0-DB7).  Tento počet pinů je možno redukovat na 6 a to tím, že si zvolíme 4bitovou komunikaci (data se budou posílat na dvakrát) a vynecháme bit R/W v případě, že nepotřebujeme z LCD číst. 

Zapojení vývodů LCD je následující (dle výrobců se může lišit)

vývod název popis
1 Vss napájení GND
2 Vdd napájení +5V
3 Vo kontrast 0V .. 5V (typ. 0,8V)
4 RS Register Select (0=instrukce, 1=data)
5 R/W Read / Write (0=zápis, 1=čtení)
6 E Enable (1, hrana z 1 -> do 0)
7 DB0 Data Bus 0
8 DB1 Data Bus 1
9 DB2 Data Bus 2
10 DB3 Data Bus 3
11 DB4 Data Bus 4
12 DB5 Data Bus 5
13 DB6 Data Bus 6
14 DB7 Data Bus 7
15 A podsvícení - anoda LED (LCD s podsvícením)
16 K podsvícení - katoda LED (LCD s podsvícením)

 Zobrazení nestandardních znaků
Pokud potřebujeme zobrazit znaky, které výrobce nezahrnul do základní znakové sady, máme k dispozici  8 uživatelsky definovatelných znaků. Pro kompletní zobrazení českých znaků 8 pozic nestačí, proto je nutno před každým zobrazením potřebného znaku nejdříve přepsat v pamětí uživatelské znaky. Těchto 8 pozic lze použít i k vlastním nestandardním znakům jako je stav baterie, bar grafy a podobně (pokud jich potřebujeme více jak 8 platí totéž co s českými znaky)


Pro práci s LCD použijte knihovnu funkcí  v závislosti na zapojeni LCD.

KnihovnaLCD.c - Pro zapojeni LCD na porty A a C
KnihovnaLCD.c - Pro zapojeni LCD na porty B a D

Používané funkce pro práci s LCD:
LCD_Init()  - inicializace LCD
LCD_Clear() - vymazání LCD
LCD_Position(0 , 0) - nastavení pozice pro zobrazení (řádek, sloupec)
LCD_WriteString("text") - zapsání textu na LCD

Příkazy pro práci s proměnou typu string :
nutná knihovna string.h ( #include <string.h> )
strcpy (text1, text2) - vložení textu2 do textu1 bez ohledu na to co text1 obsahoval
strcat (text1, text2) - přidání textu2 k textu1
pro práci s příkazem sprintf je nutná knihovna stdio.h ( #include <string.h> )

Řešení

Příklad 1 :

#define F_CPU 14745600UL  

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"


int main(void)
{
    LCD_Init();
    LCD_Clear();
    _delay_ms(2);

while (1)
      {
    LCD_Position(0 , 0);
    LCD_WriteString("Prvni radek");
    LCD_Position(1 , 0);
    LCD_WriteString("Druhy radek");
    _delay_ms(100);
      };
}

Příklad 2

#define F_CPU 14745600UL  
#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"


int main(void)
{
    LCD_Init();
    LCD_Clear();
    _delay_ms(2);
    char i;
    char j;
    char tmp [17];

while (1)
      {
    sprintf(tmp,"promena i = %d",i)
    LCD_Position(0 , 0);
    
LCD_WriteString(tmp);
   
sprintf(tmp,"promena j = %d",j)
    LCD_Position(1 , 0);
    LCD_WriteString(tmp);
    _delay_ms(100);
    i++;
    j--;
      };
}

Příklad 3


#define F_CPU 14745600UL 

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>
#include "knihovnaLCD.c"

char text[100];
int delka;
int i,znaky;
char tmp [20];

int main(void)

{
    LCD_Init();
    LCD_Clear();
    _delay_ms(2);

strcpy(text,"                ");
strcat(text,"dlouhy text na hodne znaku klidne i 100");
strcat(text,"                ");

znaky=0;

while (1)

      {

    LCD_Position(0 , 0);
    LCD_WriteString("Posuvnej text");
    delka=strlen(text);

if (znaky==delka-16) znaky=0;

for (i=0;i<16;i++)
    {
    tmp[i]=text[i+znaky];
    }

tmp[16]=0;
znaky++;


LCD_Position(1 , 0);
LCD_WriteString(tmp);
 _delay_ms(300);

      };
}