Uživatel:Schmija2

Z MAM wiki

Přejít na: navigace, hledání

Funkce pro znakový LCD displej.

Projekt vypracovali: Dušan Mondek a Jakub Schmidt

Obsah

[editovat] Součástky

Pro zapojení je použit procesor ATmega168, znakový displej a odpory pro omezení proudu diodami.

[editovat] Schéma

Obrázek 1. Schéma zapojení znakového displeje 16x2 ve 4-bitovém režimu

[editovat] Displej

Bez zobrazovače se dnes neobejde téměř žádné elektronické zařízení a jednou z možnosté je použít LCD displej. Znakový displej je vhodný pro jednoduché aplikace např. na měřících přístrojích, kde není vyžadováno grafického výstupu. Uvedený displej má formát 16x2 znaků, žlutozelené LED podsvícení, je řízen řadičem NT3881D-T074 a pracuje v normálním teplotním rozsahu 0 - 50 °C.

[editovat] Řadič

Ovládání displeje je řízeno řadičem NT3881D, který pochází ze standardní rodiny LCD řadičů HD44780 a má následující vlastnosti:

  • maximální podporovaná velikost displeje je 40x2 nebo 80x1 znak (u větších displejů je nutné použít více řadičů)
  • datová paměť (DDRAM) má velikost 80x8 bitů (proto je schopen zobrazit maximálně 80 znaků)
  • podporuje připojení k procesoru (MPU) pomocí 4 nebo 8 bitů
  • obsahuje zabudované zobrazovací funkce (dostupné bitovými kombinacemi v instrukčním režimu displeje):
    • smazání displeje
    • vrácení kurzoru na začátek
    • zapnutí/vypnutí displeje
    • zapnutí/vypnutí kurzoru
    • blikání
    • posun kurzoru

[editovat] Funkce řadiče

Pro komunikaci s mikroprocesorem řadič používá 4 nebo 8 bitové sběrnice. Od něj řadič přijme kód znaku (v ASCII), uloží ho do vnitřní paměti, pak ho transformuje do vzoru 5x7 bitů a následně jej zobrazí na displeji. Vestavěná paměť CGROM (Character Generator ROM) obsahuje 256 rozdílných znakových vzorů. Řadič také disponuje pamětí CGRAM (Character Generator RAM), která umožňuje uživateli za běhu uložit 8 znakových vzorů.

[editovat] Zapojení vývodů

pin symbol funkce
1 VSS zem, 0V
2 VDD napájení +5V
3 V0 nastaní kontrastu
4 RS zápis dat/instrukcí (1/0)
5 R/W zápis (0) / čtení obsahu displeje (1)
6 E hodinový vstup (signál enable)
7 DB0 datová sběrnice (data 0 - 7)
8 DB1
9 DB2
10 DB3
11 DB4
12 DB5
13 DB6
14 DB7
15 LED A+ anoda podsvětlení (+5V)
16 LED K- katoda podsvětlení (0V)
Tabulka 1. Zapojení vývodů displeje

[editovat] Časové charakteristiky a komunikace

Při 8-bitové komunikaci je zapojeno všech 8 (DB0 - DB7) datových vodičů. Nejprve je nutné nastavit signál RS, který slouží pro rozlišení toho, zda displeji odesíláme data nebo instrukce, potom se nastaví do logické 1 signál ENABLE a poté jsou čtena data ze sběrnice na datových vodičích DB0 - DB7. (Diagram je uveden na obr. 2)

Obrázek 2. Časový diagram zápisu
Obrázek 3. Praktický časový diagram zápisu

V reálném zapojení je při programování displeje spíše využit diagram uvedený na obr. 3, kdy je signál ENABLE uveden do logické jedničky až potom, kdy jsou platná data umístěná na sběrnici.

Při 4-bitové komunikaci se použijí jen 4 datové vodiče (DB4 - DB7) a zbylé (DB0-DB3) by měly být uzemněny. Data jsou pak posílána nadvakrát, nejprve se na DB4 - DB7 odešle horní polovina bytu a na vodič E se pošle kladný impuls a poté se na DB4 - DB7 odešle dolní polovina bytu a vygeneruje se druhý impuls ENABLE.

