jak na LCD

Chtěl jsem poprosit o radu.Stále na netu hledám,ale úspěchy jsou jen malinké.Mám LCD 2x16 znaků nějaké GDM1602A-výrobce Xiamen.Stáhl jsem si datasheet.Zapojení vypadá stejné jako s HD44780.Máte někdo s tímhle LCD zkušenosti?Dá se použít rutina k HD44780?
Uvažuji o PIC16F84,ten by měl stačit.Dále si lámu hlavu nad takovou věcí-poslat text do LCD bych jakžtakž chápal,ale pokud budu mít nějakou proměnnou např POCET,která se bude zvnějšku přes pin např.RA4 inkrementovat,jak pošlu na display stav téhle měnící se proměnné?
A jak by se dala uložit hodnota POCET jejíž stav by byl např 788 de EEPROM ?
Odpusťte mi mé trapné otázky,snažím se to pochopit.Díky moc všem.

Ahoj Oldo

Dost možná bude komptibilní s HD44780, ale zkus napsat o tom displeji více informací. Kolik má pinů, jak vypadá, apod. Také můžeš přiložit foto, ale jak jsem říkal, pravděpodobně to bude HD44780. Jiné komunikační protokoly se u maticových displejů téměř nepoužívají.

Jinak pokud bys kupoval nějaký displej 16 x 2, nebude tě to stát mnoho - viz. MC1602E-SYL/H.

Zkus aspoň náhradu 16F627. Umí vše co PIC16F84 plus něco navíc a hlavně je to aktuální mikropočítač. 16F84 se už nepoužívá.

Nemůžeš poslat. Proměnou musíš nejprve “převést” na text. Chce to podprogram, který ti číselnou hodnotu převede na ASCII.

Jak asi víš, tak do jedné buňky uložíš maximálně 255 (256 hodnot). Větší hodnotu musíš tedy rozdělit do dvou paměťových buněk. Ve tvém případě například takto:
00000011
00010100

Neomlouvej se, to fórum je pro tebe a pro všechny, kteří mají zájem se něco dozvědět.

Děkuji moc adminovi za ochotu.
Takže to LCD GDM1602A je plně kompatibilní s HD4780.Datasheet lze stáhnout na stránkách výrobce z www.xmocular.com.
Jen tam chybí podsvícení,takže jej asi přepojím na ATM1602B,koupeným v GMelectronic/zatím jsem k němu ale ještě nenašel datasheet/
Program na počítání dvou externích proměnných mám hotov.Na ovládání LCD jsem použil dvou rutin stáhlých z netu.Jedna je na zobrazení textu a druhá byla na převod proměnné do 99999D na ASCII.Rutiny jsem trošku upravil dle své potřeby a doplnil testováním 2pinů na portu A,jež mi zbyly.Display je sice ovládán v 8bitovém režimu,ale to mi nevadí,neboť více portů nepotřebuji.Nezabýval jsem se Schmitovým KO na ošetření zákmitů,ale jen jsem přidal k odporům 10kohmů k zemi 2 kondenzátory 100nf,čítání vypadá v pořádku a bez chyb.
Použil jsem sice PIC16F84A,ale jen z důvodu,že jich mám moc v šuplíku,ale naprosto souhlasím s adminem,že má další konstrukce již bude s novějším typem.Např s PIC16F877A,který již delší dobu studuji a líbí se mi výbavou a možnostmi.
Chtěl jsem se jen zeptat,jestli je nutné po dosažení stavu 99999 proměnné nulovat,nebo se vynulují v další inkrementaci samy a nevadí to?
Poslední věc,jež řeším je uložení dat do EEPROM.Nevím,jestli je vhodné po každé inkrementaci ukládat hodnoty do EEPROM kvůli životnosti paměti,neboť předpokládané hodnoty proměnných za měsíc budou zhruba 1000D.Jedná se mi jen o to,aby při výpadku proudu došlo znova k načtení stavu proměnných a ne 00000.Lámu si hlavu jaké by bylo vhodné řešení?

P.S. pro admina:
Vím,že ses ptal na USB-ICD2,jestli by to podle tebe mělo smysl,založil bych thread pod názvem PIC -ICD2 USB,dal tam schéma plošný spoj,dostupnost součástek,zkušenosti ap.Momentálně jej stavím a vypadá dost dobře.Jedná se o konstrukci od “potya” využívající PIC18F4550.

