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

Mega8[Bascom] Problem z Menu programu

MaxDamage18 02 Maj 2009 01:31 1790 8
REKLAMA
  • #1 6480277
    MaxDamage18
    Poziom 10  
    Witam, chciałbym na wstępie napisać, iż są to moje pierwsze godziny z bascomem i jeśli kogoś zdenerwuje moje pytanie. Prosiłbym o powstrzymanie się od złośliwych odpowiedzi. Co do pytania: chciałem zrobić menu programu gdzie w dolnej lini maiła by się wyświetlać zmienna, dla użytkownika była by to numeracja a dla programu informacja, która zakładka jest wyświetlana. I tu się zatrzymałem napisałem, że jak przycisk naciśnięty to zwiększ i wyświetl "N", lecz na LCD cały czas 0 problemy mam ogólnie z obsługą przycisków. proszę o naprowadzenie gdzie jest błąd albo zilustrowanie jak to powinno wyglądać.

    
    $regfile = "m8def.dat"
    $crystal = 8000000
    '''''''''''''''''''''''''''''''''''''''
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Pinb.1 = Input
    Config Portc.6 = Output
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Set Portb.2
    Set Portb.1
    Set Portb.3
      Config Pinb.0 = Input
       Set Portb.0
        S2 Alias Pinb.0
        Prawo Alias Pinb.3
        Lewo Alias Pinb.2
    ''''''''''''''''''''''''''''''''''''''
    S1 Alias Pinb.1
    Dim I As Byte
    Dim M As Byte
    
    
    
    
    
    
    Cls
    Lcd "MaxDamage"
    
    Waitms 500
    Lowerline
    Lcd "maxdamage17@interia.pl"
    Wait 4
    For I = 1 To 20
       Shiftlcd Left
       Waitms 500
    Next I
    Cls
    Lcd "-=xxxxxxxxx=-"
    Lowerline
    Lcd "xxxxxx"
    Wait 2
    For I = 1 To 16
    
       Shiftlcd Right
       Waitms 500
    Next I
    Cls
    Gosub Cent
    End                                                         'end program
    Cent:
       Cls
       Lcd Chr(1)
       Deflcdchar 1 , 4 , 10 , 10 , 10 , 17 , 17 , 17 , 14
       Locate 1 , 2
       Lcd "CPU=??"
       Lowerline
       Lcd Chr(1)
       Locate 2 , 2
       Lcd "GPU=??"
       Locate 1 , 8
       Lcd Chr(0)
       Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32
       Locate 2 , 8
       Lcd Chr(0)
       Locate 1 , 9
       Lcd "C"
       Locate 2 , 9
       Lcd "C"
       Locate 1 , 11
       Lcd Chr(2)
       Deflcdchar 2 , 32 , 32 , 19 , 26 , 4 , 11 , 25 , 32
       Locate 2 , 11
       Lcd Chr(2)
       Locate 1 , 12
       Lcd "=???%"
       Locate 2 , 12
       Lcd "=???%"
    
      If Prawo = 0 Then
          Waitms 25
          If Prawo = 0 Then
             Do
                Incr M
                Locate 2 , 1
                Lcd M
             Loop
    
          Do
          Loop Until Prawo = 1
          End If
       End If
    
     Do
       Debounce S1 , 0 , Mnu , Sub
       Debounce S2 , 0 , Cent , Sub
       Debounce Lewo , 0 , Test , Sub
    Loop
    Return
    
    
    Mnu:
    Portc.6 = 0
    Waitms 50
    Portc.6 = 1
    Cls
    Config Pinb.0 = Input
    Set Portb.0
    
    Deflcdchar 3 , 15 , 31 , 6 , 6 , 6 , 6 , 6 , 6
    Deflcdchar 4 , 4 , 14 , 14 , 14 , 14 , 4 , 4 , 4
       Cls
       Locate 1 , 1
       Lcd Chr(3)
       Locate 1 , 16
       Lcd Chr(4)
       Locate 1 , 2
       Lcd "=====MENU====="
       Lowerline
    
  • REKLAMA
  • Pomocny post
    #2 6480372
    Maciek4141
    Poziom 22  
    1. Sub trzeba zadeklarować (Declare Sub Menu), następnie piszesz
    Sub Menu
    ....
    .
    .....
    ...
    End sub

    2. Aby się odwołać do Sub`a piszesz call Menu.
    3. Do
    Incr M
    Locate 2 , 1
    Lcd M
    Loop
    Jak program wejdzie w tę pętlę to już z niej nie wyjdzie

    4. Osobiście do obsługi przycisków używam takiej składni:
    If pind.1=0 then
    Waitms 50
    Bitwait pind.1, set
    
    ...
    ...
    ...
    
    end if
    

    Zwróć uwagę na 0 i set

    5. Pamiętaj że sub`y powinny być tak wykorzystywane aby w nich program się nie zapętlał i aby po każdym wywołaniu podprogramu wrócił on do miejsca wywołania. Każdy skok do podprogramów zapisywany jest na stosie i jeżeli tych skoków będzie za dużo procek się zawiesi.

    6. Gdzie zgubiłeś pętlę główną programu, End znalazłem ale nic po za tym.
    Pozdrawiam
  • #3 6480496
    ZbeeGin
    Poziom 39  
    Maciek4141 napisał:
    5. Pamiętaj że sub`y powinny być tak wykorzystywane aby w nich program się nie zapętlał i aby po każdym wywołaniu podprogramu wrócił on do miejsca wywołania. Każdy skok do podprogramów zapisywany jest na stosie i jeżeli tych skoków będzie za dużo procek się zawiesi.

    Od tego jest SoftStack (SWStack) by jendnak go dostroić do potrzeb programu i przy wielokrotnym wywoływaniu Sub-a z Sub-a procesor tego stosu nie przepełnił. To tylko jedna instrukcja dodatkowo $swstack = wartość. Sposób przybliżonego wyliczenia rozmiarów stosów już kiedyś podawałem na forum.
    Ustawiając stos bardzo duży (mając oczywiście na pokładzie sporo IRAMu) można nawet pokusić się o rekurencję.
  • REKLAMA
  • #4 6480821
    janbernat
    Poziom 38  
    ZbeeGin:
    " można nawet pokusić się o rekurencję."
    A jakaś wskazówka gdzie o tym jest coś...
  • REKLAMA
  • #5 6481965
    Maciek4141
    Poziom 22  
    Wikipedię wyłączyli? Link
  • REKLAMA
  • #6 6483419
    MaxDamage18
    Poziom 10  
    Dzięki, z góry za pomoc. Zdeklarowałem Sub-y i poprawiłem przyciski jak napisałeś, lecz nadal nie działa. Popatrzcie na ten kod i napiszcie mi co w nim nie tak, że ze przycisk nie działa chodzi mi o tego "Prawo"
    
    $regfile = "m8def.dat"
    $crystal = 8000000
    '''''''''''''''''''''''''''''''''''''''
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Pinb.1 = Input
    Config Portc.6 = Output
    Config Pinb.2 = Input
    Config Pinb.3 = Input
    Config Pinb.0 = Input
    
    Set Portb.0
    Set Portb.2
    Set Portb.1
    Set Portb.3
    
    Declare Sub Cent
    Declare Sub Mnu
    ''''''''''''''''''''''''''''''''''''''
    S1 Alias Pinb.1
    S2 Alias Pinb.0
    Prawo Alias Pinb.3
    Lewo Alias Pinb.2
    Led Alias Portc.6
    
    
    Dim I As Byte
    Dim M As Byte
    
    Do
    
    
    
    
    
    Cls
    Lcd "MaxDamage"
    
    Waitms 500
    Lowerline
    Lcd "maxdamage17@interia.pl"
    Wait 4
    For I = 1 To 20
       Shiftlcd Left
       Waitms 500
    
    Next I
    Cls
    Lcd "-=xxxxxxxx=-"
    Lowerline
    Lcd "xxxxxxxxxxx"
    Wait 2
    For I = 1 To 16
    
       Shiftlcd Right
       Waitms 500
    Next I
       Cls
       Gosub Cent
    
    
    If Prawo = 0 Then
       Waitms 50
          If Prawo = 0 Then
             Incr M
             Toggle Led
             If M = 0 Then
                M = 2
          Bitwait Prawo , Set
             End If
         End If
    End If
    
    Loop
    End
                                                             'end program
    Sub Cent
    
       Cls
       Lcd Chr(1)
       Deflcdchar 1 , 4 , 10 , 10 , 10 , 17 , 17 , 17 , 14
       Locate 1 , 2
       Lcd "CPU=??"
       Lowerline
       Lcd Chr(1)
       Locate 2 , 2
       Lcd "GPU=??"
       Locate 1 , 8
       Lcd Chr(0)
       Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32
       Locate 2 , 8
       Lcd Chr(0)
       Locate 1 , 9
       Lcd "C"
       Locate 2 , 9
       Lcd "C"
       Locate 1 , 11
       Lcd Chr(2)
       Deflcdchar 2 , 32 , 32 , 19 , 26 , 4 , 11 , 25 , 32
       Locate 2 , 11
       Lcd Chr(2)
       Locate 1 , 12
       Lcd "=???%"
       Locate 2 , 12
       Lcd "=???%"
    
       Do
          Debounce S1 , 0 , Mnu , Sub
          Debounce S2 , 0 , Cent , Sub
       Loop
    
    End Sub
    
    
    Sub Mnu                                                     ''''''''''''''''''''''''''''''''''''''
    
    Cls
    
    Deflcdchar 3 , 15 , 31 , 6 , 6 , 6 , 6 , 6 , 6
    Deflcdchar 4 , 4 , 14 , 14 , 14 , 14 , 4 , 4 , 4
    
          Locate 1 , 1
             Lcd Chr(3)
          Locate 1 , 16
             Lcd Chr(4)
          Locate 1 , 2
             Lcd "=====MENU====="
       Lowerline
          Locate 2 , 1
             Lcd M
    
    End Sub
    
                                                      ''''''''''''''''''''''''''''''''''''''''''''
    
    
  • #7 6483470
    dawid512
    Poziom 32  
    Ten kod nawet nie jest wykonywany:
    If Prawo = 0 Then
       Waitms 50
          If Prawo = 0 Then
             Incr M
             Toggle Led
             If M = 0 Then
                M = 2
          Bitwait Prawo , Set
             End If
         End If
    End If 

    Dzieje się to dlatego że tutaj skaczesz do podprogramu:
    a w nim program pracuje ciągle w tej pętli:
    Do
          Debounce S1 , 0 , Mnu , Sub
          Debounce S2 , 0 , Cent , Sub
       Loop 
  • #8 6483589
    Maciek4141
    Poziom 22  
    Ja zmieniłbym jeszcze ten fragment kodu:
    
    If Prawo = 0 Then 
       Waitms 50 
          If Prawo = 0 Then 
             Incr M 
             Toggle Led 
             If M = 0 Then 
                M = 2 
          Bitwait Prawo , Set 
             End If 
         End If 
    End If

    na

    
    If Prawo = 0 Then 
       Waitms 50 
       Bitwait Prawo , Set
             Incr M 
             Toggle Led 
             If M = 0 Then 
                M = 2 
             End if
    End If
    


    Spójrz także na to:
    
       Do 
          Debounce S1 , 0 , Mnu , Sub 
          Debounce S2 , 0 , Cent , Sub 
       Loop
    


    Nie zdefiniowałeś parametru o którym mówił kolega wyżej. Program wkońcu ci stanie po odwołujesz się do tej samej procedury w której jesteś.
    Nie prościej powrócić z sub`a do pętli głównej i tam dalej obsługiwać przyciski?

    PS. Jak wrócę z obchodów to szerzej opiszę co i jak. :wink:
  • #9 6484746
    Maciek4141
    Poziom 22  
    Zrób tak:
    1. Usuń to:
       Do 
          Debounce S1 , 0 , Mnu , Sub 
          Debounce S2 , 0 , Cent , Sub 
       Loop


    2. To przenieś przed główną pętle programu
    Cls 
    Lcd "MaxDamage" 
    
    Waitms 500 
    Lowerline 
    Lcd "maxdamage17(małpa)interia.pl" 
    Wait 4 
    For I = 1 To 20 
       Shiftlcd Left 
       Waitms 500 
    
    Next I 
    Cls 
    Lcd "-=xxxxxxxx=-" 
    Lowerline 
    Lcd "xxxxxxxxxxx" 
    Wait 2 
    For I = 1 To 16 
    
       Shiftlcd Right 
       Waitms 500 
    Next I 
       Cls 
       Gosub Cent


    3. W pętli głównej daj obsługę reszty przycisków.
REKLAMA