Vyjímka je tvořena první instrukcí, která displej inicializuje pro 4-bitovou komunikaci. Na sběrnici (DB4-DB7) je odeslána pouze horní část inicializačního bytu a jeden ENABLE impuls. Tento inicializační byte je pak odeslán znovu, ale už ve 4-bitovém režimu (tzn. horní část + ENABLE signál a dolní část + signál ENABLE).

V případě tohoto displeje je inicializační byte 00000011, přičemž jedničky jsou v první instrukci odeslány na DB4 a DB5. Čas nutný k vykonání instrukce je 40μs a po tuto dobu musí být inicializační byte přítomen na sběrnici a signál ENABLE v logické 1.

Na obrázcích 1 a 2 jsou uvedeny časové diagramy použité pro komunikaci a jsou platné pro oba dva režimy. Jsou v nich také vyznačeny nejzásadnější časové konstanty, které je nutné při programování displeje a komunikaci s ním dodržet. (Ostatní jsou uvedeny v datasheetu.) Jedná se o:

  • tSU1 čas potřebný k ustálení logické úrovně signálu RS (minimálně 40ns)
  • tW šířku ENABLE signálu v logické 1 (minimálně 230ns)
  • tSU2 čas, po který jsou data v ustáleném logickém stavu držena na sběrnici, před ukončením ENABLE pulsu (minimálně 5ns)

Na použitém procesoru ATmega168, který pracuje na frekvenci 1MHz není nutné věnovat časování přílišnou pozornost, protože čas k vykonání instrukcí je většinou dostačující většině impulsů použitých pro ovládání displeje. (Výjimku tvoří inicializace displeje a vyčkání na ustálení napájení, kde je nutné pár taktů procesoru navíc vyčkat.) Jiná situace nastává v připadě procesoru s vyšší pracovní frekvencí, či použití externího krystalu. Zde je již vhodné použít čekací smyčky a dodržet minimální hodnoty časových konstant (např. pro ENABLE impuls).

[editovat] Znaková sada

Obrázek 4. Znaková sada pro displej CM160224SFAYA-I1

Znaková sada uvedeného displeje obsahuje standardní anglickou sadu znaků a další rozšířená část obsahuje některé znaky řecké a ruské abecedy a jiné speciální znaky. Základní znaky odpovídají kódování ASCII a jsou uvedeny v tabulce.

Znaky abecedy jsou převáděny do ASCII kódování po řádcích, například písmeno T odpovídá v hexadecimálním vyjádření číslu 0x54. (Assembler převádí znaky do ASCII automaticky, takže když chceme nahrát do registru kód znaku T, provedeme to pomocí příkazu LDI R16,'T' a R16 bude obsahovat číslo 0x54h.)

Pokud není standardní znaková sada displeje (uložená v paměti CGROM) dostačující, je možné si vytvořit až 8 vlastních znaků, k čemuž slouří paměťový prostor CGRAM. Tyto znaky se pak z paměti vyvolávají stejně jako ostatní a jsou uloženy pod kódy 0 - 7 a zrcadleně i pod 8 - 15 (viz první sloupec tabulky znaků).

Kód znaku

(Adresa v DDRAM)

Adresa v CGRAM Data v CGRAM

(vzor znaku)

kód znaku řádek znaku 7 6 5 4 3 2 1 0
0000x000

(na 3.bitu nezáleží)

0 0 0 0 0 0 x x x 0 1 0 1 0
0 0 1 0 0 1 0 0
0 1 0 0 1 1 1 0
0 1 1 1 0 0 0 1
1 0 0 1 1 1 1 1
1 0 1 1 0 0 0 0
1 1 0 0 1 1 1 0
1 1 1 0 0 0 0 0
Tabulka 2. Zápis vlastního znaku do CGRAM

