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

BASCOM-Przesuwanie napisu.

arktik1 03 Maj 2010 21:15 3461 16
REKLAMA
  • #1 8031654
    arktik1
    Poziom 27  
    Witam
    Mam problem z czymś takim:
    
    Do
    Incr Q
    If Q = 101 Then Q = 0
    
    If Q = 100 Then
    Locate 4 , 1
    Lcd " dysk archiwum uruchomiony "
    Shiftlcd Left
    End If
    Loop
    

    Może to banalne ,ale napis który się przesuwa nie wyświetla się cały.
    Brakuje ostatnich kilku liter gdy wyświetlany jest na ostatniej linii.
    A gdy wyświetlę go na 1 linii ,to przenosi końcówkę napisu na 2 linię.
    Wyświetlacz to 20x4.
    Jest to tylko wycinek programu odpowiadający za przesuwanie napisu.

    Dodano po 6 [minuty]:

    A i jeszcze jedno
    Chce przesunąć tylko ostatnią linię ,nie cały wyświetlacz.
  • REKLAMA
  • #2 8031754
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 8031759
    mirekk36
    Poziom 42  
    arktik1 --> zajrzyj sobie do helpa i zobacz, że shiftlcd to przesuwanie (sprzętowe) całej zawartości wyświetlacza a nie jednej twojej wyimaginowanej linijki.

    W ogóle sprzętowe przesuwanie działa różnie tak na prawdę na różnych wyświetlaczach. Ty masz akurat spory bo 20x4 i w pamięci DDRAM LCD nie ma bufora na całe linie - stąd te dziwne zawijania o których piszesz.

    Zrób sobie w pamięci RAM procka własną ramkę na której będziesz mógł robić różne cyrkowe sztuczki z przesuwaniami i innymi animacjami - a w kodzie wysyłają ją co kilkadziesiąt ms na LCD i już. (czyli będziesz miał programowe animacje, przesuwania w tym dowolnych linii lub tylko fragmentów linii - wszystko zależeć będzie od ciebie i twojej wyobraźni) ;)

    Poniżej masz link do projekciku, którego popełniłem w zamierzchłych czasach jeszcze w Bascomie i zobacz sobie jakie animacje najróżniejsze w ten sposób są wyświetlane.

    Obejrzyj sobie filmik w pierwszym poście - to czysty Bascom

    https://www.elektroda.pl/rtvforum/topic1022172.html
  • #4 8031803
    kots
    Poziom 12  
    Bascom nie kontroluje zakresu, jak przekroczysz obszar ekranu, to adres pamięci jest obliczany przez Bascom i znak ląduje nie tam gdzie chcesz, to zależy od organizacji pamięci kontrolera i konstrukcji jego rozkazów.

    Co do przesuwania sprawdź czy zadeklarowany rozmiar wyświetlacza jest zgodny z tym co masz zainstalowany.

    KotS
  • #5 8031944
    arktik1
    Poziom 27  
    No tak.
    Było by super lecz:
    
    Dim A As Integer
    Dim Z As Word
    
    Do
    Incr Q
    If Q = 101 Then Q = 0
    If A = 0 Then Z = 0
    If A = -5 Then Z = 1
    If Q = 100 Then
    If Z = 1 Then Incr A
    If Z = 0 Then Decr A
    Locate 4 , A
    Lcd " dysk archiwum uruchomiony "
    End If
    Loop
    

    Gdy napis przesuwa się w prawo, to ok.
    Gdy napis przesuwa się w lewo i to do pozycji -5 ,bo przy takiej jest tylko widoczny cały końcowy text to zaczyna wchodzić na 2 linie wyświetlacza.
  • REKLAMA
  • #6 8032687
    xantros
    Poziom 11  
    Pewnie dlatego, że cały twój tekst ma 27 liter, a wyświetlacz ma w linii tylko 20 i powstaje te zawijanie. W Bascomie chyba powinna być jakaś procedura, którą będziesz mógł wyciąć 20-literowy ciąg z tego " dysk archiwum uruchomiony " (albo samemu trzebe będzie coś takiego napisać) i dopiero ten tekst wyświetlić. Ale to już pewnie podpowiedzą ci koledzy lepiej znający Bascoma niż ja :)
  • #7 8033897
    arktik1
    Poziom 27  
    No i tu właśnie pojawia się problem.
    Nie przesuwał bym napisu jeśli był by widoczny cały.
  • #8 8034151
    J_Bravo
    Poziom 27  
    Dim S As String * 15 , Z As String * 15
    S ="ABCDEFG"
    Z = Left(s , 5)
    Print Z                                                     'ABCDE
    Z = Right(s , 3) : Print Z
    Z = Mid(s , 2 , 3) : Print Z
    End
    


    Komendami left, right i mid masz możliwość operacji na tekscie. Troszke sprytu i robisz bardzo ładny scroll
  • REKLAMA
  • #9 8034864
    arktik1
    Poziom 27  
    nie działa.
  • #10 8036872
    J_Bravo
    Poziom 27  
    Jak nie działa ?? Działa ślicznie !!
    Tu masz kod.
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6
    
    
    Dim A As Byte
    Dim Dlugosc As Byte
    Dim Tekst As String * 90
    Dim Tekst2 As String * 90
    Config Lcd = 16 * 2                                         'configure lcd screen
    
    Tekst = "                bardzo dlugi tekst ktory nie miesci sie na LCD               "
    Dlugosc = Len(tekst)
    Dlugosc = Dlugosc - 16
    Cls
    Do
       For A = 1 To Dlugosc
          Locate 1 , 1
          Tekst2 = Mid(tekst , A , 16)
          Lcd Tekst2
          Waitms 500
       Next A
    
       For A = Dlugosc To 1 Step -1
          Locate 1 , 1
          Tekst2 = Mid(tekst , A , 16)
          Lcd Tekst2
          Waitms 500
       Next A
    Loop

    Listing pisany na kolanie, bez optymalizacji. przesuwa tekst w prawo i w lewo.
  • #11 8038061
    arktik1
    Poziom 27  
    No tak ,teraz działa idealnie.:D
    Ale nie nadaje się do mojego programu z 1 powodu:
    Gdy program wpadnie w pętlę FOR ...NEXT nic innego nie robi aż skończy procedurę.
    Ja potrzebuję by program działał cały czas w pętli DO..LOOP a przy okazji przesuwał napis który mieści się na 4 lini wyświetlacza 20x4.
    Na pozostałych liniach wyświetlacza będzie się "działo" coś innego.
    I pytanie z innej beczki.
    Czy program może zawierać dowolną ilość pętli DO...LOOP?
    Jak na razie zrobiłem program w symulacji który posiada chyba z 5 pętli DO...LOOP i działa.
    Przyznam szczerze że takie małe "pętelki" bardzo ułatwiają pisanie kilku rzeczy.
  • Pomocny post
    #12 8038129
    J_Bravo
    Poziom 27  
    "FOR... NEXT" to był przykład jak wykorzystac "mid" możesz zrobić to po swojemu. Co do DO...LOOP to praktycznie ilość dowolna.
  • #13 8038345
    arktik1
    Poziom 27  
    Bardzo bym chciał ,tylko nie mam pojęcia jak.

    Dodano po 4 [godziny] 4 [minuty]:

    Zrobiłem coś takiego:
    
    Dim F As Byte
    Dim Dlugosc As Word
    Dim Tekst As String * 46
    Dim Tekst2 As String * 46
    Config Lcd = 20 * 4      'configure lcd screen
    
    Tekst = "                    dysk archiwum uruchomiony "
    Dlugosc = Len(tekst)
    Dlugosc = Dlugosc - 20
    Cls
    F = 46
    Do
    
    Incr F
    If F = 46 Then F = 1
       If F = 1 Then Dlugosc = 20
          Locate 4 , 1
          Tekst2 = Mid(tekst , F , 20)
          Lcd Tekst2
    Loop
    

    Chodzi o przewijanie napisu z prawej do lewej.
    Czy jest to napisane prawidłowo??
  • #14 8041266
    J_Bravo
    Poziom 27  
    Dim F As Byte
    Dim Dlugosc As Word
    Dim Tekst As String * 56
    Dim Tekst2 As String * 56
    Config Lcd = 20 * 4
    
    Tekst = "                     dysk archiwum uruchomiony "
    Dlugosc = Len(tekst)
    Dlugosc = Dlugosc - 20
    Cls
    F = 0
    Do
    
    Incr F
    If F = 46 Then F = 1
       If F = 1 Then Dlugosc = 20
          Locate 4 , 1
          Tekst2 = Mid(tekst , F , 20)
          Lcd Tekst2
    Loop


    To działa. I przede wszystkim nie jest w pętli FOR...NEXT tak jak chciałeś.
  • #15 8043847
    arktik1
    Poziom 27  
    jest jeszcze jedna historia.
    Gdy tekst jest przesuwany w ostatniej linii to daje się zaobserwować zwalnianie przesuwania.
    Na początku jest szybko, potem gdy widoczny jest cały tekst jest wolno i gdy tekst się kończy to idzie szybko.
    Czego to może być wina?
    Przestawianie $crystal i zmiana FUSE nic nie daje.
    Widoczne to jest nie tylko na tekście, razem z tekstem zwalniają wszystkie linie wyświetlacza.

    Dodano po 3 [godziny] 11 [minuty]:

    A może trzeba by było zmienić obsługę z 4-bit na 8-bit?
  • #16 8047636
    J_Bravo
    Poziom 27  
    wina funkcji mid.
  • #17 8051245
    arktik1
    Poziom 27  
    Czyli co można zrobić??
REKLAMA