Ovladač řadiče LCD je sada funkcí, které zajišťují komunikaci mezi řadičem LCD připojeným k FPGA a programem v MCU. Komunikace mezi MCU a dekodérem řadiče panelu LCD v FPGA probíhá přes rozhraní SPI.
Řadič je osazen pamětí ROM s výrobcem předdefinovanu sadou znaků obsahující znaky latinské abecedy bez diakritiky, japonské znaky (asi katakana, nechtělo se mi to celé porovnávat) a některé další symboly. Dále pak obsahuje paměť RAM, ve které je možné definovat další znaky zobrazitelné na displeji. Funkce pro komunikaci s řadičem LCD jsou rozděleny do dvou skupin. První skupina funkcí zobrazuje žetězce ze znaků uložených v paměti ROM. Druhá skupina je schopná zobrazovat řetězce obsahující znaky s českou diakritikou, které jsou definovány v CGRAM řadiče LCD.
Ovladače obsahují funkce pro obsluhu LCD připojeného k FPGA. Pro správnou funkci ovladačů je nutné v FPGA připojit řadič LCD k rozhraní SPI. Základní makra a funkce pro obsluhu LCD displeje z MCU a jejich definici najdete v SVN v souboru mcu/libs/lcd/display.h a mcu/libs/lcd/display.c.
Definice základních maker a funkcí, pro použití přerušení:
BASE_ADDR_DISPLAY
Bázová adresa SPI dekodéru řadiče LCD.
void LCD_init(void)
Inicializace ovladače LCD displeje.
void LCD_clear(void)
Vymazání LCD a nastavení kurzoru na první znak.
void LCD_append_char(unsigned char ch)
Zápis znaku na LCD.
void LCD_write_string(char *data)
Zobrazení textového řetězce na LCD (před zápisem dojde k vymazání LCD).
void LCD_append_string(char *data)
Výpis textového řetězce na LCD.
int LCD_rotate()
Rotace textu na displeji o jeden znak vlevo. Vrací 1, pokud je text ve výchozí pozici.
void LCD_send_cmd(unsigned char cmd, unsigned char RS)
Odeslání 8 bitů dat na LCD (data + RS). Parametr cmd slouží k zadání příkazu a jeho doplňkových parametrů dle následující tabulky.
Příkaz |
Doplňkové parametry |
Popis |
|
-- |
vymazání displeje, nastavení adresy DDRAM na 0h |
|
-- |
posun kurzoru na začátek, nastavení aktivní adresy DDRAM na 0x00 |
|
|
posuv kurzoru o 1 znak vlevo |
|
|
posuv kurzoru o 1 znak vpravo |
|
|
posuv zobrazených dat |
|
|
posuv samotného kurzoru |
|
|
zapnutí display |
|
|
vypnutí display |
|
|
zobrazení kurzoru |
|
|
skrytí kurzoru |
|
|
zapnutí blikání kurzoru |
|
|
vypnutí blikání kurzoru |
|
|
posuv textu na display |
|
|
posuv kurzoru |
|
|
směrem posuvu - vpravo |
|
|
směrem posuvu - vlevo |
|
|
8b datová šírka |
|
|
4b datová šírka |
|
|
dvou řádkový režim |
|
|
jednořádkový režim |
|
|
font 5x11 bodů |
|
|
font 5x8 bodů |
|
adresa (0x00 až |
nastavení adresy v DDRAM |
send ASCII (0x100) |
ASCII znak 0xNN |
zápis znaku do vnitřní RAM |
Tabulka :
Znaky české abecedy s diakritikou lze na displeji zobrazit jen nahráním jejich matice do CGRAM paměti displeje. Počet možných znaků je ovšem podstatně větší než kapacita CGRAM (8 znaků). Je tedy třeba zajistit, aby v paměti byly nahrány jen znaky, které jsou právě zobrazovány.
Toto zajišťuje 8-bytové pole, které reprezentuje stav CGRAM v displeji. Pokud se znak, který chceme zobrazit na displeji, nenachází v tomto poli, nahraje se matice znaku na první volnou pozici v CGRAM a hodnota zobrazovaného znaku nahradí adresou do CGRAM. Pokud je CGRAM již zaplněna, nahradí se znak mezerou. Při smazání displeje se obsah CGRAM zneplatní.
Použijte rozhraní ovladače v mcu/libs/lcd_cz/display_cz.h. Knihovna obsahuje všechny malé i velké znaky české abecedy s diakritikou v kódování ISO-8859-2. K jejich zobrazení jsou určeny funkce:
void lcd_string(const char *string)
Odešle na LCD displej řetězec.
void lcd_char(unsigned char ch)
Odešle znak na LCD.
Někdy je v aplikaci potřebné zobrazovat vlastní symboly. Jejich tvorba bude demonstrována na znaku "ý".
Nejdříve je nutné vytvořit matici znaku. Vytváří se matice 8x8 bodů, ale zobrazí se jen 5x8 bodů.
Zápis v programu potom bude vypadat takto:
const char lcd_cz_y_[8] = {0x02, 0x04, 0x11, 0x11, 0x0F, 0x01, 0x0E, 0x00};
Poté je třeba vytvořit kódovací tabulku, ve které vlastní symboly (my_char1, my_char2) umístíme na nepoužívaná místa. Například:
Tcodetable lcd_cz = { my_char1, my_char2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _lcd_cz_Sv, 0, _lcd_cz_Tv, 0, 0, _lcd_cz_Zv, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _lcd_cz_sv, 0, _lcd_cz_tv, 0, 0, _lcd_cz_zv, 0, 0, _lcd_cz_A_, 0, 0, 0, 0, 0, 0, _lcd_cz_Cv, _lcd_cz_E_, 0, 0, _lcd_cz_Ev, _lcd_cz_I_, 0, _lcd_cz_Dv, 0, 0, _lcd_cz_Nv, _lcd_cz_O_, 0, 0, 0, 0, _lcd_cz_Rv, _lcd_cz_Uo, _lcd_cz_U_, 0, 0, _lcd_cz_Y_, 0, 0, 0, _lcd_cz_a_, 0, 0, 0, 0, 0, 0, _lcd_cz_cv, _lcd_cz_e_, 0, 0, _lcd_cz_ev, _lcd_cz_i_, 0, _lcd_cz_dv, 0, 0, _lcd_cz_nv, _lcd_cz_o_, 0, 0, 0, 0, _lcd_cz_rv, _lcd_cz_uo, _lcd_cz_u_, 0, 0, _lcd_cz_y_, 0, 0 };
Znak my_char1
je potom namapován na znak s hodnotou 128, znak my_char2
na 129.
Nakonec pomocí funkce
void lcd_set_code_table(Tcodetable *code_table)
nastavíme kódovací tabulku s vlastními znaky.