V tabulce 2 je naznačen postup ukládání písmena ě do paměti CGRAM. První tři bity (označené červeně) označují kód znaku, pod kterým budou vybírány z DDRAM paměti. Tyto tři bity jsou také součástí adresy CGRAM (konkrétně 3.,4. a 5. bit). Spodní tři bity adresy CGRAM odpovídají řádku vzoru znaku. Na třetím bitu (označen x) nezáleží, proto jsou znaky, uložené v DDRAM na adrese 0 - 7 zrcadleny do adresového prostoru 8 - 15.

Následujících 8 bitů pro každý řádek je datový obsah paměti CGRAM a určuje vzor pro uživatelský znak (horní 3 bity jsou libovolné).

Poslední řádek určuje pozici kurzoru, pokud je nulový, je kurzor nastaven podle inicializačního nastavení kurzoru (např. posun vpravo o jeden znak).

[editovat] Instrukce displeje

Pro instrukce, které je možné vykonat, obsahuje displej instrukční sadu základních příkazů. Instrukce jsou prováděny uvedením daných pinů displeje do kombinací logických stavů (viz tab. 3).

Popis instrukce RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

Délka vykonání instrukce

smaže displej a nastaví kurzor na začátek 0 0 0 0 0 0 0 0 0 1 1,64 ms
nastaví kurzor na začátek 0 0 0 0 0 0 0 0 1 x 1,64 ms
nastaví směr posuvu kurzoru I/D (0=vlevo, 1=vpravo),

posuv textu S (0=ne, 1=ano)

0 0 0 0 0 0 0 1 I/D S 40 μs
D - zapne displej, C - zapne kurzor,

B - zapne blikání kurzoru

0 0 0 0 0 0 1 D C B 40 us
1x posune (S/C=0 kurzor, S/C=1 text)

směrem (R/L=0 vlevo, R/L=1 vpravo)

0 0 0 0 0 1 S/C R/L x x 40 μs
inicializace:

DL=0 4-bitový, DL=1 8-bitový mód
N=0 jednořádkový, N=1 dvouřádkový displej
F=0 font 5x8, F=1 font 5x10

0 0 0 0 1 DL N F x x 40 μs
přepnutí na zápis do CGRAM 0 0 0 1 adresa v CGRAM 40 μs
přepnutí na zápis do DDRAM 0 0 1 adresa v DDRAM 40 μs
čtení příznaku BF (BF=0 příjem povolen, BF=1 řadič zaneprázdněn),

čtení adresy v DDRAM

0 1 BF adresa v DDRAM 0 μs
zápis dat do CGRAM nebo DDRAM 1 0 data 40 μs
čtení dat z CGRAM nebo DDRAM 1 1 data 40 μs
Tabulka 3. Instrukce displeje

V případě instrukce přepnutí zápisu dat do DDRAM se displej přepne na režim zápisu do DDRAM a při příštím přenosu dat (použije se instrukce zápis dat do CGRAM nebo DDRAM, na datovou sběrnici se umístí požadovaná data a potvrdí se pomocí ENABLE pulsu) se data uloží na zvolenou 7 bitovou adresu. Pomocí tohoto příkazu lze také nastavovat pozici kurzoru. Každé adrese odpovídá jedna pozice na displeji, první znak zleva začíná na adrese 00h a první znak zleva na druhém řádku začíná na adrese 40h.

V případě zápisu do paměti CGRAM se postupuje obdobně, tj. vykoná se instrukce pro přepnutí zápisu dat do CGRAM, kterou se také určí 6-bitová adresa, na kterou se bude zapisovat a následným zápisem dat (pomocí instrukce zápis dat do CGRAM nebo DDRAM) se na určenou adresu zapíše část vlastního symbolu.

[editovat] Program pro ovládání displeje

Definice základních vstupů a výstupů pro kontrétní mikrokontrolér (v tomto případě ATmega168) a asociace adres portů s jejich názvy (PORTD, PORTB, čítače, atd.)

#include <avr/io.h>
#include <avr/iom168.h>

Rutiny pro zpožďovací funkce a deklarace frekvence procesoru:

