Programowanie wyświetlacza LCD według: http://radziu.dxp.pl Wyświetlacz graficzny 2 x 16 ma 2 wiersze, 16 znaków w wierszu, każdy znak jest wyświetlany w matrycy 5 x 8 pikseli. (2*8 wierszy * 5*16 kolumn = 1280 pixeli). Wyświetlacz montowany jest na płytce drukowanej, do której przymocowane jest szklane pole odczytowe. Kontroler tej płytki, tu posłużymy się wersją HD44780, jest pomostem pomiędzy użytkownikiem a matrycą punktów wyświetlacza. Redukuje on liczbę potrzebnych linii sterujących do 11 (8 bitów znaku oraz 3 bity sterujące: RS, RW i E). GND(VSS) i VCC - masa i zasilanie V0 - regulacja kontrastu RS - rodzaj przesyłanej informacji: 0 - rozkaz sterujący wyswietlaczem, 1 - dana do wyświetlenia RW - kierunek przesyłu danych: 0 - zapis do wyświetlacza, 1 - odczyt RS RW dzialanie 0 0 zapis rozkazu do wyświetlacza 1 0 zapis danej (znaku) do pamięci wyświetlacza 0 1 odczyt stanu wyświetlacza (bieżąca pozycja w DDRAM i flaga zajętości) 1 1 odczyt danej (znaku) z wyświetlacza E - (enable): 1 jest zezwoleniem na odczyt z szyny danych D0 D7 - szyna danych : kod znaku lub rozkaz sterujący, D7 - najstarszy bit, D0 - najmłodszy bit BL+, BL- podświetlenie wyświetlacza (+ anoda, - masa) Generator znaków CG ROM (ang. Character Generator ROM ) jest to pamięć typu ROM, wbudowana w strukturę sterownika HD44780, zawiera kombinacje zgaszonych i zapalonych pikseli w matrycy każego znaku. Użytkownik może zdefiniować max 8 znaków własnych, poprzez odpowiednie ustawianie linii sterujących modułu (D0...D7, RW, RS, E). Te znaki nie będą pamietane w generatorze, trzeba je generować programowo za każdym razem po włączeniu uc. Wyświetlenie znaku polega na umieszczeniu go w tzw. pamięci wyświetlania, w skrócie DDRAM (ang. Display Data RAM ). Pamięć ta ma pojemność 80 bajtów - tyle znaków może mieć wiadomość zapisana w wyświetlaczu. Wyświetlacz LCD typu 2x40 znaków pokaże całość takiej wiadomości, ale na wyświetlaczu o mniejszym polu odczytu np. 2x16 znaków, widoczna będzie tylko pierwsza część wpisanego tekstu. Lista rozkazów kontrolera HD44780
Display clear - (RS = 0, R/W = 0, dane = 00000001) - rozkaz powoduje wyczyszczenie wyświetlacza poprzez wypełnienie go spacjami, ustawienie trybu zapisu danych od pozycji w lewym górnym rogu wyświetlacza oraz wyłączenie trybu przesuwania okna; maksymalny czas trwania instrukcji - 1,64ms Display/cursor home - (RS - 0, R/W = 0, dane = 0000001x) - rozkaz powoduje ustawienie kursora na pozycji pierwszego znaku w pierwszej linii; maksymalny czas trwania instrukcji 1,64ms Entry mode set - (RS = 0; R/W = 0, dane = 000001IS) - określenie trybu pracy kursora/okna wyświetlacza : - dla S = 1 po zapisaniu znaku do wyświetlacza kursor nie zmienia położenia, natomiast przesuwa się cała zawartość wyświetlacza - dla S = 0 po zapisaniu znaku do wyświetlacza kursor zmienia położenie, a przesuwanie okna jest wyłączone - dla I = 1 kursor lub okno wyświetlacza przesuwa się w prawo (inkrementacja adresu znaku) - dla I = 0 kursor lub okno wyświetlacza przesuwa się w lewo (dekrementacja adresu znaku) Maksymalny czas trwania instrukcji - 40us Display ON/OFF - (RS = 0, R/W = 0, dane = 00001DCB) - dla D = 1 - włączenie wyświetlacza - dla D = 0 - wyłączenie wyświetlacza - dla C = 1 - włączenie kursora - dla C = 0 - wyłączenie kursora - dla B = 1 - włączenie migania kursora - dla B = 0 - wyłączenie migania kursora Display cursor shift - (RS = 0, R/W = 0, dane = 0001SRxx) - dla S = 1 - przesuwana jest zawartość okna - dla S = 0 - przesuwany jest kursor - dla R = 1 - kierunek przesuwu w prawo - dla R = 0 - kierunek przesuwu w lewo Function set (RS= 0, R/W = 0, dane = 001DNFxx) - dla D = 1 - interfejs 8-bitowy - dla D = 0 - interfejs 4-bitowy - dla N = 1 - wyświetlacz dwuwierszowy - dla N = 0 - wyświetlacz jednowierszowy - dla F = 1 - matryca znaków 5*10 punktów - dla F = 0 - matryca znaków 5*7punktów CG RAM set - (RS= 0, RW = 0, dane = 01AAALLL) - ustawia adres pamięci generatora znaków. AAA - 3- bitowy adres znaku, LLL - 3-bitowy numer linii składającej się na graficzne odwzorowanie znaku. DD RAM set - (RS = 0, R/W = 0, dane = 1AAAAAAA) - ustawia adres pamięci wyświetlacza, pod który nastąpi zapis (bądź odczyt) danych operacją Data write lub Data read. Busy flag read - (RS = 0, R/W = 1, dane = BAAAAAAA) - odczyt flagi zajętości i adresu pamięci wyświetlacza. B - flaga zajętości wyświetlacza, AAAAAAA - 7-bitowy adres pamięci. Data read - (RS = 1, R/W= 1, dane = odczytywany bajt danych) - odczyt danych z pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set) Data write - (RS = 1, R/W = 0, dane = zapisywany bajt danych) - zapis danych do pamięci wyświetlacza, bądź pamięci CG RAM (jeśli poprzednio wydano komendę CG RAM set)
Przykład. Wyświetlanie tekstu w trybie sterowania 8-bitowego bez odczytu flagi zajetości Podłącz pierwsze trzy piny wyświetlacza 1 - VSS -> masa 2 - VDD -> zasilanie 3 - V0 (kontrast) -> 0V, masa Jeśli teraz prześlesz program do uc, na wyświetlaczu powinien pokazać się pierwszy (górny) wiersz czarnych prostokącików. Podłącz pint sterujące, na przykad do portu C mikrokontrolera 4 - RS -> PC0 (pin 23) 5 - RW -> masa (nie będziemy nic odczytywać z wyświetlacza) 6 - E -> PC2 (pin 25) Podłącz szynę danych D0..D7 wyświetlacza, np do portu D mikrokontrolera D0 -> PD0 (pin 2) D1 -> PD1 (pin 3) D2 -> PD2 (pin 4) D3 -> PD3 (pin 5) D4 -> PD4 (pin 6) D5 -> PD5 (pin 11) D6 -> PD6 (pin 12) D7 -> PD7 (pin 13) Podłącz podświetlenie wyświetlacza 15 - A (BL+) -> zasilanie 16 - K (BL-) -> masa Do nowego projektu AVR zaimportuj pliki lcd.h i lcd.c (File/Import/General/File System/From directory), zaznacz wybrane pliki, rozwiń Into Folder, wybierz folder główny swojego projektu, kliknij Finish. W pliku main.c umieść #include "lcd.h" Plik nagłówkowy lcd.h i plik lcd.c zawierają definicje wybranych stałych i funkcji, przydatnych do sterowania wyświetlaczem LCD z kontrolerem HD44780 #include <avr/io.h> #include "lcd.h" int main() { LCD_Initalize() ; - - - - - - - - - - - - - - - - main.c // inicjalizacja wyświetlacza char t[] = "HAKUNA MATATA ; // ten tekst wypiszemy na wyświetlaczu // LCD_WriteText(t); // można tak, wykorzystując funkcję zdefiniowaną w pliku lcd.c unsigned int n = strlen(t) int i = 0; while (i<n) { LCD_WriteData(t[i]); i++; while(1) { return 0; // albo tak, wypisując samodzielnie w pętli po jednym znaku
#include <avr/io.h> - - - - - - - - - - - - - - - - lcd.h // Konfiguracja sterowania wyświetlaczem HD44780 przez mikrokontroler #define LCD_DDR_DATA DDRD // rejestr kierunkowy portu danych dla wyświetlacza #define LCD_PORT_DATA PORTD // rejestr portu wyjscia danych dla wyswietlacza #define LCD_DDR_CONTROL DDRC // rejestr kierunkowy portu sterowania wyświetlaczem #define LCD_PORT_CONTROL PORTC // rejestr kierunkowy portu sterowania wyświetlaczem #define LCD_RS PC0 // bit sterujący linią RS #define LCD_E PC2 // bit sterujący linią E // Instrukcje kontrolera Hitachi HD44780 #define HD44780_CLEAR 0x01 #define HD44780_HOME 0x02 #define HD44780_ENTRY_MODE 0x04 #define HD44780_EM_SHIFT_CURSOR 0 #define HD44780_EM_SHIFT_DISPLAY 1 #define HD44780_EM_DECREMENT 0 #define HD44780_EM_INCREMENT2 #define HD44780_DISPLAY_ONOFF 0x08 #define HD44780_DISPLAY_OFF 0 #define HD44780_DISPLAY_ON 4 #define HD44780_CURSOR_OFF 0 #define HD44780_CURSOR_ON 2 #define HD44780_CURSOR_NOBLINK 0 #define HD44780_CURSOR_BLINK 1 #define HD44780_DISPLAY_CURSOR_SHIFT 0x10 #define HD44780_SHIFT_CURSOR 0 #define HD44780_SHIFT_DISPLAY 8 #define HD44780_SHIFT_LEFT 0 #define HD44780_SHIFT_RIGHT 4 #define HD44780_FUNCTION_SET 0x20 #define HD44780_FONT5x7 0 #define HD44780_FONT5x10 4 #define HD44780_ONE_LINE 0 #define HD44780_TWO_LINE 8 #define HD44780_4_BIT 0 #define HD44780_8_BIT 16 #define HD44780_CGRAM_SET #define HD44780_DDRAM_SET 0x40 0x80 void LCD_Write(unsigned char dana); void LCD_WriteCommand(unsigned char rozkaz); void LCD_WriteData(unsigned char dana); void LCD_WriteText(char * text); // void LCD_GoTo(unsigned char x, unsigned char y); // void LCD_Clear(void); // void LCD_Home(void); void LCD_Initalize();
#include "lcd.h" // #include <string.h> #include <util/delay.h> - - - - - - - - - - - - - - - - lcd.c // zapis bajta do wyświetlacza (bez rozróżnienia rozkaz/dane). void LCD_Write(unsigned char dana) { LCD_PORT_CONTROL = 1<<LCD_E; // 1 - zezwolenie na zapis do wyświetlacza LCD_PORT_DATA = dana; LCD_PORT_CONTROL &= ~(1<<LCD_E); // 0 - odwołanie zezwolenia na zapis _delay_us(50); // zapis rozkazu do wyświetlacza void LCD_WriteCommand(unsigned char rozkaz) { LCD_PORT_CONTROL &= ~(1<<LCD_RS); LCD_Write(rozkaz); // bit RS ustaw na 0 - zapis rozkazu // zapis danej do wyświetlacza void LCD_WriteData(unsigned char dana) { LCD_PORT_CONTROL = (1<<LCD_RS); LCD_Write(dana); // bit RS ustaw na 1 - zapis danej // wyświetlenie tekstu na wyswietlaczu. // void LCD_WriteText(char * text) { // while(*text) LCD_WriteData(*text++); // // ustawienie współrzędnych ekranowych // void LCD_GoTo(unsigned char x, unsigned char y) { // LCD_WriteCommand(HD44780_DDRAM_SET (x + (0x40 * y))); // // czyszczenie ekranu // void LCD_Clear(void) { // LCD_WriteCommand(HD44780_CLEAR); // _delay_ms(2); // // przywrócenie początkowych współrzędnych wyświetlacza. // void LCD_Home(void) { // LCD_WriteCommand(HD44780_HOME); // _delay_ms(2); // // inicjalizacja kontrolera HD44780: // włączenie wyświetlacza, czyszczenie pamięci (wypełnienie spacjami) // ustwienie trybu pracy: sterowanie 8- lub 4-bitowe, 2 lub 1 wierszy, matryca znaku 5x7 lub 5x10 pikseli // właczenie/wyłaczenie kursora, ustawienie pozycji kursowa, migotanie kursora void LCD_Initalize() { unsigned char i; LCD_DDR_DATA = 0xFF; // wszystkie bity ustaw na 1, będą wyjsciami LCD_DDR_CONTROL = (1<<LCD_RS) (1<<LCD_E); // bity RS i E na 1, wyjscia
_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego LCD_PORT_CONTROL &= ~(1<<LCD_RS); // wyzerowanie linii RS, wysyłanie rozkazów LCD_PORT_CONTROL &= ~(1<<LCD_E); // wyzerowanie linii E for(i = 0; i < 3; i++) { // trzykrotne powtórzenie wysłanie rozkazu: 0011 1111 LCD_Write(0x3F); _delay_ms(5); _delay_ms(1); LCD_WriteCommand(HD44780_FUNCTION_SET HD44780_FONT5x7 HD44780_TWO_LINE HD44780_8_BIT); // sterowanie 8-bitowe, 2-linie, znak 5x7 pixeli LCD_WriteCommand(HD44780_DISPLAY_ONOFF HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosci pamieci DDRAM _delay_ms(2); LCD_WriteCommand(HD44780_ENTRY_MODE HD44780_EM_SHIFT_CURSOR HD44780_EM_INCREMENT);// tryb pracy kursowa: przesuwanie kursora po wypisaniu znaku LCD_WriteCommand(HD44780_DISPLAY_ONOFF HD44780_DISPLAY_ON HD44780_CURSOR_OFF HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania