Čeština / English
Login

Firmware / Ovladač řadiče LCD pro MCU

Autoři: Karel Slaný (); Pavel Bartoš ()
Update: 26.3.2009

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.

1. Ovladač řadiče přerušení - znaky v ROM

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

LCD_CLEAR_DISPLAY (0x01)

--

vymazání displeje, nastavení adresy DDRAM na 0h

LCD_CURSOR_AT_HOME (0x02)

--

posun kurzoru na začátek, nastavení aktivní adresy DDRAM na 0x00

LCD_ENTRY_MODE_SET (0x04)

LCD_CURSOR_MOVE_DEC (0x00)

posuv kurzoru o 1 znak vlevo

LCD_CURSOR_MOVE_INC (0x02)

posuv kurzoru o 1 znak vpravo

LCD_SHIFT_ENABLE (0x01)

posuv zobrazených dat

LCD_SHIFT_DISABLE (0x00)

posuv samotného kurzoru

LCD_DISPLAY_ON_OFF (0x08)

LCD_DISPLAY_ON (0x04)

zapnutí display

LCD_DISPLAY_OFF (0x00)

vypnutí display

LCD_CURSOR_ON (0x02)

zobrazení kurzoru

LCD_CURSOR_OFF (0x00)

skrytí kurzoru

LCD_BLINKING_ON (0x01)

zapnutí blikání kurzoru

LCD_BLINKING_OFF (0x00)

vypnutí blikání kurzoru

LCD_CURSOR_DISPLAY_SHIFT (0x10)

LCD_SHIFT_DISPLAY (0x08)

posuv textu na display

LCD_SHIFT_CURSOR (0x00)

posuv kurzoru

LCD_SHIFT_DIR_RIGHT (0x04)

směrem posuvu - vpravo

LCD_SHIFT_DIR_LEFT (0x00)

směrem posuvu - vlevo

LCD_FUNCTION_SET (0x20)

LCD_DATA_LENGTH_8BIT (0x10)

8b datová šírka

LCD_DATA_LENGTH_4BIT (0x00)

4b datová šírka

LCD_LINES_TWO (0x08)

dvou řádkový režim

LCD_LINES_ONE (0x00)

jednořádkový režim

LCD_FONT_5x11 (0x04)

font 5x11 bodů

LCD_FONT_5x8 (0x00)

font 5x8 bodů

LCD_SET_DDRAM_ADDR (0x080)

adresa (0x00 až LCD_DDRAM_LIMIT)

nastavení adresy v DDRAM

send ASCII (0x100)

ASCII znak 0xNN

zápis znaku do vnitřní RAM

Tabulka : Tabulka příkazů pro funkci LCD_send_cmd

2. České znaky na LCD

2.1. Princip

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í.

2.2. Použití

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.

2.3. Tvorba vlastních znaků

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ů.

lcd_cz_char001.png

Obrázek 2.1: Matice znaku "ý".

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.

Zobrazeno: 2758x Naposledy: 23.9.2017 12:46:21