Ing. Josef Grosman TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií Tento materiál vznikl v rámci projektu ESF CZ.1.07/2.2.00/07.0247, který je spolufinancován Evropským sociálním fondem a státním rozpočtem ČR
LCD
AT89C51CC03 LCD 2 řádky po 16 znacích, znaky bodově, maticově
AT89C51CC03 Řadič LCD HD44780 LCD 2 řádky po 16 znacích, znaky bodově, maticově
Řízení, 3 bity AT89C51CC03 Řadič LCD HD44780 LCD Data, 4 bity Ovládání LCD ovládání řadiče 2 řádky po 16 znacích, znaky bodově, maticově
Řízení, 3 bity AT89C51CC03 Řadič LCD HD44780 LCD Data, 4 bity Ovládání LCD ovládání řadiče 2 řádky po 16 znacích, znaky bodově, maticově AT89C51CC03 HD44780 význam P2.4 RS 0 příkaz (povel, instrukce) 1 data P2.5 R/W 0 zápis 1 čtení P2.6 EN Po dobu EN=1 probíhá zápis/čtení P2.0 - P2.3 Data 4..7 Data v čtyřbitovém režimu (nibble)
Řízení, 3 bity AT89C51CC03 Řadič LCD HD44780 LCD Data, 4 bity Ovládání LCD ovládání řadiče 2 řádky po 16 znacích, znaky bodově, maticově AT89C51CC03 HD44780 význam P2.4 RS 0 příkaz (povel, instrukce) 1 data P2.5 R/W 0 zápis 1 čtení P2.6 EN Po dobu EN=1 probíhá zápis/čtení P2.0 - P2.3 Data 4..7 Data v čtyřbitovém režimu (nibble) EN Data 4. 7. bit 0. 3. bit
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F....
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F....
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F....
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F....
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F.... IR příkaz
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F.... IR příkaz RS R/W význam 1 0 zápis dat do DR a DDRAM 1 1 čtení dat - řídké 0 0 zápis příkazu do IR 0 1 čtení stavu
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F.... IR příkaz RS R/W význam 1 0 zápis dat do DR a DDRAM 1 1 čtení dat - řídké 0 0 zápis příkazu do IR 0 1 čtení stavu BF a a a a a a a AC - adresa
HD44780 Display Data RAM - DDRAM 0 1 2 3 4 5 6 7 8 9 A B C D E F.... AC adresa DR data 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F.... IR příkaz RS R/W význam 1 0 zápis dat do DR a DDRAM 1 1 čtení dat - řídké 0 0 zápis příkazu do IR 0 1 čtení stavu BF a a a a a a a AC - adresa 1 Operace zápisu probíhá, nerušit 0 Volno pro další operaci
Příkaz 00000001 Nulování displeje, mezery (20H) obsah DDRAM, 0 AC 0000001x Návrat kurzoru, 0 AC, DDRAM se nemění 000001bb Vstupní mod, posuv kurzoru/displeje při vkládání znaků - 00000110 00001bbb 0001bbbb 001bbbxx 01aaaaaa 1aaaaaaa Řízení displeje, zapnutí/vypnutí displeje a kurzoru (blikání) Pusuv kurzoru/displeje (bez vkládání znaků) Nastavení displeje, 8bitů/4bity, řádky LCD(1/2), matice znaku(5x7/5x10) 2 řádkový LCD, 4 bitový mód: 00101000 Speciální pro generování znaků Změna adresy aaaaaaa AC (11000000 na 2. řádek)
Inicializace 1. Automatická inicializace po připojení napájení (Power On) - nulování displeje - nastavení displeje na 8bitový mód, 1 řádkový LCD, 5x7 bodů (00110000) - displej a kurzor vypnut (00001000) - posuv kurzoru doprava při vkládání znaků (00000110)
Inicializace 1. Automatická inicializace po připojení napájení (Power On) - nulování displeje - nastavení displeje na 8bitový mód, 1 řádkový LCD, 5x7 bodů (00110000) - displej a kurzor vypnut (00001000) - posuv kurzoru doprava při vkládání znaků (00000110) 2. SW inicializace - nezbytná pro 4 bitový mód a 2 řádkový LCD - minimálně 15 ms po připojení napájení - příkaz: 0011xxxx (pouze nibble) - čekání min. 4,1 ms - příkaz: 0011xxxx (pouze nibble) - čekání min. 100 s - příkaz: 0011xxxx (pouze nibble) - čekání až BF=0 (dále po každém přenosu) - příkaz: 0010xxxx (pouze nibble), přepnutí na 4 bitový mód - příkaz: 00101000 4 bitový mód, 2 řádkový displej - příkaz: 00000001 nulování displeje - příkaz: 00000110 posuv kurzoru doprava při vkládání znaků - příkaz: 00001100 zapnutí displeje (00001110 i kurzoru)
V souboru LCD.C funkce: void InitLcd(void) - pro inicializaci void putchar(char c) využívá funkce printf
V souboru LCD.C funkce: void InitLcd(void) - pro inicializaci void putchar(char c) využívá funkce printf Poznámka: znak \n nebo zápis 17. znaku na řádek: přechod na 2. řádek, je-li volný, jinak rolování 2. řádku na 1. a psaní na 2.řádek znak \r : za začátek 2. řádku a jeho následné přepisování funkce printf() má implementováno pouze zobrazení celých čísel lze použít specifikátory %d,%x,%c nepoužívat specifikátory %f,%g,%e.
Příkládek - C Po spuštění se na displeji objeví informace: Program 1 stisk lib. klav. Po stisknutí klávesy na klávesnici se její znak zobrazí na LCD: stisknuto: h z h hodnota (0 až 15) z odpovídající znak (0 9, A D, #,*) Znak zůstane zobrazen i po uvolnění klávesy až do stisknutí jiné klávesy Současně na sloupcových diodách svítí příslušná LED ( klávesa 0 až 9), nebo žádná nesvítí (ostatní klávesy) viz příklad pro Ledbar.
#include <AT89C51CC03.H> #include <stdio.h> #include "typy.h" void LBarInit(void); void LedBar(word); bit KeyHit(void); byte KeyByte(void); char KeyChar(void); void LcdInit(void); byte klav=0xff; void main(void) { LBarInit(); LcdInit(); printf("program c.1\nstisk lib. klav."); while(1) { if(keyhit()) { byte key = KeyByte(); if(key!=klav) { char znak=keychar(); LedBar(1<<(klav=key)); printf("\nstisknuto\n%3d %c",klav,znak); } } } }
#include <AT89C51CC03.H> #include <stdio.h> #include "typy.h" void LBarInit(void); void LedBar(word); bit KeyHit(void); byte KeyByte(void); char KeyChar(void); void LcdInit(void); char ToChar(byte); byte klav=0xff; void main(void) { LBarInit(); LcdInit(); printf("program c.1\nstisk lib. klav."); while(1) { if(keyhit()) { byte key = KeyByte(); if(key!=klav) { char znak=tochar(key); LedBar(1<<(klav=key)); printf("\nstisknuto\n%3d %c",klav,znak); } } } } char ToChar(byte b) { switch(b) { case 14: return * ; case 15: return # ; default: if(b<10) return (b+ 0 ); else return (b-10+ A ); } }