Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

BASCOM M16 ikona wentylatora

arktik1 14 Wrz 2009 11:15 3898 19
  • #1 14 Wrz 2009 11:15
    arktik1
    Poziom 27  

    Dzień dobry.
    Napisałem kod który wyświetla symbol kręcącego się wentylatora na wyświetlaczu LCD.

    Code:


    Deflcdchar 0 , 32 , 25 , 1 , 32 , 16 , 19 , 32 , 32
    Deflcdchar 1 , 32 , 12 , 1 , 17 , 16 , 6 , 32 , 32          ' replace ? with number (0-7)
    Deflcdchar 2 , 32 , 6 , 16 , 17 , 1 , 12 , 32 , 32          ' replace ? with number (0-7)
    Deflcdchar 3 , 32 , 19 , 16 , 32 , 1 , 25 , 32 , 32         ' replace ? with number (0-7)
    Cursor Off

    Dim L As Byte
    L = 0
    Cls
    Do

    Incr L
    If L = 4 Then L = 0
    L = L Mod 4
    If L = 0 Then
    Locate 1 , 3
    Lcd Chr(0)
    End If
    If L = 1 Then
    Locate 1 , 3
    Lcd Chr(1)
    End If
    If L = 2 Then
    Locate 1 , 3
    Lcd Chr(2)
    End If
    If L = 3 Then
    Locate 1 , 3
    Lcd Chr(3)
    End If

    Wait 1
    loop


    Moje pytanie jest :
    Czy można wyeliminować Deflcdchar i zastąpić go czymś innym ,aby zaoszczędzić miejsca na definiowanie innych znaków??
    Chodzi o ikonę wentylatora ,tylko "narysowaną" nie przy pomocy Deflcdchar.

    0 19
  • #2 14 Wrz 2009 17:56
    ZbeeGin
    Poziom 38  

    To nie jest wyświetlacz graficzny byś mógł sobie rysować.

    0
  • #3 14 Wrz 2009 18:39
    arktik1
    Poziom 27  

    No właśnie.
    Istnieje jakiś sposób na zwiększenie ilości Deflcdchar??

    0
  • #4 14 Wrz 2009 19:19
    mirekk36
    Poziom 42  

    arktik1 napisał:
    No właśnie.
    Istnieje jakiś sposób na zwiększenie ilości Deflcdchar??


    a uważasz, że to jest zależne od Bascoma ? czy może od samego wyświetlacza?

    0
  • #5 14 Wrz 2009 19:24
    arktik1
    Poziom 27  

    Niech zgadnę...
    Od wyświetlacza.
    :cry:

    0
  • #6 15 Wrz 2009 14:29
    LED5W
    Poziom 32  

    Tak dla jasności: Możesz wyświetlać więcej niż 8 własnych znaków, jeżeli nie będą wyświetlane jednocześnie. ;)
    Przykład:

    Code:
    Do
    
    Deflcdchar 0 , 16 , 14 , 1 , 16 , 14 , 1 , 16 , 14
    Cls
    Lcd chr(0)
    Wait 1
    Deflcdchar 0 , 1 , 14 , 16 , 1 , 14 , 16 , 1 , 14
    Cls
    Lcd Chr(0)
    Wait 1
    Loop


    Dodano po 1 [godziny] 15 [minuty]:

    A co do twojego programu to dlaczego w każdym if masz locate? I nie łatwiej byłoby użyć select case, albo nawet zrobić to na pętli i dać "Lcd Chr(L)"?

    Dodano po 22 [minuty]:

    I do czego to:
    Code:
    L = L Mod 4

    Ci jest potrzebne, bo mnie to zastanawia?

    0
  • #7 16 Wrz 2009 18:49
    arktik1
    Poziom 27  

    Code:

    L = L Mod 4

    to licznik który liczy do 4 i pokazuje na wyświetlaczu kolejne CHR(..).
    W taki sposób zrealizowałem efekt obrotu.
    Można to zrobić inaczej??

    Dodano po 1 [minuty]:

    A i nie mogę używać WAIT.

    Dodano po 7 [minuty]:

    No i muszą być wyświetlane jednocześnie.
    Jednocześnie to znaczy muszą być widoczne na wyświetlaczu wszystkie.
    Na wyświetlaczu są widoczne napisy i znaki:
    1Musi być widoczny efekt obrotu 3 x CHr
    2 Poziom płynu chłodniczego.5 x Chr
    3 znak °C x1 Chr
    Chyba że można je wpisywać do wyświetlacza po kolei ,w programie nie ma poleceń CLS.

    Dodano po 1 [minuty]:


    Dodano po 11 [minuty]:

    0
  • #8 17 Wrz 2009 15:48
    LED5W
    Poziom 32  

    arktik1 napisał:
    Code:

    L = L Mod 4

    to licznik który liczy do 4 i pokazuje na wyświetlaczu kolejne CHR(..).
    W taki sposób zrealizowałem efekt obrotu.
    Można to zrobić inaczej??

    To nie jest żaden licznik. Mod to reszta z dzielenia, czyli tutaj:
    0 / 4 to 0,
    1 / 4 to 0 i reszta 1,
    2 / 4 to 0 i reszta 2,
    3 / 4 to 0 i reszta 3,
    czyli wartość L się nie zmienia.

    arktik1 napisał:
    A i nie mogę używać WAIT.

    Wg. uznania. ;)

    arktik1 napisał:
    No i muszą być wyświetlane jednocześnie.
    Jednocześnie to znaczy muszą być widoczne na wyświetlaczu wszystkie.
    Na wyświetlaczu są widoczne napisy i znaki:
    1 Musi być widoczny efekt obrotu 3 x Chr
    2 Poziom płynu chłodniczego.5 x Chr
    3 znak °C x1 Chr
    Chyba że można je wpisywać do wyświetlacza po kolei ,w programie nie ma poleceń CLS.

    Wygląda, że jednocześnie jest wy,świetlanych maks. 7 znaków.
    Zdefiniuj 8 znaków - dla wiatraczka pierwsze dwa i podmienisz na drugie. Po podmianie można by dać cls, tylko, że spowoduje to mruganie wyświetlacza... Myślę, że jest jakieś inne polecenie, którego można użyć.
    Jeżeli ktoś ma na to pomysł to bardzo proszę napisać.

    0
  • #9 17 Wrz 2009 20:22
    arktik1
    Poziom 27  

    :D
    Reszta nie reszta w każdym razie działa jak licznik.
    :D
    Po każdej pętli jest podwyższone o 1 i wyświetla kolejne znaki.
    No ale nie o to tu chodzi.
    Ważne jest żeby wyświetlić więcej znaczków niż 8
    A może można zrobić tak szybko CLS i zamianę znaków żeby nie było widać mrugania wyświetlacza??

    Dodano po 1 [minuty]:

    A nie ma CLS TEXT albo coś takiego??

    0
  • #10 17 Wrz 2009 21:58
    thorin00
    Poziom 14  

    jest cos takiego jak cls text ..... to jest wyswietlacz tekstowy wiec polecenie cls czysci tekst, pozatym poleceniem Deflcdchar definiujesz znak a nie grafike (twoj znak wyglada jak grafika jednak to jest znak czyt. tekst)

    pozdrawiam

    -1
  • #11 17 Wrz 2009 23:52
    LED5W
    Poziom 32  

    arktik1 napisał:
    Reszta nie reszta w każdym razie działa jak licznik.

    Właśnie chodzi o to, że ta funkcja nic nie robi (oprócz spowalniania programu). Usuń, zobaczysz, że działa identycznie.


    arktik1 napisał:
    A może można zrobić tak szybko CLS i zamianę znaków żeby nie było widać mrugania wyświetlacza??

    Chodziło mi raczej o jakąś krótszą instrukcję (może wstawka w asm?), bo wyczytałem w helpie (komentarze w przykładach)
    pl
    Cytat:
    wybieramy LCD DATA RAM

    ang.
    Cytat:
    it is important that a CLS is following the deflcdchar statements because it will set the controller back in datamode

    I ze względu na to wymyśliłem, że jakoś pewnie się to da inaczej przełączyć.:D

    A co do cls text to napisali, że to jest dla wyśw. graficznych...

    0
  • #12 18 Wrz 2009 18:57
    ZbeeGin
    Poziom 38  

    Zatem należałoby kolegów nieco uświadomić:

    - CLS TEXT | GRAPH jest dla wyświetlaczy graficznych posiadających wbudowany generator znaków i tym samym posiadający dwie strony pamięci: jedna na grafikę, drugą na tekst.

    - CLS jako, że jest komendą niezależną przywraca status sterownika tak, że korzysta on później z pamięci DATA RAM i wszystko co jest później wysłane jako dane trafia do tej pamięci. Jeśli dane trafią w wyświetlane okno - a można je przesuwać po tej pamięci za pomocą SHIFTLCD - to zostaną one wyświetlone na ekranie jako znaki.

    - DEFLCDCHAR jest traktowane jako instrukjcja-dyrektywa, która wykonuje się tylko po inicjalizacji modułu LCD i redefiniuje zawartość CG RAM. Po tej operacji sterownik dalej pamięta ostatni adres i do jakiej pamięci się on odnosi. Dlatego późniejsze wywołanie LCD mogłoby dane wysłać do CG RAM albo w próżnię. Stąd należy albo dokonać jakiejś niezależnej operacji tekstowej, albo po prostu wysłać komendę ustawiającą nowy adres już w pamięci DATA RAM.

    Wracając jednak do tematu przewodniego.

    Jedynym słusznym rozwiązaniem jest napisanie procedury - wcale nie musi to być wstawka asemblerowa - która będzie dynamicznie podmieniać definicję jednego znaku, tworząc animację odwołując się bezpośrednio do pamięci CG RAM. Jak napisałem wyżej DEFLCDCHAR się do tego niestety nie nadaje.
    Sterownik sam będzie zmieniał postać znaku bez potrzeby CLS i pisania znaku na nowo, gdyż w pamięci zapisane są tylko indeksy - kody znaków w ASCII - jakie mają być wyświetlane na danej pozycji i przy kolejnym odświeżeniu matrycy przez sterownik (ok. 100Hz) z pamięci zostanie pobrana nowa bitmapa znaku.

    arktik1 pobierz sobie dokumentację sterownika HD44780U. Znajdź sekcję opisującą jak definiować własne znaki i skorzystaj z ukrytych procedur jakie można wywołać z poziomu BASIC-a: http://zbeegin.republika.pl/bashelp/attaching_lcd.html

    Z zastosowaniem tylko dwóch rozkazów maszynowych RCALL można to wykonać tak:

    Code:
    $regfile = "attiny2313.dat"
    
    $crystal = 4000000

    Config Lcd = 16 * 2

    Dim I As Byte
    Dim B As Byte
    Dim W As Byte
    Dim J As Byte

    Cls
    Lcd Chr(0)

    Do
     Restore Cgdata
     For J = 1 To 4
      For I = 0 To 7
        Read B
        W = 64 + I
        _temp1 = W
        rCall _lcd_control
        _temp1 = B
        rCall _write_lcd
      Next I
      Waitms 500
     Next J
    Loop

    End


    Cgdata:
      Data 32 , 25 , 1 , 32 , 16 , 19 , 32 , 32
      Data 32 , 12 , 1 , 17 , 16 , 6 , 32 , 32
      Data 32 , 6 , 16 , 17 , 1 , 12 , 32 , 32
      Data 32 , 19 , 16 , 32 , 1 , 25 , 32 , 32

    Jak zmienisz adres początkowy w zmiennej W (stała część '64') to uzyskasz dostęp do innego znaku z 8 dostępnych. Program był testowany na realnym sprzęcie więc działa. Jeśli u Ciebie nie działa to masz niekompatybilny sterownik wyświetlacza.

    Jak skrócisz pętlę i będziesz sobie definiował stałą część zmiennej W na podstawie parametru oraz zmieniał adres danych przez RESTORE też na podstawie parametru; to będziesz miał uniwersalną procedurę, która będzie się zajmować redefiniowaniem znaków "w locie".

    Dziękuję za uwagę.

    0
  • #13 20 Wrz 2009 10:35
    arktik1
    Poziom 27  

    No dobra ,a jak ustawić znak żeby był wyświetlany tam gdzie chcę??
    Na przykład LOCATE 2,1 i LOCATE 2,9

    0
  • Pomocny post
    #14 20 Wrz 2009 12:47
    ZbeeGin
    Poziom 38  

    Na takie niedorzeczne pytanie niestety nie odpowiem.

    0
  • #15 20 Wrz 2009 12:50
    arktik1
    Poziom 27  

    :D

    Code:

    Locate 1 , 5
    Lcd Chr(0)

    Oj tam ,od razu niedorzeczne :D

    0
  • #16 20 Wrz 2009 17:32
    LED5W
    Poziom 32  

    Napisz jeszcze tylko dlaczego kursor przeskakuje w inne miejsce przy takiej podmianie?

    0
  • #18 20 Wrz 2009 20:33
    arktik1
    Poziom 27  

    Jest jeszcze jakiś inny sposób na zdefiniowanie większej ilości znaków??

    0
  • #19 20 Wrz 2009 21:21
    ZbeeGin
    Poziom 38  

    Pewnie, że jest: wyświetlacz graficzny. Najlepiej rozdzielczości CGA.

    0
  • #20 20 Wrz 2009 22:05
    arktik1
    Poziom 27  

    No tak.
    Graficznym zajmiemy się w następnym temacie :D :D

    0