Cursor LCD

Ahoj,

Mam problem s LCD 16x2 a spociva v tom
ze potrebujem nastavovat hodnotu 3 miestneho cisla
sposobom stovky desiatky a jednotky pohyb medzi nimi je klavesnicou za pomoci sipiek.sipka do lava sa posunie kurzor do lava a sipka doprava posunie kurzor doprava sipka hore -1 hodnoty na ktorej je kurzor a sipka dole +1 hodnoty na ktorej je kurzor.
A problem spociva v tom ze neviem vykreslit cursor blikajuci na znaku ktory menim cize je “AKTIVNY”
Mate niekto s tymto nejake skusenosti alebo nejaku radu?

Dakujem

Viděl bych to na úpravu rutiny pro inicializaci displeje, tam se standartně vypíná zobrazování kurzoru.

Kurzor zobrazeny mam len je posunuty o jednu poziciu voci znaku ktory chcem prepisovat a nejde nastavit na inu poziciu

To dělá inkrementace, která se většinou zapíná opět v rutině inicializace displeje - po zapsání znaku skáče kurzor automaticky na další pozici. Jestli je to pro tebe lepší řešení, tak inkrementaci vypni, jinak ten kurzor posouvej pomocí těch kláves přímo na místo, kam chceš zapsat. V Céčku je instrukce “lcd_gotoxy”, kterou skočíš přímo na zadanou pozici displeje.

pouzivam gotoxy znak sa meni na pozicii kde mi ukazuje gotoxy ale kurzor mi blika stale na konci vypisovaneho celkoveho retazca.

lebo ja to menim tak ze mam char]
a pozicia X pre gotoxy je pozicia aj pre char].

len ten kurzor je stale na konci

No to právě musíš zapsat jen ten jeden znak a neinkrementovat pozici kurzoru, nebo po zapsání znaku nebo celého řetězce vrátit kurzor na danou pozici a nezapisovat na displej, dokud není třeba na displeji opět něco měnit.

Tak to je ten problem lebo ja chcem nastavovat hodnotu
napr:
1024 nastavit takymto sposobom

zaciatocna hodnota na displayi je : 0000
presuniem kurzor na prvu poziciu nastavim 1
presuniem na druhu poziciu
presuniem na tretiu poziciu nastavim 2
presuniem na stvrtu poziciu a nastavim 4

a preto potrebujem aby tam ten kurzor bol aby som vedel na ktorej pozicii som aktualne

Jestli tě dobře chápu, tak na začátku zapíšeš samé nuly a potom stále dokola vypisuješ řetězec těch tvých 4 čísel.

Abys měl ale kurzor jen na jedné číslici, musel bys zastavit vypisování celého řetězce a zapisovat jen jeden znak, na kterém si necháš kurzor. Potom zase můžeš zapisovat celý řetězec.

Příklad - zapíšu samé nuly, potom stále dokola vypisuji 1024. Když budu chtít 2 změnit na 5, zastavím po stisknutí kurzorové klávesy vypisování celého řetězce, nastavím kurzor do polohy 2 na displeji a změním 2 na 3. Potom vrátím kurzor zpět, 3 změním na 4, vrátím kurzor zpět a změním 4 na 5. Po uplynutí nějakého času nečinnosti se mohu opět vrátit k vypisování celého řetězce.

Tak bych to viděl já, za funkčnost ale neručím, nemám to teď kde vyzkoušet :confused:

Ok
Diky

Tak ja to takto skusim :slight_smile:

:wink:

A dej vědět, jak to dopadlo :exclamation:

Ahoj

Tak dopadlo to super
posielam tu hlavnu cast zdrojaku:

{
long int pocet_miest=3;
int i,j;
unsigned char text[41];
unsigned char cyklus=1;
unsigned char changes=0;

for (i=0;i<41;i++)
{
if (str* == 0x00) break;
text*=‘0’;
}
text*=’\0’;
LCDGotoXY(X,Y);
LCDWriteString(str);
if(X+i>20)Y++;
X=X+i;i=0;

LCDGotoXY(X,Y);
LCDWriteString(&text[0]);

LCDTextAttr(LCD_C_BLINK_ON);

LCDGotoXY(X+i,1);

while(cyklus!=0)
{
key_scan(); //premennu key nastavuje tato metoda

if(key!=0x00)
{

if(key==arrow_down)
{
	if(text*<57)
		text*++;
	else
	text*='0';
	changes=1;
}

if(key==arrow_up)
{
	if(text*>48)
		text*--;
	else
	text*='9';
	changes=1;
}

if(key==arrow_left && i>0)
	i--;
if(key==arrow_right && (X+i<20) && i<pocet_miest-1)
	i++;


LCDGotoXY(X+i,1);
if(changes==1)
{	
 	LCDGotoXY(X,1);
	LCDWriteString(&text[0]);
	LCDGotoXY(X+i,1);
	changes=0;
}

}
}
return value;
}*********

No tak sláva :slight_smile:

Jak moc (nebo jestli vůbec) by to chtělo optimalizovat kód už neporadím, chybí mi tam trochu komentáře a hlavně Céčko nějak moc neovládám, programuji hlavně PLC, převážně GE Fanuc, tak jsem radil spíš obecně než konkrétní kód.

Jo DIKY :slight_smile: