Vlastní znaky na lcd nahrání a čtení

Ahoj
Můžete mně někdo prosím polopatě vysvětlit jak nahrát vlastní znaky a následně je zapisovat na lcd.
Např. znak
sipka nahoru je bin 04h,0Eh,15h,04h,04h,04h,00h,00h
sipka dolu je bin 00h,00h,04h,04h,04h,15h,0Eh,04h
ale jak je dostat do displeje v jazyce C.

Díky

Vlastne šipka dolu je
00h,04h,04h,04h,15h,0Eh,04h,00h
spodní řádek musí zůstat volný.

Pošleš :
command 0b01xxxyyy - xxxyyy je adresa CGRAM (Character Generator RAM), kde xxx je číslo znaku (0-7) a yyy = 0.-7. byte znaku
data 1.znak_1.ř., 1.znak_2.ř., … , 1.znak_8.ř., 2.znak_1.ř., … 2.znak_8.ř.
command 0b1xxxxxxx - xxxxxxx je adresa zobrazovací RAM.
data - tyhle data už zase zapisuješ na LCD.

A mimochodem - poslední řádek nemusí zůstat volný.

Vyzkoušek si to tady geocities.com/dinceraydin/djlcdsim/djlcdsim.html

Volné pozice jsou v CGRAM, adresuješ je jako instrukce RS=1, RW=0.
s vystavenou instrukcí 0x40+(ZN<<3). ZN je adresa volného znaku který přepisuješ. Pak následují data pro znak RS=0, RW=0, a pošleš tam 8x svůj grafický vzor.
Pokud používáš pro výstup na LCD printf() tak máš asi přesměrovanou funkci putchar() tak do ní přidáš filtr na svoje user znaky třeba jako že “č” je znak 0, atd…

  1. nepoužívám C (ne, že bych ho neuměl)
  2. RW=0 drátuju přímo v HW (z displeje nečtu), ale to je detail. Pro zápis je vždy RW=0.
  3. je to přesně obráceně - pro zápis command bytu je RS=0, pro data je RS=1.
  4. Správně jsi pochopil, že definované jsou znaky CHR(0) - CHR(7). Není potřena přesměrovávat žádnou funkci. Prostě jenom uložíš předefinovaný znak do tisknutého řetězce. Pochopitelně, CHR(0) se takhle jednoduše do textu vložit nedá, protože C používá CHR(0) k ukončení řetězce… Píšu v ASM a používám taktéž 0 jako ukončovací znak řetězce. CHR(0) musíš vkládat do textu pomocí putchar(0);.

Prázdný znak na displeji je CHR(0x20) neboli ’ ';

Každopádně si ten simulátor v odkazu vyzkoušej, uvidíš přímo, co se s LCD děje.

Omlouvám se za chybu - opisoval jsem ze své starší implementace psané v ASM51 a ta není 2x přehledná…
Nicméně si dost dobře nedokážu představit že budu tisknout texty s diakritikou přes takovou obezličku jako putchar(0).
Prostě napíšu printf(“ěščřžýáí”) a ty znaky odchytí filtr v putchar a nahradí tím co tam patří. Možná jestě tak “\0x00 \n\r”

