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 AVR zmienna WORD iwyświetlacz LED - jak to zjeść

KrzysiekG 09 Paź 2003 20:19 2753 2
REKLAMA
  • #1 354821
    KrzysiekG
    Poziom 11  
    Posty: 62
    Pomógł: 1
    Ocena: 6
    Na wstępie chciałbym powiedzieć że piszę w BASCOM-ie AVR.
    Buduję urządzenie które ma wyświetlać wynik na wyświetlaczu 7-mio segmentowym (podyktowane warunkami środowiskowymi i widocznością).
    Napisałem program który działa (listing poniżej) ale dręczy mnie pytanie czy nie da się tego zrobić prościej tzn pobierać poszczególne cyfry bezpośrednio ze zmiennej WORD (LONG??) bez bez zmieniania jej na zmienną STRING (chodzi mi o oszczędność pamięci- niestety piszę na AT90S2313)

    Najważniejsze dla zagadnienia części programu wyglądają tak:

    Dim Sek As Byte
    Dim Czas As Word
    Dim Wynik As String * 4
    Dim Wyswietlacz As Byte
    Dim Cyfra_t As String * 1
    Dim Cyfra As Byte
    ' tutaj deklaracje przerwania itp
    Do
    'pozostałe części programu
    If Sek = 250 Then ' Aktualizacja wyniku co około 1 sekundę

    Wynik = Str(Czas) ' zmienna WORD zmieniam na STRING

    ' Ponieważ zmienna może przyjmować wartości od 0000 do 9999 a wyświetlacz będzie 3 cyfrowy a ja chcę wyświetlić tylko najstarsze pozycje zmieniam format uzyskanej zmiennej tekstowej aby przy zmiennej mniejszej od 1000 na wyświetlaczu uzyskać 0.99 a nie 999
    Wynik = Format(Wynik , "0000")
    Sek = 0
    End If
    Loop
    End
    ' tutaj podprogramy itp
    Co4ms:
    Timer0 = 6
    Incr Sek
    Incr Wyswietlacz
    If Wyswietlacz = 4 Then Wyswietlacz = 1
    Cyfra_t = Mid(wynik , Wyswietlacz , 1) ' pobranie kolejnych cyfr z tekstu
    Cyfra = Val(cyfra_t) ' zmiana tekstu na cyfrę
    Set Portd.3
    Set Portd.4
    Set Portd.5

    ' obsługa wyświetlacza
    Select Case Wyswietlacz
    Case 1:
    Portb = Lookup(cyfra , Cyfry)
    Portb.7 = 0
    Portd.5 = 0
    Case 2:
    Portb = Lookup(cyfra , Cyfry)
    Portd.4 = 0
    Case 3:
    Portb = Lookup(cyfra , Cyfry)
    Portd.3 = 0
    End Select
    Return
    Cyfry:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

    Zmienna CZAS pobierana jest z rejestru CAPTURE
    Będę bardzo wdzięczny za wszelkie sugestie.

    Pozdrawiam
    KrzysiekG
  • REKLAMA
  • #2 361591
    michalp33
    Poziom 12  
    Posty: 98
    Ocena: 2
    Ja to robie na przykład tak: dziele cyfre co ja mam wyswietlic przez 1000 i mam juz liczbe tysiecy czyli moge ja wyswietlic na pierwszym miejscu, nastepnie poleceniem a=wynik mod 1000 dostaje reszte z dzielenia przez 1000 dziele ja przez 100 i mam liczbe setek i znowu mod 100 i mam reszte z dizelenia przez 100 kolejne dzielenie przez 10 da w rezultacie liczbe dziesiatek i jednosci. Nie wiem czy to mniej pamieci zre ale znajac bascoma to te funkcje zamiany liczb na stringi to troche kodu biara. Pozdr.
  • #3 361973
    KrzysiekG
    Poziom 11  
    Posty: 62
    Pomógł: 1
    Ocena: 6
    Cześć michalp33

    Zadanie rozwiązałem właśnie w taki sposób kod wynikowy zmniejszył się o 350 bajtów - to bardzo dobry wynik.
    Dzięki za zainteresowanie tematem.

    Pozdrawiam
    KrzysiekG
REKLAMA