#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 1000000
#endif

Definice názvů pinů LCD displeje a jejich asociace s výstupy procesoru, použitých registrů apod.:

#define RS 		PD4
#define E		PD5
#define temp1	  	R16

[editovat] Základní ovládací funkce pro displej (zasílání instrukcí, dat, ENABLE, inicializace...)

Pro potvrzení dat na sběrnici a dalších činností souvisejících se základním ovládáním je třeba ENABLE pulsu, proto je třeba si pro něj vytvořit samostatnou funkci:

static void lcd_enable( void )
{
    PORTD |= (1<<E);     // nastavení ENABLE na log 1
    _delay_us( 1 );      // zpoždění 1 us (doba trvání ENABLE pulsu je min 230ns)
    PORTD &= ~(1<<E);    // nastavení ENABLE na log 0
}

Funkce pro vybrání horních 4 bitů z 8-bitového čísla a jejich odeslání na sběrnici (DB7 - DB14) a volání ENABLE pulsu. Tato funkce je potřebná pouze pro 4-bitový režim komunikace s LCD displejem, kdy je potřeba data posílat po 4 bitech.

static void lcd_out( uint8_t data )
{
    data &= 0xF0;            	// vybrání horních 4 bitů z 8-bitové proměnné vstupující do funkce
 
    PORTD &= 0xF0;           	// nulování dolních 4 bitů na portu D
    PORTD |= (data>>4);		// nastavení datových bitů dolní část na portu D (datovou sbernici displeje)
    lcd_enable();		// volání ENABLE pulsu pro potvrzení dat na sběrnici
}

Funkce pro odeslání instrukce displeji. Nejprve nastaví RS pin displeje do log. 0 a pak odešle 4-bitově nejrpve horní část instrukce a poté spodní část:

void lcd_command( uint8_t data )
{
    PORTD &= ~(1<<RS);    	// vynulování RS pinu displeje
 
    lcd_out( data );            // odeslání horních 4 bitů instrukce
    lcd_out( data<<4 );		// odeslání dolních 4 bitů instrukce
 
    _delay_us( 40 );		// čas pro vykonání instrukce displejem
}

Funkce pro odeslání dat (do CGRAM nebo DDRAM) displeji. Pin RS je v log. 1 (viz tabulka instrukcí) a data se odesílají 4-bitově (tzn. nejprve horní část a poté spodní část bytu).

void lcd_data( uint8_t data )
{
    PORTD |= (1<<RS);    	// nastavení pinu RS na log. 1
 
    lcd_out( data );            // odeslání horní části datového bytu na sběrnici displeje
    lcd_out( data<<4 );         // odeslání dolní části datového bytu na sběrnici displeje
 
    _delay_us( 50 );		// čas pro vykonání instrukce displejem
}

Funkce využívají první instrukci z tabulky pro smazání obsahu displeje:

void lcd_clear( void )
{
    lcd_command( 0x01 );	// volání funkce pro odesílání instrukcí
    _delay_ms( 2 ); 		// čas pro vykonání instrukce
}

Na počátku komunikace s displejem je nutné jej inicializovat. Volání této funkce musí předcházet další práci s displejem.

void lcd_init( void )
{
    // nastavení pinů procesoru, které jsou připojeny k LCD displeji jako výstupní porty
    uint8_t pins = (0x0F << PD0) | 	// datové vodice
                   (1<<RS) | 		// port RS
                   (1<<E); 		// port ENABLE
    DDRD |= pins;
    
    // počáteční nastavení všech výstupů na nulu
    PORTD &= ~pins;

    // čekání na komunikaci s LCD po připojení napájení
    _delay_ms(15);

    // "reset" displeje a následné trojnásobné potvrzení ENABLE pulsem
    lcd_out( 0x30 );
    _delay_ms( 1 );
 
    lcd_enable();
    _delay_ms( 1 );
 
    lcd_enable();
    _delay_ms( 1 );

    // inicializace 4-bitového režimu komunikace
    lcd_out( 0x20 );
    _delay_ms( 5 );

    // potvrzení 4-bitového módu, nastavení dvouřádkového displeje a fontu s rozměrem 5x8 bitů
    lcd_command( 0x28 ); // (0b001010xx)
    _delay_us(40);

    // zapnutí displeje, vypnutí kurzoru a blikání
    lcd_command( 0x0C ); // 0x0F pro blikající kurzor

    // nastavení posuvu kurzoru vpravo a vypnutí posouvání textu
    lcd_command( 0x06 );

    // volání funkce pro vymazání displeje
    lcd_clear();
}

