Výběr LCD 128x64

Ahoj. Tak bohužel, s touhle “knihovnou” na 8-bitovou komunikaci zapomeň. Upřímně řečeno, takhle napsaný kód bych se styděl dát do vlastního domácího rychloprojektu, natož, abych ho dal k dispozici na net …

V *.h mají být prototypy funkcí, vlastní kód se píše do *.c souborů. Tohle je prasárna a ne knihovna.

V každém případě : Klidně nech datový port LCD s procesorem propojený celý (všech 8 bitů) a na začátku programu na celý port pošli 0. Knihovna na portu pro LCD hýbe jenom bitama 4-7, takže nevadí, že má bity 0-3 připojené. Každopádně “knihovna” není ani napsaná správně podle datasheetu :

[code]void Lcd_Init()
{
Lcd_Port(0x00);
__delay_ms(20); // Nehýbalo se řídícími signály, tak proč tady ten delay ???
Lcd_Cmd(0x03); // Nastavení na 8 bitů
__delay_ms(5); // Stačí 2 ms, ale proč ne …
Lcd_Cmd(0x03); // Nastavení na 8 bitů
__delay_ms(11); // Nechápu, proč je tady 11 ms
Lcd_Cmd(0x03); // Nastavení na 8 bitů
// tady už delay chybí (min. 1,53 ms)
/////////////////////////////////////////////////////
Lcd_Cmd(0x02); // Nastavení na 4 bity
// tady opět delay chybí (min. 1,53 ms)

// Dál už běží komunikace po 4 bitech
Lcd_Cmd(0x02); // Nastavení na 4 bity, 2 řádky, Font 5x7
Lcd_Cmd(0x08); // Nastavení na 4 bity, 2 řádky, Font 5x7
// tady opět delay chybí (min. 1,53 ms)

Lcd_Cmd(0x00); // Display ON, Cursor OFF, Blinkání kurzoru OFF
Lcd_Cmd(0x0C); // Display ON, Cursor OFF, Blinkání kurzoru OFF
// tady opět delay chybí (min. 39 us)

Lcd_Cmd(0x00); // Kurzor se bude posouvat doprava, Obraz se posouvat nebude
Lcd_Cmd(0x06); // Kurzor se bude posouvat doprava, Obraz se posouvat nebude
// tady opět delay chybí (min. 39 us)
}[/code]

Po každém zápisu do RAM displeje (a je jedno, jestli je to do RAMky znakové nebo generátoru znaků) je třeba počkat 43 us. Mezi jednotlivými polovinami bytu není potřeba čekat.

void Lcd_Write_Char(char a) { char temp,y; temp = a&0x0F; y = a&0xF0; RS = 1; // => RS = 1 Lcd_Port(y>>4); //Data transfer EN = 1; __delay_us(40); // Tady stačí 1-2 us EN = 0; Lcd_Port(temp); EN = 1; __delay_us(40); // Tady stačí 1-2 us EN = 0; // tady delay chybí (min. 43 us) }

A jsou tam další chyby, ale až to upravíš alespoň podle mých poznámek, mohlo by to již fungovat. Pokud tomu, kdo knihovnu psal, displej fungoval, pak měl buď obrovskou kliku nebo pekelně rychlý displej. Bral jsem časy z datasheetu od 16x2 znaků LCD od Display Electronic GmbH. Jiné displeje budou mít časy jiné. Měl jsem tady displeje rychlejší, ale i pomalejší. Ve svojí knihovně mám tedy časy delší, aby pokud možno pokryly maximum displejů. Jakmile narazím na LCD, který to nestíhá, tak časy zase podloužím, ale dával jsem trochu rezervu (místo 43 us jsem dával 60 us apod.), takže by snad měly stíhat všechny displeje.

Kdyby sis vzal k ruce datasheet, tak by sis program pro ovládání napsal sám a možná i líp, než tenhle paskvil, a ještě by ses něco přiučil.

A ještě k té inicializaci. To přepnutí do 8-bitového režimu je tam sice 3x (na první pohled zbytečně), ale je k tomu dobrý důvod. Nechci to tu znova rozepisovat, ale když použiješ vyhledávání, určitě to tady na serveru najdeš, už jsem to tu vysvětloval.