Bylo vytvořeno téma jen pro ICD2. Pokud bude někdo chtít pokračovat v diskuzi o ICD2, prosím, nepokračujte v tomto vlákně, ale vstupte do tohoto vlákna.

Zdravím,

můžu se zeptat. Rozchodil jsem si 8bit komunikaci s LCD. A jedna věci mi není jasná. Jak převést např. znak “A” tak abych hodnotu mohl poslat rovnou na port B?

Edit: používám řadič hd44780, pic16f628 a xc8

Díky

Pošli na port B číslo 65, anebo potřebuješ v programu převod znaku na Ascii hodnotu?

Znovu jsem projel některé příklady co jsem našel a byla chyba že jsem tam posílal portB = “A” a mělo tam být portB = ‘A’

Teď už to funguje, sice nevím, jestli takto odpovídají všechny znaky, ale budu doufat, že ano.

cau,aci takle
pro odeslani dat

[code]void lcdData(unsigned char znak)
{
RS=1;
EN=0;
PORTB =znak;

EN=1;
waitlcd(2);
EN=0;}[/code]
pak to napises lcdData(“A”);
pokud jich bude vic printf(lcdData,“ABCD”);
nebo
strcpy(strink,“ABCD”);
printf(lcdData,"%s",strink);

predtim musis nastavit pozici kam to chces zapsat

a uz sto vyresil …, ano ty zakladni znaky ASCI fungujou

Ano, znak i číslo v uzavřených aposforech se převede na Ascii hodnotu.

Edit: MiloPS3 byl rychlejší… :smiley:

Ano ano už jsem na to přišel, že jsem měl problém v zápisu.

Teď si budu hrát s tím jak tam poslat více znaků najednou, takže díky za ten příklad výš, určitě ho použiju.

jinak s timdle sem se taky setkal,
pri zapisu do stringu se taky pouzivaji ,pri testech taky

dat[j++]='.'; if(buf2*==',')
treba vyskouset co se ti tam zapisuje v simulatoru,obca ten MPLAB dela divy …*

To je jednoduché, na to je funkce “printf”
třeba takto:

printf ("A-uložit  D-další");

pak se ti vypíše vše v uvozovkách na jeden řádek.

Tak jsem nakonec zvolil jinou funkci než printf

[code]void lcd_zapis(const char *str)
{
unsigned char x = 0;
while(str[x]!=0)
{
RA1 = 1;
RA2 = 1;
RA3 = 0;

 PORTB = str[x];
 x++;
 
 __delay_ms(5);

 RA1 = 0;

 __delay_ms(1);
  }

}[/code]

Jen mi není jasné proč se uvádí, že při inicializaci se má nastavovat jestli chci komunikovat 4 nebo 8 bitově 3x zasebou?

Já jsem použil inicializaci
PORTB = 0b00111000; - komunikace 8bit, 2 řádky
PORTB = 0b00001100; - zapnout LCD
PORTB = 0b00000110; - posun zvýšení, Není posun
PORTB = 0b00000001; - smazání LCD

v simulátoru mi to takto funguje, ale přece jen mi to není ještě tak úplně jasné, jak to správně má být.

V simulátoru funguje ledacos, ale realita může být jiná. Propoj to , nahraj program a hned uvidíš…

jistota je kulomet …

Ne, že jistota je kulomet, ale při inicializaci LCD displeje musíš vycházet ze známého stavu. Z toho důvodu musíš mít jistotu, že LCD komunikuje, jak Ty mu diktuješ. Správný postup je tedy přepnout do 8-bitového režimu a pak přepnout na 4-bitový. Problém je v tom, že na začátku nevíš :

  1. zda LCD je v 4- nebo 8-bitovém režimu
  2. zda data, která posíláš má displej za první polovinu bytu posílaného 4-bitově.

Více snad napoví následující ukázka kódu s vysvětlením. Vysvětlení platí pro displej, který je v okamžiku inicializace ve 4-bitovém režimu. V případě 8-bitového režimu (po zapnutí) se LCD prostě 3x přepne do 8-bitového režimu a na konci se přepne do 4-bitového.

// ---------------------------------------------------------------------------------------------------------
// 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);

Pokud komunikuješ s LCD 8-bitově, pak stačí poslat přepnutí do 8-bitové komunikace jenom jednou, protože v každém případě víš (pokud v programu nemáš kopanec, díky kterému by se LCD přepnul do 4-bitového režimu), že LCD po zapnutí i po restartu je v 8-bitovém režimu.

Děkuji, krásně vysvětleno :slight_smile: