Vlastna knižnica pre HD44780 - 4 bit mód a špecifické úpravy

Vysvětlení je jednoduché - Po resetu MCU je LCD ve 4-bitovém režimu, ale ne vždycky má LCD přijatou celou instrukci/data. Stává se (obzvlášť, pokud zapisuješ do LCD hodně často), že vyresetuješ MCU v okamžiku, kdy do máš do LCD odeslanou první polovinu bytu. V tuhle chvíli nastává problém, že Ty začneš odesílat 4-bitově instrukce znova, ale LCD přijme 1. polovinu instrukce jako 2. polovinu té, kterou měl rozodeslanou. Tím pádem se Ti rozhodí synchronizace instrukcí až do nějakého náhodného sesynchronizování. Podívej se na následující kód :

void LCD_init()
{
   LCD_CNTRL_DDR = 0xFF;
   LCD_CNTRL_PORT = 0x00;
   LCD_DATA_DDR = 0xFF;
   LCD_DATA_PORT = 0x00;
 
   _delay_ms(100);    // Start LCD vyžaduje alespoň 30ms. (dávám s rezervou 100 ms)

// ---------------------------------------------------------------------------------------------------------
// Následující sekvenci je nutné použít pouze v případě 4-bitové komunikace.

   LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);
   LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
   LCD_DATA_PORT = 0x30; // pro LCD na bitech 7-4 - přepnutí do 8-bitové komunikace
 
   LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
   _delay_us(1);
   LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
   _delay_us(40);
// 1. - buď se a) dokončila rozpracovaná 4-bit komunikace nebo se b) zahájilo přepnutí do 8-bit komunikace.

   LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
   _delay_us(1);
   LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
   _delay_us(40);
// 2. - buď se b) dokončilo přepnutí do 8-bit komunikace nebo se c) zahájilo přepnutí do 8-bit komunikace

   LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
   _delay_us(1);
   LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
   _delay_us(40);
// 3. - buď se c) dokončilo přepnutí do 8-bit komunikace nebo se d) znovu přepnulo do 8-bit komunikace

// Teď je LCD zaručeně v 8-bitovém režimu

   LCD_DATA_PORT = 0x20; // pro LCD na bitech 7-4 - přepnutí do 4-bitové komunikace
 
   LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
   _delay_us(1);
   LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
   _delay_us(40);
// Konec sekvence.
// ---------------------------------------------------------------------------------------------------------


// Teď je komunikace 4-bitová a můžou se využít funkce pro 4-bitový zápis.
// Ještě však není nastaven počet řádků ani typ fontu znaků (5x7 nebo 5x10)


// Příklad inicializace LCD :
   LCD_Instrukce(0x28); // nastavit 4-bitovou komunikaci, 2(4) řádky, font 5x7
   _delay_us(40);
    LCD_Instrukce(0x06);   // Posouvat kurzor doprava, neposouvat displej
   _delay_us(40);
    LCD_Instrukce(0x01);   // Smazat LCD
   _delay_ms(2);            // Smazání LCD trvá 1,53 ms
    LCD_Instrukce(0x0C);   // Zapnout zobrazení na LCD, bez blikání, bez kurzoru
   _delay_us(40);

}

Po zapnutí, kdy je LCD v 8-bitovém režimu se prostě 3x znova přepne do 8-bitového režimu, pak teprve do 4-bitového a pak se posílají data a instrukce 4-bitove.