[editovat] Funkce pro práci s textem

Pro návrat kurzoru na počátek displeje je možné využít standardní instrukci. Funkce, která ji implementuje:

void lcd_home( void )
{
    lcd_command( 0x02 );
    _delay_ms( 2 );
}

Kurzor displeje je možné nastavit podle adresního rozsahu 0x00h - 0x0F pro první řádek a 0x40h - 0x4F pro řádek druhý. V případě použití víceřádkových displejů je adresa počátku třetího řádku 0x10h a adresa počátku čtvrtého řádku 0x50h. Při adresování displejů s více sloupci (např. displej o rozměrech 20x4 znaků) je adresa počátku třetího řádku 0x14 a čtvrtého 0x54h.

Funkce má vstupní parametry řádek x (v rozsahu 1 - 4) a sloupec y (v rozsahu 0 - 15):

void lcd_setcursor( uint8_t x, uint8_t y )
{
    uint8_t data;
 
    switch (x)
    {
        case 1:    // 1. řádek
            data = 0x80 + 0x00 + y; // adresa instrukce zápisu do DDRAM + adresa řádku + umístění kurzoru zadané vst. parametrem
            break;
 
        case 2:    // 2. řádek
            data = 0x80 + 0x40 + y;
            break;
 
        case 3:    // 3. řádek
            data = 0x80 + 0x10 + y;
            break;
 
        case 4:    // 4. řádek
            data = 0x80 + 0x50 + y;
            break;
 
        default:
            return; 
    }
 
    lcd_command( data );
}

Princip tvorby vlastních znaků je popsán výše. Funkce má dva vstupní parametry: adresu, pod kterou bude znak vyvoláván z paměti a pole osmi 8-bitových čísel, které reprezentují vzor znaku. Funkce nejprve přepne na zápis do CGRAM paměti a zároveň nastaví adresu první řádky znakového vzoru. Poté v cyklu projde pole s uloženým vzorem a uloží jej na daná místa do paměti.

void lcd_generatechar( uint8_t code, uint8_t data[] )
{
    // nastavení adresy prvního řádku znaku
    lcd_command( 0x40 | (code<<3) );
 
    // zapsání řádku znaku
    for ( uint8_t i=0; i<8; i++ )
    {
        lcd_data( data[i] );
    }
}

Definice znakových vzorů pro české znaky (i s jejich dekadickou ASCII reprezentací):

//236
unsigned char e_hacek[8] = {
0b00001010,
0b00000100,
0b00001110,
0b00010001,
0b00011111,
0b00010000,
0b00001110,
0x00
};
//154
unsigned char s_hacek[8] = {
0b00001010,
0b00000100,
0b00001110,
0b00010000,
0b00001110,
0b00000001,
0b00001110,
0x00
};
//232
unsigned char c_hacek[8] = {
0b00001010,
0b00000100,
0b00001110,
0b00010000,
0b00010000,
0b00010001,
0b00001110,
0x00
};
//154
unsigned char r_hacek[8] = {
0b00001010,
0b00000100,
0b00010110,
0b00011001,
0b00010000,
0b00010000,
0b00010000,
0x00
};
//158
unsigned char z_hacek[8] = {
0b00001010,
0b00000100,
0b00011111,
0b00000010,
0b00000100,
0b00001001,
0b00011111,
0x00
};


