Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Úvod

Určitě každý znáte klasický jednobarevný dvouřádkový LCD displej ať už z nějakého výrobku, nebo jste ho někde zahlédli na internetu. A právě tento LCD displej je tématem tohoto příspěvku, kde si ukážeme jak ho připojit k mikrokontroléru ATmega16/32.

Stručný popis

V krátkosti si popíšeme LCD displej s velmi častým řadičem HD44780. V tomto řadiči se nachází znaková sada, takže nemusíte řídit rozsvícení jednotlivých pixelů, ale stačí napsat znak a integrovaný řadič automaticky rozsvítí dané pixely v matici 5×8.
 
LCD displej obsahuje 8 pinů, které slouží jako datová sběrnice, obsahuje pin RS, který určuje, zda se jedná o data nebo instrukce pro řadič, dále obsahuje pin R/W, který rozlišuje mezi zápisem dat do LCD a čtením dat z LCD a také obsahuje pin E, který řídí vzorkování řídících i datových pinů. Pokud je pin RS v log. 1, tak jsou přenášeny znaky k zobrazení, nebo k uložení do paměti. V opačném stavu pinu RS jsou přenášeny instrukce jako např. smazání displeje apod. Jak bylo řečeno pinem R/W řídíme směr komunikace. Pro přenášení dat do LCD displeje na tento pin nastavíme log. 0. Ve stavu log. 1 jsou data přenášena z LCD do mikrokontroléru. Posledním řídícím pinem E vzorkujeme komunikaci sestupnou hranou signálu. Pro zajištění korektní komunikace musí být při vzorkování na ostatních pinech ustálená hodnota.
 
K předávání dat mezi mikrokontrolérem a LCD lze použít dva režimy. Jednotlivé režimy se liší v použití počtu datových vodičů. V prvním režimu jsou využity všechny datové piny. V druhém režimu používáme pouze čtyři datové piny D4 – D7 a každý byte je rozdělen na dvě čtveřice bitů a ty jsou poslány za sebou.
 
Důkladnější popis komunikace zde dále nebudu rozebírat, protože k ovládání tohoto LCD displeje existuje řada vytvořených zdrojových kódů. Osobně používám vytvořený ovladač, který je ke stažení zde: LCD HD44780 driver („lcdlibrary.zip“), který vytvořil Peter Fleury.

 

Vložení souborů s ovladačem pro LCD displej

Po stažení souboru „lcdlibrary.zip“ ho otevřeme a zkopírujeme soubory „lcd.c“ a „lcd.h“ do složky projektu. Poté ve vytvořeném projektu v záložce „Solution Explorer“ klikneme pravým tlačítkem myši na název projektu a vybereme „Add – Existing Item…“, viz Obr. 1.

nazev

Obr. 1: Vložení již existujícího souboru

Po výběru se zobrazí dialogové okno, kde vybereme soubory „lcd.c“ a „lcd.h“ a stiskneme „Add“. Tímto jsme vložili stažené soubory do vytvořeného projektu.
 
Původní nastavení této knihovny pracuje se čtyř vodičovým režimem a mapuje jednotlivé piny LCD displeje na PORTA následujícím způsobem:
 
PA0 – D4
PA1 – D5
PA2 – D6
PA3 – D7
PA4 – RS
PA5 – RW
PA6 – E
 
Pokud chcete změnit PORT, který ovládá LCD display, lze to udělat v souboru „lcd.h“ v:
 
#define LCD_PORT PORTA
 
Zde můžete změnit PORTA např. za PORTB apod.
 
Pro verzi 1.13.2.2 2006/01/30 pro AVR-GCC 3.3 proveďte další změnu v „lcd.h“ na pozici:
 
#define XTAL 4000000
 
Zde zadejte taktovací kmitočet použitého mikrokontroléru. V tomto případě bude hodnota změněna na 16000000 pro 16 MHz krystal.
 
Pokud používáte novou verzi 1.14.2.4 2015/01/20 pro AVR-GCC 4.x, tak definici frekvence hodinového taktu musíte provést sami, jinak LCD displej nebude správně fungovat. Můžete buď zadat na začátek souboru „lcd.c“ #define F_CPU 16000000UL, nebo můžete využít nastavení symbolu pomocí “Project – Properties… – Toolchain – Symbols – Defined symbols – Add Item” a zde zadáte F_CPU=16000000UL, viz Obr. 2. Poté již není nutné definovat F_CPU ani v hlavním souboru programu.

Obr. 2: Nastavení symbolu F_CPU

Obr. 2: Nastavení symbolu F_CPU

Pokud byste zapomněli definovat frekvenci hodinového taktu, tak se zobrazí upozornění, že pro zpoždění umístěné v <util/delay.h> není definovaná hodnota F_CPU, viz Obr. 3.

Obr. 3: Upozornění na chybějící definici F_CPU

Obr. 3: Upozornění na chybějící definici F_CPU

 

Elektronické schéma zapojení

nazev

Obr. 4: Elektronické schéma zapojení
Okomentovaný zdrojový kód

001: #define F_CPU 16000000UL// frekvence hodinového signálu (nutné pro delay.h)
002: #include <avr/io.h>// knihovna AVR pro Input/output
003: #include <util/delay.h>// hlavičkový soubor pro zpoždění
004: #include <stdio.h>// hlavičkový soubor pro standardní IO operace
005: #include “lcd.h”// hlavičkový soubor pro lcd displej
006:
007: char number[5];// Pole znaků pro uložení řetězce
008:
009: int main(void)
010: {
011: lcd_init(LCD_DISP_ON);// Inicializace LCD displeje může obsahovat
012: // LCD_DISP_ON – aktivace LCD
013: // LCD_DISP_OFF – deaktivace LCD
014: // LCD_DISP_ON_BLINK – aktivace
015: // LCD, blikání znaku
016: // LCD_DISP_ON_CURSOR – aktivace LCD i kurzoru
017: // LCD_DISP_ON_CURSOR_BLINK – aktivace LCD i kurzoru,
018: // blikání znaku
019:
020: lcd_clrscr();// Smazání LCD displeje
021:
022: lcd_gotoxy(0,0); // Nastavení kurzoru na pozici x0, y0
023: // první znak první řádek
024: // Na nastavenou pozici zapsat řetězec
025: lcd_puts("www.tajned.cz");
026: lcd_gotoxy(0,1);// Nastavení kurzoru na pozici x0, y1
027: // Na nastavenou pozici zapsat řetězec
028: lcd_puts("State: 000 %");
029: _delay_ms(2000);// Čekání 2 s
030:
031: while(1)
032: {
033: for (int i = 0; i < 100; i++)
034: {
035: // Do pole uložit aktuální hodnotu i
036: sprintf(number,"%03d",i);
037: // ve tvaru XXX
038: _delay_ms(500);// Čekání 0,5 s
039: lcd_gotoxy(7,1);// Nastavit pozici kurzoru na pozici x7, y1
040: lcd_puts(number);// Na nastavenou pozici zapsat řetězec
041: }
042: }
043: return 0;
044: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 
Výsledná realizace

nazev

Obr. 5: Odzkoušení funkce na kontaktním poli

 
Aktualizace: 16.4.2015
 

[1] AVR-GCC Source Examples. [online] citováno 22. Listopadu 2014. Dostupné na www: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
[2] WC1602K. [online] citováno 22. Listopadu 2014. Dostupné na www: http://pdf.datasheetcatalog.com/datasheets2/12/121692_1.pdf

 

Jiné příspěvky v kategorii:

 

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání GPIO portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)
 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.