LCD displej s radičom HD44780: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 85: | Riadok 85: | ||
<BR><BR><BR><BR><BR><BR> | <BR><BR><BR><BR><BR><BR> | ||
== 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 vodoočov LCD displeja k procesoru.'' | |||
</div> | |||
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. | |||
<tabs> | |||
<tab name="AVR C"><source lang="cpp"> | |||
#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(); // in LCD | |||
/* 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"><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 | |||
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/ 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, albo 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">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é. | |||
'''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 == | ||
Riadok 256: | Riadok 415: | ||
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. | ||
Verzia z 12:51, 4. marec 2021
![](/sensorwiki/images/thumb/b/b2/Lcd_automatMHD.jpg/200px-Lcd_automatMHD.jpg)
Opis displeja
LCD displeje s radičom Hitachi HD44780 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é.
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ý.
![](/sensorwiki/images/thumb/a/a4/HD44780pinout.png/350px-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
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.
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.
#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(); // in LCD
/* 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/ 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, albo text, počítadlo a jednoduchá animácia ako na obrázkoch nižšie
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 2] priamo od firmy NxP:
5.3 Line Termination and Pullup/Pulldown Resistors
|
Inštrukcie radiča LCD displeja
Inštrukčná sada radiča HD44780 je uvedená v nasledovnej tabuľke:[REF 3]
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 4]
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.
Literatúra
- ↑ Hitachi HD44780U Dot Matrix Liquid Crystal Display Controller/Driver. ADE-207-272(Z), Japan, 1999.
- ↑ Murray Stewart: AN3393: MC9RS08KA Application Hints. NxP/Freescale Semiconductor Application Note, 2007.
- ↑ Napriklad nejaka kniha, alebo datasheet
- ↑ Web source: HD44780U datasheet
Odkazy
- Datasheets
- Basic LCD Datasheet (PDF)
- HD44780 (PDF)
- Wikipedia o HD44780 https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller
- Generátor vlastných znakov
- Arduino Reference Library: LiquidCrystal
- Kniznice 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
- Velmi pekne spracovaný návod na prácu s displejom https://lastminuteengineers.com/arduino-1602-character-lcd-tutorial/