Obsluha LCD v céčku pro PIC16F84A

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

Obsluha LCD v céčku pro PIC16F84A

#1 Příspěvek od MartinOV »

Zdravím všechny!
Stáhl jsem si kompiler mikroC a na zkoušku do něj napsal program v příloze. Menším problémem zpočátku bylo, že to zabralo skoro veškerou RAM a půlku Flash a jen to zaplnilo LC displej a šmytec. Pak jsem se dozvěděl o kouzelném slůvku "code", které se dá doplnit ke konstantě, aby se konstanta uložila do Flash. Tak jsem program upravil do podoby v příloze a nefunguje to už vůbec. Na displeji se zobrazí nesmysly.
Je tam někde problém s pointerem nebo to u 16F84A prostě nejde? Když jsem se díval na přeložený HEX, tak ty texty tam jsou vložené do instrukcí retlw, tak by to možná mělo nějak fungovat...

Procesor je ve zkušebním zapojení CHIPON 1.
Přílohy
LCD.txt
(1.4 KiB) Staženo 165 x

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#2 Příspěvek od AB1 »

Kód: Vybrat vše

const code char *text3[] = "Konec filmu...";
MikroC neznám ale podle mne má být buď

Kód: Vybrat vše

const code char text3[] = "Konec filmu...";
nebo

Kód: Vybrat vše

const code char *text3 = "Konec filmu...";

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#3 Příspěvek od Atlan »

No bez kniznic je to na figu, o naprogramovani procesora nam to neprezradi nič. Dufam ze ledku si uz skusal rozblikat ? Aby sme vylucili ine chyby.

Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

#4 Příspěvek od MartinOV »

Ledku jsem už rozblikat zkoušel, všechno bylo vpořádku.
Výpis na displej jsem už také úspěšně vyzkoušel následujícím zápisem:

Kód: Vybrat vše

// (přiřazení jednotlivých vývodů pro knihovnu lcd)
void main() {
// (... nastavení portů atd....)
lcd_init();
lcd_cmd(_LCD_CLEAR);
lcd_cmd(_LCD_CURSOR_OFF);
lcd_out(1, 1, "Prvni text"); // lcd_out(řádek, sloupec, text);
lcd_out(2, 1, "z Cecka"); }
Bohužel na výpis dalších textů nezbyla RAM, každé volání lcd_out() si vzalo počet registrů rovný délce vypisovaného textu. Pak jsem se dozvěděl o možnosti vytvářet konstanty v paměti programu přes definici code. A tím to vše skončilo.

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#5 Příspěvek od Atlan »

nema to nejaku prirucku pripadne help ten kompiler.....

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#6 Příspěvek od AB1 »

Zkus toto:

Kód: Vybrat vše

const char Text1[] = "text 1";
const char Text2[] = "text 2";
const char Text3[] = "text 3";

//zobraz FLASH string na aktuální pozici kurzoru
void Lcd_Out_P(const char* flashstr)
{
char i=0, c;

   while( (c = flashstr[i]) != 0)
   {
      Lcd_Chr_Cp(c);   //zobraz znak
      i++;
   }
}

//--------------------------------------------------------

void main()
{
    Lcd_init();
    Lcd_Cmd(Lcd_Clear);
    Lcd_Out_P(Text1);
    Lcd_Cmd(LCD_SECOND_ROW);
    Lcd_Out_P(Text2);

   while(1) {}
}

Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

#7 Příspěvek od MartinOV »

Omlouvám se za pozdní odpověď, ale ten kód od AB1 funguje, všechno se zobrazuje vpořádku.
Asi jsem ještě přesně nepochopil pointery.
Díky za nakopnutí. :)

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“