logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] BASCOM, Przewijanie kilku tekstów na lcd bez shiftlcd

Elektromechanik88 14 Kwi 2020 00:19 792 15
REKLAMA
  • #1 18616062
    Elektromechanik88
    Poziom 5  
    Witam.
    Szukam sposobu przewijania kilku stringów w tym samym czasie na ograniczonym obszarze wyświetlacza lcd znakowego

    Mam wyświetlacz lcd znakowy 4x16, z którego mogę wykorzystać tylko 6 pierwszych znaków by wyświetlić cały długi string na wiersz.

    Napisałem funkcję która buforuje mi 14-sto znakowego stringa i przesuwa go w polu ograniczonym do 6 znaków

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Funkcja działa z jednym stringiem dość dobrze, przewija cały tekst zakończony dwiema spacjami i tak w kółko, ale jak chcę obsłużyć w ten sposób 2 różne stringi to zaczyna mi się to kiełbasić na wyświetlaczu.

    Jeden str, jeden wiersz:
    JEDEN ST..G.mp4 Download (9.27 MB)

    dwa str, dwa wiersze:
    DWA STRI..I.mp4 Download (11.95 MB)

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Funkcja jest mi potrzebna do innego większego projektu, w którym utworzony jest bufor LCD składający się z 4 stringów/linii,
    każda z tych linii ma długość 16znaków w której ma się znaleźć (pszesuwająncy się tekst+ odstęp+ timer odliczający czas).

    BUFOR LCD
    BASCOM, Przewijanie kilku tekstów na lcd bez shiftlcd20200414_0..530.jpg Download (1.7 MB)

    To mój pierwszy post na tym forum, trochę czasu już się uczę bascoma ale nadal nie wszystko rozumiem, co można a czego nie w pisaniu programów.
    Bardzo bym prosił o pomoc, nakierowaniu mnie na właściwy trop.

    Być może tak się nie da jak chcę zrobić, przeglądałem mnóstwo postów o przewijaniu tekstu na elektrodzie i na zagranicznych forach, oglądałem sporo tutoriali na YT ale jedyne co spotykałem to przewijanie na jednym wierszu lub polecenie pszesuwające całą ramkę lcd "shiftlcd" .
  • REKLAMA
  • #2 18618371
    LED5W
    Poziom 34  
    Problem jest w tym, że używasz wspólnych, globalnych zmiennych (I, Znak).
  • #3 18618635
    Elektromechanik88
    Poziom 5  
    Też do takiego wniosku na początku doszedłem, tylko że jak bym chciał obsłużyć np. cztery wiersze wyświetlacza, a w każdym wierszu inny string miał by się poruszać to funkcja musiała by posiadać jednocześnie 4 i więcej parametrów "text"; "text_2"; "text_3";... itd, a do każdego textu musiała by być powtarzana procedura z osobnymi zmiennymi (I,Znak).
    Funkcja poza tym może zwrócić i tak chyba jedną wartość więc to chyba nie zadziała.
    Czy niema jakiejś innej możliwości napisania takiej uniwersalnej funkcji?
  • #4 18618716
    LED5W
    Poziom 34  
    Nie wiem, do czego te parametry. Do funkcji proponuję przekazać tekst, szerokość i liczbę znaków przesunięcia. Nie widzę potrzeby używania zmiennej Znak. Do bufora wpisać od razu ile się da. Resztę dopisać używając Left.
  • REKLAMA
  • #5 18621235
    Elektromechanik88
    Poziom 5  
    Nie zupełnie o to mi chodzi, szukam sposobu by tekst przemieszczał się co pół sekundy tzw. scrolling text, tyle że na każdym wierszu wyświetlacza lcd funkcja musi
    scrollować inny tekst.
    Poleceniem Left, right mogę wyświetlić część stringa od lewej/prawej strony podając parametry "zmiennej str" i "n-znaków"
    var = LEFT/RIGHT(var1 , n)

    Ale jak zrobić scrolling z poleceniem Left
  • REKLAMA
  • #6 18621321
    LED5W
    Poziom 34  
    Left ma zastosowanie, tylko gdy jednocześnie ma zostać wyświetlony początek i koniec napisu. Na przykład, gdy ma zostać wyświetlone yn sz, to yn zostanie wpisane przez Mid, a następnie dodane do tego sz przez left. Musisz tylko policzyć parametry dla tych funkcji.

    Elektromechanik88 napisał:
    szukam sposobu by tekst przemieszczał się co pół sekundy tzw. scrolling text, tyle że na każdym wierszu wyświetlacza lcd funkcja musi scrollować inny tekst.
    Nie widzę problemu.
  • #7 18623065
    Elektromechanik88
    Poziom 5  
    Czy chodzi o coś w tym stylu? napis przesuwa się z 3krokach
    dwa stri..2.mp4 Download (19.86 MB)

    Dodałem do tego jeszcze polecenie right, ale tutaj niestety to wygląda trochę jak procedura bo locate x, x i lcd x musiałem umieścić wewnątrz funkcji.


    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    W 2krokach funkcja wygląda tak:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Nie jestem jeszcze a dobry w te klocki :D więc mogę cały czas tego nie rozumieć co próbujesz mi powiedzieć
  • Pomocny post
    #8 18624035
    LED5W
    Poziom 34  
    Myślałem o czymś takim:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Choć można zamiast używać Mid i Left przepisywać znaki w pętli. Teksty stałe powinieneś zdefiniować jako const.
    Swoją drogą, w jakim celu to buforowanie?
  • #9 18626501
    Elektromechanik88
    Poziom 5  
    Witam. Niestety to nie działa, gdy inkrementacja zmiennych "przesunięcie1 i 2" się zeruje po osiągnięciu len(x) w warunku if...then w głównej pętli, cały napis z Bufor_text zanika i tworzy się na nowo.

    widoczne na nagraniu:
    na Lcd pierwszy wiersz jest bufor_text + " "+ zmienna(przesunięcie)
    Przesow z..ft.mp4 Download (56.05 MB)

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Co do pętli to z for... next coś tam kombinowałem, z marnym skutkiem

    Tekstów nie definiuję jako const gdyż nie są wpisywane w moim projekcie na sztywno w program, tylko wpisywane z wbudowanej klawiatury do uC na zadeklarowaną tablicę str(5cio elemętową) i następnie zapamiętywane w pamięci eeprom uC


    Celem funkcji i buforowania tekstu jest utworzenie złożonego stringa, na który ma przypadać scrollowany tekst+ odstęp+ czas(zegar)

    Mam nadzieję że rozumiesz o co mi chodzi ;)

    pseudo kod:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Tak to wygląda w praktyce z moją funkcją już w projekcie, na 3 wierszach lcd, ostatni 4 wiersz to stan zmiennych pomocniczych nie istotny z tym co się dzieje w tym momencie z programem, nie chciało mi się ich zakrywać:)
    20200417_2..701.mp4 Download (44.93 MB)

    Przesunięcie tekstu jest co 500ms zrobione w waitms (tymczasowo), normalnie to cały program jest zrobiony na przerwaniach.
  • #10 18626616
    LED5W
    Poziom 34  
    Elektromechanik88 napisał:
    Niestety to nie działa, gdy inkrementacja zmiennych "przesunięcie1 i 2" się zeruje po osiągnięciu len(x) w warunku if...then w głównej pętli, cały napis z Bufor_text zanika i tworzy się na nowo.
    BASCOM domyślnie indeksuje od 1, dlatego z zerem źle działało. Zmienić 0 na 1, >= na > i powinno być ok. Dodatkowo można poprawić warunek dla Left, bo teraz ta funkcja jest wywoływana o jedną pozycję za wcześnie.

    Dodano po 24 [minuty]:

    Elektromechanik88 napisał:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
    Znów deklarujesz niepotrzebnie zmienną globalną. Powinna tu być zmienna lokalna (local). Możliwe, że BASCOM nie radzi sobie z takim zapisem.
  • REKLAMA
  • #11 18626758
    Elektromechanik88
    Poziom 5  
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    a ten parametr z left "doObliczenia" on również powinien być chyba zwiększany co każdy cykl po osiągnięciu
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #12 18626848
    LED5W
    Poziom 34  
    On będzie się zwiększał o 1 w tym przypadku, bo wartość przesunięcia przekazywana do funkcji też się tak zwiększa. Jeśli jednak np. zacząłbyś przesuwać w prawo to funkcja nie działałaby prawidłowo, poza tym musiałbyś tą wartość zapamiętać poza funkcją dla danego napisu (tak, jak teraz przesuniecie). Dlatego trzeba to liczyć.
  • #13 18628657
    Elektromechanik88
    Poziom 5  
    Ok, zrobiłem obliczenia na kartce papieru by przypisać odpowiednie wartości w warunkach :)

    Wyszło coś takiego:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Troszeczkę więcej obliczeń na zewnątrz funkcji, ale działa nawet sprawnie.
    Czy jest coś co można tutaj poprawić?

    Z góry mówię, że niestety zmienne "Rownanie1" i "Rownanie2" muszą być bo w warunku wyskakuje mi błąd.
  • Pomocny post
    #14 18629053
    LED5W
    Poziom 34  
    Elektromechanik88 napisał:
    Ok, zrobiłem obliczenia na kartce papieru by przypisać odpowiednie wartości w warunkach :)
    Miałeś policzyć parametr doobliczenia wewnątrz funkcji Przesow_tekstu2, bez dodawania parametrów do tej ostatniej...
  • #15 18629228
    Elektromechanik88
    Poziom 5  
    Ehhh... słabo u mnie z tymi obliczeniami na funkcjach.

    jedna linijka...
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    a ja tu już nie wiadomo jakie obliczenia tworzyłem

    Jestem pewien, że o to chodziło
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #16 18633788
    Elektromechanik88
    Poziom 5  
    Dziękuję za pomoc w rozwiązaniu problemu.

    Udostępniam również mój sposób, który też działa.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Temat uważam za rozwiązany.

Podsumowanie tematu

Użytkownik poszukiwał sposobu na przewijanie kilku stringów na wyświetlaczu LCD 4x16, ograniczając się do 6 znaków w każdym wierszu. W odpowiedziach zasugerowano, aby unikać używania globalnych zmiennych oraz przekazywać parametry do funkcji, co pozwoli na obsługę wielu stringów jednocześnie. Proponowano różne podejścia do implementacji funkcji przewijania tekstu, w tym wykorzystanie funkcji Mid i Left do wyświetlania fragmentów tekstu. Ostatecznie użytkownik zaprezentował działające rozwiązanie, które wykorzystuje tablicę stringów oraz lokalne zmienne do zarządzania przewijaniem tekstu w pętli.
Podsumowanie wygenerowane przez model językowy.
REKLAMA