//225
unsigned char a_carka[8] = {
0b00000010,
0b00000100,
0b00001110,
0b00000001,
0b00001111,
0b00010001,
0b00001111,
0x00
};
//237
unsigned char i_carka[8] = { 
0b00000010,
0b00000100,
0b00001100,
0b00000100,
0b00000100,
0b00000100,
0b00001110,
0x00
};
//253
unsigned char y_carka[8] = { 
0b00000010,
0b00000100,
0b00010001,
0b00010001,
0b00001111,
0b00000001,
0b00001110,
0x00
};

Pro posouvání textu je možné využít standarní instrukci displeje. Jinou možností (a také pomalejší) je přepis obsahu paměti DDRAM s následným překreslením stejného textu jen o jedno místo v paměti dále. (Tento způsob bude popsán dále.) Implementace standardní instrukce displeje do funkce pro posun textu na displeji je následující a funkce má jednu vstupní hodnotu pro určení směru posunu textu 0 doleva a 1 doprava:

void lcd_scroll(uint8_t dir)
{
	if(dir>1) dir=1; // při zadání jiné než povolené hodnoty se přepíše na 1

	for(uint8_t i=0;i<16;i++) // text se v cyklu posune o celou délku displeje
	{
		lcd_command(0x1B + dir);
		if(i==15) break;
		_delay_ms(150);
	}
}

Jednoduchá funkce pro vycentrování jednořádkového textu. Její vstupní proměnná obsahuje pouze text.

void lcd_center(char data[])
{
	lcd_setcursor(1,7-strlen(data)/2);
	lcd_text(data);
}

[editovat] Pokročilejší textové funkce

