<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=16438&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-09T21:08:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16438&amp;mode</id>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-10-09T21:08:37+01:00</updated>
<published>2016-10-09T21:08:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16438&amp;p=171081#p171081</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16438&amp;p=171081#p171081"/>
<title type="html"><![CDATA[LCD przewijanie gotowiec]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16438&amp;p=171081#p171081"><![CDATA[
Witam zawsze miałem problem tego typu że na lcd nie można zmieścić za dużo informacji mam tu na myśli długie teksty. Dlatego powstała prezentowana funkcja może komuś się przyda. Można potestować i sprawdzić czy działa poprawnie.<br /><br />Należy zadeklarować następujące zmienne globalne:<br />[syntax=c]char Linia1&#91;21&#93;;<br />char TekstPrzesowany&#91;151&#93;;<br />char TekstPrzewodni&#91;16&#93;;        //Max polowa szerokości wyświetlacza<br />volatile uint8_t Zegar_100ms;[/syntax]<br /><br /><br />Przy inicjalizacji przekopiować teksty <br />[syntax=c]strcpy(TekstPrzewodni , &quot;Info: &quot; );<br />strcpy(TekstPrzesowany , &quot;Dzisiaj jest sobota 08.10.2016  Godzina 14:56&quot; );[/syntax]<br /><br /><br /><br />W petli glownej wstawiamy:<br />[syntax=c]if (PrzesowanieTextuLCD(TekstPrzewodni , TekstPrzesowany , Linia1 ,  &amp;Zegar_100ms)==true){<br />lcd_locate(0,0);<br />lcd_str( &quot;                     &quot; );<br />lcd_locate(0,0);<br />lcd_str( Linia1 );<br /><br />lcd_locate(1,0);<br />lcd_str( &quot;                     &quot; );<br />lcd_locate(1,0);<br />lcd_str(&quot;DALEJ   STOP  POWROT&quot;);<br /><br />lcd_locate(2,4);<br />lcd_str(&quot;&quot;);<br /><br />lcd_locate(3,4);<br />lcd_str(&quot;&quot;);<br />}[/syntax]<br /><br /><br /><br /><br /><br />Funkcja wlasciwa<br />[syntax=c]bool  PrzesowanieTextuLCD(char *INwskTextPrzewodni,char *INwskTextPrzesowany,char *OUTwskLinia,volatile uint8_t *wskZegar_100ms){<br />#define IloscKolumnLCD 20<br />#define CzasOdstepDoKolejnegoPrzewijania 10      //wartosc * 100ms<br />#define CzasPostojuPoWpisaniuTekstuWiodacego 5   //wartosc * 100ms<br />#define CzasPostojuPoPierwszymWpisaniu 1         //wartosc * 100ms<br />#define SzybkoscWpisywaniaTextu 2                //wartosc * 100ms<br />#define SzybkoscPrzewijania 3                    //wartosc * 100ms<br /><br />static uint8_t k,Dl_TekstPrzewodni,Dl_TekstPrzesowany,Il;<br />static uint8_t s, DlMiejscePrzewijania;<br />static char *wskLiniaN;<br />static char *wskTekstPrzesowany;<br />static uint8_t opz, CPPWTW;<br />static bool OdswierzLCD;<br /><br />enum xxxxx {LadujTekstPrzewodni ,CzekajNaTekst ,LadujTekstPrzewijany ,CzekajNaPrzesowanie ,PrzesowajTekst ,Koniec };<br />static enum xxxxx Krok_Lcd_Przesowanie=0;<br /><br />OdswierzLCD=false;<br />//Zaladowanie tekstu wiodacego Max dopuszczalna dlugosc polowa szerokosci LCD<br />if (Krok_Lcd_Przesowanie == LadujTekstPrzewodni){<br />Dl_TekstPrzewodni = strlen(INwskTextPrzewodni);<br />if (Dl_TekstPrzewodni &gt; (IloscKolumnLCD&gt;&gt;1) ){ strcpy(INwskTextPrzewodni , &quot;DL&gt;0.5 &quot;); }<br />Dl_TekstPrzesowany = strlen(INwskTextPrzesowany);<br />strcpy( OUTwskLinia , INwskTextPrzewodni );<br />DlMiejscePrzewijania = IloscKolumnLCD-Dl_TekstPrzewodni;<br />    if (Dl_TekstPrzesowany &lt; DlMiejscePrzewijania){DlMiejscePrzewijania = Dl_TekstPrzesowany; }<br />wskLiniaN = OUTwskLinia;<br />wskLiniaN = wskLiniaN + Dl_TekstPrzewodni;<br />wskTekstPrzesowany = INwskTextPrzesowany;<br />Krok_Lcd_Przesowanie++;<br />CPPWTW =CzasPostojuPoWpisaniuTekstuWiodacego;<br />OdswierzLCD=true;<br />*wskZegar_100ms=0;<br />}<br />//Zaladowanie tekstu wiodacego Max dopuszczalna dlugosc polowa szerokosci LCD<br /><br />//Czekanie do rozpoczecia wpisywania tekstu do przesowania<br />if (Krok_Lcd_Przesowanie == CzekajNaTekst){<br />if (*wskZegar_100ms==1) {<br />*wskZegar_100ms=0;<br />opz++;<br />if (opz &gt;= CPPWTW) {<br />    opz = 0;<br />k=0;<br />Krok_Lcd_Przesowanie++;<br />OdswierzLCD=true;<br />}<br />}<br />}<br />//Czekanie do rozpoczecia wpisywania tekstu do przesowania<br /><br /><br />//Ladawanie tekstu ktory bedzie przewijany<br />if (Krok_Lcd_Przesowanie == LadujTekstPrzewijany){<br />if (*wskZegar_100ms==SzybkoscWpisywaniaTextu) {<br />*wskZegar_100ms=0;<br />Dl_TekstPrzewodni = strlen(INwskTextPrzewodni);<br />if ( k &lt; DlMiejscePrzewijania )<br />{<br />*wskLiniaN = *wskTekstPrzesowany;<br />wskLiniaN++;<br />wskTekstPrzesowany++;<br />k++;<br />OdswierzLCD=true;<br />}<br />else<br />{<br />Krok_Lcd_Przesowanie++;<br />*wskLiniaN = '\0';<br />}<br />}<br />}<br />//Ladawanie tekstu ktory bedzie przewijany<br /><br />//Czekanie zanim zaczniemy przesówanie<br />if (Krok_Lcd_Przesowanie == CzekajNaPrzesowanie){<br />if (*wskZegar_100ms==1) {<br />    *wskZegar_100ms=0;<br />opz++;<br />if (opz &gt;=CzasPostojuPoPierwszymWpisaniu) {<br />    opz = 0;<br />k=0;<br />Krok_Lcd_Przesowanie++;<br />wskTekstPrzesowany = INwskTextPrzesowany+1;<br />OdswierzLCD=true;<br />Il=0;<br />s=0;<br />}<br />}<br />}<br />//Czekanie zanim zaczniemy przesówanie<br /><br />//Przesowanie tekstu po dozwolonym obszarze LCD<br />if (Krok_Lcd_Przesowanie == PrzesowajTekst){<br />if (*wskZegar_100ms==SzybkoscPrzewijania) {<br />*wskZegar_100ms=0;<br />wskLiniaN = OUTwskLinia;<br />wskLiniaN = wskLiniaN + Dl_TekstPrzewodni;<br />if ( Il &lt; Dl_TekstPrzesowany ){<br />for (k=0; k &lt; DlMiejscePrzewijania ; k++)<br />{<br />if ( Il &lt; Dl_TekstPrzesowany-1-DlMiejscePrzewijania ){      //przesowane do konca lcd napisu<br />*wskLiniaN = *wskTekstPrzesowany;<br />wskTekstPrzesowany++;<br />wskLiniaN++;<br />*wskLiniaN = '\0';<br />}<br />if ( Il &gt;= Dl_TekstPrzesowany-1-DlMiejscePrzewijania ){     //przesowanie spacji<br />if (k &lt; (DlMiejscePrzewijania-s)){<br />   *wskLiniaN = *wskTekstPrzesowany;<br />}<br />else<br />{<br />   *wskLiniaN = ' ';<br />}<br />wskTekstPrzesowany++;<br />wskLiniaN++;<br />*wskLiniaN = '\0';<br />}<br />OdswierzLCD=true;<br />}<br /><br />if ( Il &lt; Dl_TekstPrzesowany-1-DlMiejscePrzewijania ){s=0;}  //przesowane do konca lcd napisu<br />if ( Il &gt;= Dl_TekstPrzesowany-1-DlMiejscePrzewijania ){s++;} //przesowanie spacji<br />wskTekstPrzesowany = wskTekstPrzesowany - DlMiejscePrzewijania+1 ;<br />}<br />if (Il &gt; Dl_TekstPrzesowany){Krok_Lcd_Przesowanie++;}<br />Il++;<br />}<br />}<br />//Przesowanie tekstu po dozwolonym obszarze LCD<br /><br />//Zakonczenie procesu przewijania, ustawienie warunkow poczatkowych<br />if (Krok_Lcd_Przesowanie == Koniec){<br />Krok_Lcd_Przesowanie=CzekajNaTekst;<br />CPPWTW = CzasOdstepDoKolejnegoPrzewijania;<br />wskLiniaN = OUTwskLinia;<br />wskLiniaN = wskLiniaN + Dl_TekstPrzewodni;<br />wskTekstPrzesowany = INwskTextPrzesowany;<br />}<br />//Zakonczenie procesu przewijania, ustawienie warunkow poczatkowych<br /><br />return OdswierzLCD;<br />}[/syntax]<br /><br /><br />Należy jeszcze stworzyć przerwanie wywoływane co 100ms (tak przykładowo tylko podaje jak to ma wygladac)<br />ISR(TIMER2_COMP_vect)                               <br />{<br />Zegar_100ms++;<br />}<br /><br /><br /><br /><br /><br /><br /><a href="https://obrazkiforum.atnel.pl/4629/a38269466192e61ab3b76ad96c29ffc6.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/4629/a38269466192e61ab3b76ad96c29ffc6.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 9 paź 2016, o 21:08</p><hr />
]]></content>
</entry>
</feed>