Jenže Ty ses neptal na implementaci diakritiky, ale na definici vlastních znaků a jejich použití. Pokud jsi diakritiku řešil, pak určitě víš, že to není tak jednoduché. 8 definovatelných znaků nestačí ani na pokrytí všech písmen malých nebo velkých. Česká diakritika ěščřžýáíéóúůďťň má 15 znaků (30 i s velkými písmeny) - nebo 12, když vynechám ďťň. Ale i to je pořád moc. Buď tedy nadefinuješ pouze používané znaky - tedy projdeš všechny zobrazované texty a poskládáš tabulku definovaných znaků nebo musíš diakritiku řešit dynamicky - tj. při každém výpisu na LCD si zjistit, které znaky jsou nadefinované a ty použít a v případě, že vypisuješ text, kde máš znak, který aktuálně není v CGRAM, tak zjistit, který znak není použitý a ten předefinovat a použít. V každém případě musíš volit texty tak, aby se Ti na displeji nebojevilo víc, než 8 různých znaků s diakritikou (opakovat se samozřejmě mohou). Pokud chceš vypisovat texty s diakritikou, je daleko výhodnější použít grafický LCD - třeba klasiku 128x64. Nadefinuješ si znaky v programu a pak už je jenom používáš. A věř mi, že použití grafického LCD není o moc složitější, než toho znakového. Další možností je použití modulu s displejem z Nokia 5110. Je k sehnání kolem 100,- Kč na Aukru nebo na E-Bay. Jeho použití je ještě jednodušší, než ten 128x64. Je sice menší jak rozměrově, tak rozlišením (84x48), ale dá se na něj napsat 14 znaků (6 bodů znak => 5 bodů+1 bod oddělení) při pevné šířce znaku - pokud použiješ proporcionální písmo, tak i víc a 6 řádek (výška znaku = 8 bitů). Návodů, jak jej připojit a použít je na Internetu spousta. Mě knihovnu pro tento LCD (texty+grafika) trvalo napsat necelé 2 dny - a to včetně funkcí pro psaní textu nejenom do řádky (souřadnice % 8), ale i mezi řádky, různé velikosti písma i vykreslení čáry a kružnice, vše s hlídáním okrajů LCD - kompletně v asembleru. Nevýhodou je, že z displeje nelze číst. Tudíž pokud chceš kombinovat obraz s tím, co zapisiješ, tak musíš mít kopii LCD v RAM, což zabere 504 bytů RAMky.
Displej se dá případně vykuchat se starého mobilu. Pokud použiješ LCD z Nokia 3310, 3330, 3510, 6310, tak dostáváš LCD s rozlišením 96x65(67) bodů se shodnou komunikací jako v případě 5110. V případě LCD 3510i je stejné zapojení, ale komunikace je jiná, protože LCD je 96x65 barevný.

Tady jsou odkazy na stránky, kde jsou připojení popsána :
module.ro/
module.ro/nokia_3510.html
mikrocontroller.net/articles/LCD#NOKIA_6100

Samozřejmě, když si dáš práci s hledáním, najdeš toho víc.

A modul s LCD a podsvícením můžeš pořídit třeba tady :
aukro.cz/graficky-lcd-displej-mo … 10247.html

U obvyklého displeje 2x16 je dost vysoká pravděpodobnost, že té diakritiky bude tak málo, že bude stačit definovat znaky dynamicky, až podle potřeby (textu se tam moc nevejde). A raději použít vlastní funkci k zobrazení textu, printf je dost velký žrout paměti i výkonu.

Křemík je levný :slight_smile: Morpheus si už snad vybere ze zmíněných možností.

Takže jsem to zkousel a nedaří se ani v tom simulatoru.
Můžete sem prosím vložit kod kde budou instrukce s popisama pro 4 bitovou komunikaci díky.

Proč proboha každej začíná se složitější a méně přehlednou 4-bitovou komunikací ???

Ok už to funguje špatně jsem to adresoval.

Třeba proto že se učím a na 8 bitovou komunikaci už nemám volné piny

Alespoň se snažíš a na chybu jsi přišel. Dobrý krok správným směrem … Na druhý straně, já jsem taky začínal se 4-bitovou komunikací. Ona je sice složitější, ale ne o moc, jen je trochu méně přehledná. Spolu s výhodou úspory 4 pinů s sebou nese i nějaké ty nevýhody. Trošku složitější komunikace (což při délce zpracování dat LCD displejem není rozhodující), tak třeba to, že inicializace je o kus náročnější. Musíš například ošetřit i to, že zařízení nejenom zapínáš, ale i třeba jenom restartuješ MCU a LCD může mít (a nemusí) rozpracovanou 1. polovinu 4-bitové komunikace.