Následující funkce vypíše zadaný text na displej. Pracuje se znaky české klávesnice (ěščřžýáíé), které v textu vyhledá a (za předpokladu, že jsou správně nahrány do CGRAM, vypíše. Pokud je text delší než 32 znaků (tzn. nevejde se na dva řádky displeje) text se se "scrolovacím" efektem posune na další "stránku" a zobrazí zbytek textu. (Funkce sice nepodporuje jiný než dvouřádkový displej, nicméně změnou adresních rozsahů jednotlivých řádků při použití jiného displeje je možné docílit podpory i víceřdkových znakových displejů.)

void lcd_text(char data[])
{

	uint8_t i=0,j=0;

	while (data[i] != '\0')
	{

		// rozpoznání mezery před koncem řádku a přechod na nový řádek
		if (((i>10) && (i<=16)) && (data[i] == 32))
			{
				lcd_setcursor(2,0);
				j=0xFF;
				i++;
			}

		// rozpoznání konce řádku a přechod na nový
		if ((i==16) && (j==0))
		 	{
				lcd_setcursor(2,0);
				j=0;
			}
		// odscrollování první stránky a nastavení kurzoru na počátek
		if (i==30)
			{
				_delay_ms(5000);
				lcd_scroll(0);
				lcd_clear();
				lcd_home();
			}

		if (i==46)
			lcd_setcursor(2,0);

		// rozpoznání českých znaků a jejich výběr z CGRAM
		switch(data[i])
		{
		case 232://č
		lcd_data(2);
		i++;
		break;

		case 154://š
		lcd_data(1);
		i++;
		break;

		case 236://ě
		lcd_data(0);
		i++;
		break;

		case 248://ř
		lcd_data(3);
		i++;
		break;

		case 158://ž
		lcd_data(4);
		i++;
		break;

		case 253://ý
		lcd_data(5);
		i++;
		break;

		case 225://á
		lcd_data(6);
		i++;
		break;

		case 237://í
		lcd_data(7);
		i++;
		break;

		case 233://é
		lcd_data('e');
		i++;
		break;
	
		//pokud je znak standardní (displej ho zná), tak se vypíše
		default:
		lcd_data( data[i++] );
		break;
		}
	
	
	}

} 

Následující funkce vykreslí text na displeji a plynule jím přejede přes oba řádky s tzv. "efektem hada", což znamená, že se na konci řádky text po znaku posouvá na další řádku. Jejími vstupními parametry jsou text a rychlost posunu textu v ms.

void lcd_movetext(char data[],uint16_t speed)
{	
	// vypsani znaku zacatek prvniho radku
	lcd_command(0x80);
	lcd_text(data);
	_delay_ms(speed);
	
	// posun textu na konec prvniho radku
	for(uint8_t i = 0;i<(15-strlen(data)+1);i++)
	{
		lcd_command(0x80 + i+1);
		lcd_text(data);

		lcd_command(0x80 + i);
		lcd_data(32);

		_delay_ms(speed);
	}
	
	// preteceni textu z prvniho na druhy radek
	uint8_t i=1;
	while(data[i] != data[strlen(data)+1])
	{	
		// schovani textu na konci prvni radky
		lcd_command(0x8F - strlen(data) + i + 1);
		lcd_text(data);
	
		// prekresleni 1. znaku mezerou
		lcd_command(0x8F - strlen(data) + i);
		lcd_data(32);
	
		// posun textu od kraje druheho radku
		lcd_command(0b11000000);
		for(uint8_t index=0;index<=i-1;index++)
		{
		lcd_data(data[strlen(data)-i+index]);	
		}

		_delay_ms(speed);
		i++;
	}

	// posun textu na konec druheho radku
	for(i=0;i<=(15-strlen(data));i++)
	{
		lcd_command(0x80+0x40+i+1);
		lcd_text(data);

		lcd_command(0x80+0x40+i);
		lcd_data(32);

		_delay_ms(speed);
	}	
	
	// schovani textu na konci druheho radku
	// a jeho rozbaleni na pocatek prvni radky
	i=1;	
	while(data[i] != data[strlen(data)])
	{	
		// schovani textu na konci druhe radky
		lcd_command(0x8F+0x40 - strlen(data) + i + 1);
		lcd_text(data);
	
		// prekresleni 1. znaku textu mezerou
		lcd_command(0x8F+0x40 - strlen(data) + i);
		lcd_data(32);
	
		// posun textu od kraje prvniho radku
		lcd_command(0b10000000);
		for(uint8_t index=0;index<=i-1;index++)
		{
		lcd_data(data[strlen(data)-i+index]);	
		}

		_delay_ms(speed);
		i++;
	}	

		lcd_command(0x8F+0x40);
		lcd_data(32);
}

[editovat] Funkce main

V hlavní funkci programu main mohou být volány všechny funkce výše uvedené. Povinná je inicializační funkce na prvním místě, bez které by nebylo možné s displejem komunikovat. (V inicializační rutině by mohly být umístěny i funkce, které uloží české znaky do CGRAM, zde jsou volány jednotlivě po inializaci.) Pro opakování se volání funkce umístí o hlavní smyčky programu.

int main(void){

// inicializace displeje
lcd_init();

// uložení vzorů českých znaků do paměti CGRAM na adresy 0 - 7
lcd_generatechar(0x00,e_hacek);

lcd_generatechar(0x01,s_hacek);

lcd_generatechar(0x02,c_hacek);

lcd_generatechar(0x03,r_hacek);

lcd_generatechar(0x04,z_hacek);

lcd_generatechar(0x05,y_carka);

lcd_generatechar(0x06,a_carka);

lcd_generatechar(0x07,i_carka);

// příklad volání funkce pro vypsání textu
lcd_text("Toto je velmi dlouhý text, který se nevejde na dva řádky");

// hlavní smyčka programu
 while(1){

	// příklad volání funkce pro posun textu, která se bude opakovat
	lcd_movetext("Hello world",300);

 }
}

[editovat] Literatura

[1] AVR-Tutorial: LCD. [online] Dostupný z WWW: <http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD>.

[2] AVR-GCC-Tutorial/LCD-Ansteuerung. [online] Dostupný z WWW: <http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung>

[editovat] Ukázky

Videoukázky na youtube:

Pohybu textu pomocí funkce lcd_movetext:

Zobrazení textu funkcí lcd_text:

Celkové zapojení displeje i s AVR DRAGONem
Zobrazení znaků s diakritikou na displeji
Osobní nástroje