Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

menu w projekcie-- bascom

grabek_radek 19 Dec 2006 23:13 4169 8
  • #1
    grabek_radek
    Level 21  
    Witam
    Mam taki problem jak zrobic meniu w projekcie troszeczke rozbudowanego termostatu a mianowice
    na wyswietlaczu 2x16 ma byc wyswietlana informacja o danej temperaturze, zegar
    a po nacisnieciu przycisku "enter" wchodze do menu i wyswietla sie na lcd "medu glowne" a w drugiej lini tempetarura po klikniecu na up pokazuje sie "ustaw zegar" i jesli np. jestesmy w menu glownym temperatura i klikamy na "enter " to wchodzi i dopiero pokazuje nam temp zadana i mozemy przestawiac ;)



    juz sie mecze nad tym i jakos nbie wychodzi wyswietlacz rozmazany
    wszystko robie w petli glownej do loop i to moze byc problem ale zak zaczolem z podprogramami to nic nie wychodzilo.

    a dodam ze nie moge trzymac klawiszy, wiec sobie pomodlem dadatkowymi licznikami czyli np jeli wcisnalem klawisz enter to zwiekszal mi sie enter=enter+1 a w nastepnej kolejnosci sobie sprawdzalem czy i =1 jesli tak to to wyswietla mi sie menu ale to straszna lipa co zrobilem jak ktos juz takie tworzyl to moze zademonstruje zrodlo kodu ;)
  • #2
    szymtro
    Level 30  
    zmień podejście do problemu.
    Petle oddzielne dla każdego ekranu w ten sposób:
    Code:
    ...
    
    menu_glowne_pc:
     lcd "Menu glowne Temp" 'przyklad
    menu_glowne:
     if cos_tam=1 then
      locate x,y:lcd temp
      cos_tam=0
     end if
     if tajmerek_klawisz=0 then goto menu_99_pc 'pc=pierwszy cykl
    goto menu glowne
    ...
    menu_99_pc:
     lcd "jakis tekst naglowka" 'to wykona sie tylko przy wchodzeniu do tego
    menu_99
    goto menu_99

    Czaisz coś takiego?
  • #3
    grabek_radek
    Level 21  
    ok juz cos idze zrobilem podprogramy, w kazdym podprogramie jest osobna petla i jakos idzie i jest dobrze :)

    Dodano po 1 [godziny] 8 [minuty]:

    Code:


    $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 Pind.0 = Input
    Config Pind.1 = Input
    Config Pind.2 = Input
    Config Pind.3 = Input
    Dim Temp_zadana As Integer

     Temp_zadana = 0





    Do
    Cls
    Lcd "cos tam"
    Waitms 50
    If Pind.2 = 0 Then
       Waitms 25
       If Pind.2 = 0 Then
          Gosub Menu
       End If
    End If



    Loop
    End


    Menu:

    Do


     Cls

       Lcd "Menu glowne"
       Lowerline
       Lcd "Temperatura"
       Waitms 50
       If Pind.3 = 0 Then
          Waitms 25
          If Pind.3 = 0 Then
          Return
          End If
       End If

       If Pind.2 = 0 Then
          Waitms 25
          If Pind.2 = 0 Then
             Gosub Temp
          End If
       End If

       If Pind.1 = 0 Then
          Waitms 25
          If Pind.1 = 0 Then
             Gosub Zegar
          End If
       End If




    Loop
    End

    Temp:
          Do
          Cls
          Lcd "TEMPERATURA"
          Lowerline
          Lcd Temp_zadana
          Waitms 50

          If Pind.1 = 0 Then
             Waitms 25
             If Pind.1 = 0 Then
                Temp_zadana = Temp_zadana + 1
             End If
          End If

          If Pind.0 = 0 Then
             Waitms 25
             If Pind.0 = 0 Then
                Temp_zadana = Temp_zadana - 1
             End If
          End If


          If Pind.3 = 0 Then
             Waitms 25
             If Pind.3 = 0 Then
                Return
          End If
          End If
          Loop
    End

    Zegar:
          Do
          Cls
          Lcd "Memu glowne"
          Lowerline
          Lcd "ZEGAR"
          Waitms 50
          If Pind.0 = 0 Then
             Waitms 25
             If Pind.0 = 0 Then
                Return

             End If
          End If

          If Pind.3 = 0 Then
             Waitms 25
             If Pind.3 = 0 Then
                Return
             End If
          End If

          Loop
    End
    [/quote]
  • #4
    szymtro
    Level 30  
    Ok next level.
    Teraz wyrzuć opisy menu poza pętle - tak żeby do wyświetlacza wysyłane były tylko raz - pod warunkiem że nie zmieniaja sie podczas tego menu.
    Tak samo inne napisy w menu które sie nie zmieniają.
    Potem sprawdzaj czy zmienna do wyświetlenia ci sie zmieniła i jeżeli tak to najpierw wyczyść całe pole pod zmienną spacjami a następnie wysyłaj tylko ją
    Code:
    locate x,y:lcd "   ":locate x,y:lcd zmienna
    I wywal te nieszczesne opóźnienia z pętli - one są zbędne.
    I jeszcze napisz dlaczego upierasz się na to do loop? Przecież konstrukcja
    Code:
    petla: goto petla
    działa tak samo.
  • #5
    grabek_radek
    Level 21  
    hmmm jesli chodzi o te opoznienia 25 ms to jest to czas ktory eleminuje drgania styku - mikroshwicza, a jesli chodzi o te petle do loop w podprogramach to nie iwedzialem ze jesli zastosuje
    Quote:
    gosub menu
    to ten program sie bedzie wykonywal non-stop hmm czegos chyba nie rozumiem a i jeszcze dlatego uzylem petli bo musze w niej sprawdzac stan przycisku EXIT

    ale dzieki za jakiekolwiek skazowki jeszcze nie skonczylem tego w dalszym ciagu zozbudowywuje menu itd. [/code]
  • #6
    szymtro
    Level 30  
    Nie łam się - idzie ci bardzo dobrze.
    Moje wypowiedzi miały ukierunkować cię na jedynie słuszna drogę:

    bascom -> bascom+wstawki asm -> asm

    Także testuj różne rozwiazania tego samego problemu i wybieraj te które zajmuja najmniej pamięci - jest to prawie jednoznaczne z szybkoscią działania programu po kompilacji bascomem.

    I jeszcze raz o tym lcd.
    Wiadomo ze jak masz kolejne label jedna pod drugą bez dodatkowych skosków (goto) pomiedzy nimi to jest oczywiste że program wykona jedna po drugiej.
    W ten sposób można wykorzystać to do wyświetlenia tylko raz stałych napisów menu (nazwijmy to tłem) oraz odpowiednio szybkie wyświetlanie samych zmiennych w zaplanowanych miejscach.
    Takie coś przyspieszy samo wykrywanie przycsików i pewnosć działania programu.[/url]
  • #7
    grabek_radek
    Level 21  
    heh i jeszcze kilka malych problemow pisze tutaj aby wszystko bylo jasne :)
    chce wystawic na pinid.5 stan wyskoki i pozniej go zmienic czyli np

    config pind.5=output
    ..
    powiedzmy ze to jest w do loop

    do
    set pind.5
    wait 1
    reset pinb.5
    wait 1
    loop
    i oczywiscie to nie dziala caly czas pokazuje ze jest stan 0

    na forum juz bylo poruszane ale tamten zapis chyba jest nie prawidlowy bo wywala blad w bascomie https://www.elektroda.pl/rtvforum/topic443418.html

    Code:
    Config Pind.0 = 1
    
    Do: Portd.0 = 1: Waitms 500: Portd.0 = 0: Waitms 500: Loop


    a i jeszcze jedna spraw chce zrobic taki powiedzmy licznik ze po nacisnieciu klawisza bedzie zwiekszal o 0,1 i nie wiem jak bo jesli bede mial zmienna single to musze to odpowiednio zmienic ale jak to ja nie mam pojecia ;(

    Dodano po 1 [godziny] 20 [minuty]:

    ok juz rozwiazane !!!! czeski blad ;)

    Ale jeszcze pozostaja 2 sprawy a mianowicie porownanie 2 zmiennych :(


    Code:

    Dim Rd(2) As Byte
    Dim Rdp As Integer
    Dim T As Integer
    Dim Sds As String * 6

      Dim M As Byte
      Dim G As Byte
      Dim S As Byte
      G = 0
      M = 0
      S = 0

      Dim Wart_bcd As Byte

    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 14 , 10 , 10 , 10 , 10 , 17 , 31 , 14
    Deflcdchar 2 , 32 , 7 , 10 , 18 , 18 , 17 , 8 , 7
    Deflcdchar 3 , 32 , 32 , 16 , 8 , 8 , 8 , 16 , 32
    Deflcdchar 4 , 16 , 16 , 16 , 20 , 22 , 31 , 6 , 4
     Temp_zadana = 0


    On Timer1 Odmierz_1s
    Enable Interrupts
    Enable Timer1

    Counter1 = 34286

    Do

        Cls
       Lcd Chr(1) ; Sds ; Chr(0) ; "C"
       Lowerline
       Wart_bcd = Makebcd(g)
       Lcd Chr(2) ; Chr(3) ; Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(m)
       Lcd Bcd(wart_bcd) ; ":"

       Wart_bcd = Makebcd(s)
       Lcd Bcd(wart_bcd)

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 100
       1wreset
       1wwrite &HCC
       1wwrite &HBE

       T = 1wread(2)

       T = T * 10
       T = T / 16
       Sds = Str(t)
       Sds = Format(sds , "0.0")

    ....
    powiedzmy ze mam cos takiego patrzymy tylko na pomiar temperatury ja widac zmieniam sobie format wyswietlany do postaci jednego miejsca po przecinku i teraz jak zrobic porownanie a raczej strawdzenie

    If temp_zadana > Sds then
    cos tam ;)
    else
    cos tam innego ;)
    end if

    tylko musze chyba zmienna temp_zadana przerobic do wartosci takiej samej jak Sad aby ja porownac :)??
    A druga sprawa o jest z tym zwiekszaniem licznika o 0,1 po nacisniecu swich'a i terz aby wyswietlal w tym samym formacie co Sds

    Dodano po 19 [minuty]:

    chyba mnie moderator ukarze ;)

    ale problem rozwiazany moze sie komus to przyda
    Code:
      
    
    .
    .
    .
     Thelp = Str(temp_zadana)
       Thelp = Format(thelp , "0.0")


       If Thelp > Sds Then
          Portd.5 = 0

       End If
    .
    .
    .
    teraz dziala bez problemu
  • #8
    Marek_RADOM
    Level 18  
    Witam nie chciałem zakładać nowego tematu żeby nie zaśmiecać forum. Jestem początkujący w programowaniu i zaczynam z Bascomem.

    Robię mini komputer samochodowy (zegarek programowo, 2 czujniki DS18B20, i inne komunikaty). Problem polega na tym, że mój program jest mało przejrzysty i nie zawiera zmiennych. Nie mogę zrobić ustawiania zegara , gdyż nie wiem jak zrobić aby program zwiększał np. godziny tylko do godz 23 i wracał do 0. Obecnie próbuje zrobić to ustawianie godziny. Mój program działający bez ustawiania godziny wygląda tak:

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000                                          'wewnętrzny oscylator 8MHz

    Config Portc = &B1110000                                    'porty PC4, PC5 i PC6 jako wyjścia
    Config Portd = &B1010000
    Config Portb = Output                                       'wszystkie porty PB jako wyjścia


    Portc.0 = 1                                                 'wewnętrzne podciągnięcie portów PC0, PC1 i PD3 do 1
    Portc.1 = 1
    Portd.3 = 1

    Config Lcdbus = 4                                           'konfiguracja wyświetlacza
    Config Lcd = 16 * 1a
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Config Timer1 = Timer , Prescale = 64
    Config Timer0 = Counter , Edge = Falling
    Cursor Off
    Cls

     Config Clock = Soft                                        'Konfiguracja czasu.

     Config Date = Dmy , Separator = /                          'Konfig. daty. Dmy=dzień,miesiąc,rok. Seperator=/,albo-,albo. .

     Enable Interrupts                                          'Uruchamiamy odblokowania.

     Date$ = "02/04/07"                                         'Ustawiamy datę od której wystartuje.

     Time$ = "12:00:00"                                         'Ustawiamy czas od którego wystartuje.


    Poczatek:

    Cls
    Reset Portc.5
    Bitwait Pind.0 , Set
    If Pind.1 = 1 Then Set Portc.5                              'podświetlanie
    If Pind.1 = 0 Then Reset Portc.5
    Set Portc.4                                                 'bip przy powitaniu
    Waitms 100
    Reset Portc.4
    Lcd " Witam! "
    Wait 3
    Cls






    Dim T As Integer , Stt As String * 6
    Cls
    Do

    If Pind.1 = 1 Then Set Portc.5                              'podświetlanie
    If Pind.1 = 0 Then Reset Portc.5

    If Pinc.0 = 0 Then Cls
    If Pinc.0 = 0 Then Waitus 1
    If Pinc.0 = 0 Then Goto Zegar                               'jeśli przycisk wciśnięty to przejdź do zegara

    Swiatla:
    If Pind.1 = 1 And Pind.0 = 0 Then Portc.4 = 1               'przypomnienie o zgaszeniu świateł

    If Pind.1 = 1 And Pind.0 = 0 Then Cls

    1:
    If Pind.1 = 1 And Pind.0 = 0 Then Lcd "Zgas"
    Lowerline
    If Pind.1 = 1 And Pind.0 = 0 Then Lcd "swiatla!"
    If Pind.1 = 1 And Pind.0 = 0 Then Goto 1
    If Pind.1 = 0 And Pind.0 = 0 Then Goto 2

    2:
    If Pind.1 = 0 And Pind.0 = 0 Then Cls
    If Pind.1 = 0 And Pind.0 = 0 Then Reset Portc.4

    Pozegnanie:
    If Pind.0 = 0 Then Cls                                      'pożegnanie
    If Pind.0 = 0 Then Wait 1
    If Pind.0 = 0 Then Lcd "Do"
    Lowerline
    If Pind.0 = 0 Then Lcd "      widzenia"
    If Pind.0 = 0 Then Set Portc.4                              'bip przy pożegnaniu
    If Pind.0 = 0 Then Waitms 100
    If Pind.0 = 0 Then Reset Portc.4
    If Pind.0 = 0 Then Wait 3

    If Pind.1 = 0 And Pind.0 = 0 Then Reset Portc.5             'wyłaczenie
    If Pind.0 = 0 Then Goto Poczatek


    Temperatura:

    Config 1wire = Portc.3                                      '1 czujnik temperatury
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    T = 1wread(2)
    T = T * 10
    T = T / 16
    Stt = Str(t)
    Stt = Format(stt , "0.0")
    Home
    Locate 1 , 1
    Lcd "Zew"
    Locate 1 , 5
    Lcd Stt ; " ";

    If Pinc.0 = 0 Then Cls
    If Pinc.0 = 0 Then Waitus 1
    If Pinc.0 = 0 Then Goto Zegar                               'jeśli przycisk wciśnięty to przejdź do zegara


    Config 1wire = Portc.2                                      '2 czujnik temperatury

    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    T = 1wread(2)
    T = T * 10
    T = T / 16
    Stt = Str(t)
    Stt = Format(stt , "0.0")
    Home
    Locate 2 , 1
    Lcd "Wew"
    Locate 2 , 5
    Lcd Stt ; " ";

    Loop

    Zegar:

     Do                                                         'Pętla główna zegara

     Cls                                                        'Czyść Lcd.

     If Pind.1 = 1 Then Set Portc.5                             'podświetlanie
     If Pind.1 = 0 Then Reset Portc.5

     If Pinc.1 = 0 Then Cls
     If Pinc.1 = 0 Then Waitus 1
     If Pinc.1 = 0 Then Goto Temperatura                        'jeśli przycisk wciśnięty to przejdź do temperatur

     Lcd Time$                                                  'Pobierz aktualny czas.

     Lowerline                                                  'W drugiej linii.

     Lcd Date$                                                  'Pobierz aktualną datę.

     If Pinc.1 = 0 Then Cls
     If Pinc.1 = 0 Then Waitus 1
     If Pinc.1 = 0 Then Goto Temperatura                        'jeśli przycisk wciśnięty to przejdź do temperatur

     If Pind.1 = 1 And Pind.0 = 0 Then Goto Swiatla             'jeśli światła zapalone i stacyjka wyłączona to przejdź do Swiatła
     If Pind.1 = 0 And Pind.0 = 0 Then Goto Pozegnanie          'jeśli stacyjka i swiatla wylaczone to przejdz do Pozegnanie
     Waitms 100                                                 'Trzymaj chwilę wyświetlony czas.

     Loop                                                       'Zamknij pętlę.

     End                                                        'Koniec pętli.


    End


    W programie testowym zrobiłem to tak:
    Code:

    If Pinc.1 = 0 Then
             Waitms 25
             If Pind.1 = 0 Then
                _hour = _hour + 1
             End If
          End If


    Ale zlicza dalej godziny 24,25,26 itd.

    Aha i jeszcze chodzi mi o to żeby zrobić jakoś sterowanie 3-ma przyciskami tak aby w menu zegara przycisk 1 slużył do zmiany godzin, minut itp, a 2 przycisk służył do przełączania między godzinami a minutami, a trzeci do przełączania między funkcjami. Sekundy już mało ważne są bo bez tego już ustawić równo można.
  • #9
    Kuniarz
    Moderator of Designing
    tak na pierwszy rzut oka to zmień :

    Code:
    Pozegnanie: 
    
    If Pind.0 = 0 Then Cls                                      'pożegnanie
    If Pind.0 = 0 Then Wait 1
    If Pind.0 = 0 Then Lcd "Do"
    Lowerline
    If Pind.0 = 0 Then Lcd "      widzenia"
    If Pind.0 = 0 Then Set Portc.4                              'bip przy pożegnaniu
    If Pind.0 = 0 Then Waitms 100
    If Pind.0 = 0 Then Reset Portc.4
    If Pind.0 = 0 Then Wait 3


    na :

    Code:

    Pozegnanie:
    If Pind.0 = 0 Then                                      'pożegnanie
       cls
       Wait 1
       Lcd "Do"
       Lowerline
      Lcd "      widzenia"
      Set Portc.4                              'bip przy pożegnaniu
      Waitms 100
      Reset Portc.4
      Wait 3
    EndIf