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

proste i ładne podmenu w Bascomie

dasioo 31 Lip 2010 21:36 2177 13
REKLAMA
  • #1 8352150
    dasioo
    Poziom 14  
    Witam,
    mam problem ze zrobieniem podmenu w Bascomie do nastawiania
    wartości na zegarku jak poniżej:
    proste i ładne podmenu w Bascomie

    Proszę się nie śmiać, chodzi o to aby menu nie było programożerne, dawało się wywoływać z menu głównego a zmieniane wartości były zaznaczane kursorem.
    Powyższy screen ma się nie zmieniać w trakcie wprowadzania danych, jedynie wartości mają się zwiększać lub zmniejszać.

    Nie proszę o gotowca ale podpowiedź jak to prosto zrobić?
  • REKLAMA
  • #2 8352480
    tadzik85
    Poziom 38  
    proponuje wzorować się ustawieniem zegarka w telefonach.

    najpierw puste pola. wpisujesz odpowiedni wartości numerycznie lub tez ustawiasz pojedyncze cyfry plusem/minusem i przesuwając kursor, niestety jednak to pochłonie trochę kodu, będzie trzeba uwzględnić blednę wartości.
  • REKLAMA
  • #3 8352496
    dasioo
    Poziom 14  
    a jakby wyglądał szkielet takiego podmenu?
    robić to na goto i zapętlać je w sobie??
  • REKLAMA
  • #4 8352604
    tadzik85
    Poziom 38  
    spróbuj sam.
  • #5 8353011
    adi84_84
    Poziom 14  
    Np: skok przez GOTO do Czas:

    Czas:
    Cls
    If Pind.1 = 0 Then
    Waitms 25
    If Pind.1 = 0 Then
    Incr _hour
    _sec = 0
    If _hour = 24 Then
    _hour = 0
    End If
    End If
    End If
    If Pind.2 = 0 Then
    Waitms 25
    If Pind.2 = 0 Then
    _sec = 0
    Incr _min
    If _min = 60 Then
    _min = 0
    End If
    End If
    End If
    Locate 1 , 5
    Lcd Time$
    Lowerline
    Lcd "   Ustaw CZAS   "
    Waitms 100
  • #6 8353918
    Konto nie istnieje
    Konto nie istnieje  
  • #7 8354816
    LED5W
    Poziom 34  
    dasioo napisał:
    a jakby wyglądał szkielet takiego podmenu?
    robić to na goto i zapętlać je w sobie??
    Absolutnie nie!
    Kiedyś pisałem coś takiego: Link
    Na jaki µC piszesz?
  • #8 8354987
    dasioo
    Poziom 14  
    piszę na atmegę32, jako klawiaturę używam expander MAX7325.
    mój pomysł jest taki aby utworzyć szablon główny do którego będę podmieniał dane.

    Jestem bliski napisania kodu, jeszcze drobna kosmetyka. Dziękuję za wszelkie porady :):)
  • #9 8362189
    dasioo
    Poziom 14  
    Witam,
    Zamieszczam kod obsługi RTC (odczyt oraz zapis) i proponuję wspólną
    jego optymalizację.
    Kod ma małe wady, na które może ktoś znajdzie rozwiązanie :)
    Program działający i można go sprawdzić u siebie.
    Będę wdzięczny za wszelkie sugestie i poprawki
    
    $regfile = "m32def.dat"
    $crystal = 10000000
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.0
    Cls
    Cursor Off
    Config Scl = Portc.0
    Config Sda = Portc.1
    Config I2cdelay = 10
    Config Portd.4 = Output
    Dim Klaw As Byte
    Dim Klaw_no As Byte
    Dim Temp As Byte
    Dim Tmp As Bit
    Dim X As Byte
    Dim Zakres_max As Byte
    Dim Zakres_min As Byte
    Dim Przekroczenie As Byte
    
    
    
    
    Reset_key Alias Portd.4
    Buzzer Alias Portd.5
    
    
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    Dim Dni_tygodnia As Byte
    Dim Daty As Byte
    Dim Miesiace As Byte
    Dim Lata As Byte
    Dim Minuty_alarm As Byte
    Dim Godziny_alarm As Byte
    Dim Dzien_tygodnia As String * 3
    Dim Adres As Byte
    Sekundy = 50
    Minuty = 59
    Godziny = 23
    Dni_tygodnia = 6
    Daty = 31
    Miesiace = 12
    Lata = 10
    
    'Godziny_alarm = 0
    'Minuty_alarm = 0
    
    
    Gosub Zapis
    Gosub Czytanie
    
    
    
    
    Do
    
    
    
    Gosub Czytanie
    
    
    Set Reset_key
    I2cinit
    I2cstart
    I2cwbyte &B11011011
    I2crbyte Klaw , Ack
    I2crbyte Klaw , Nack
    I2cstop
    Reset Reset_key
    
    
    If Klaw = 64 Then
    Gosub Ustaw_zegar
    End If
    
    
    '**************************** wyswietlanie**************************************
    
    
    Lcd Godziny ; ":" ; Minuty ; ":" ; Sekundy
    Locate 1 , 14
    Lcd Dni_tygodnia
    Lowerline
    Lcd Daty ; "/" ; Miesiace ; "/" ; "20" ; Lata
    
    
    '**************************** wyswietlanie**************************************
    
    
    
    Waitms 500
    Cls
    
    
    
    Loop
    
    
    
    
    
    
    
    
    
    '***************Podmenu Clock***************************
    Ustaw_zegar:
    Gosub Czytanie
    Klaw = 0
    Tmp = 1
    Temp = 1                                                    'zacznij od godzin
    
    
    
    
    Do
    
    
    If Tmp = 1 Then
    
       Select Case Temp
    
       Case 1:
       X = Godziny
       Zakres_max = 23
       Zakres_min = 0
       Przekroczenie = 255
    
       Case 2:
       X = Minuty
       Zakres_max = 59
       Zakres_min = 0
       Przekroczenie = 255
    
       Case 3:
       X = Sekundy
       Zakres_max = 59
       Zakres_min = 0
       Przekroczenie = 255
    
       Case 4:
       X = Dni_tygodnia
       Zakres_max = 7
       Zakres_min = 1
       Przekroczenie = 0
    
       Case 5:
       X = Daty
       Zakres_max = 31
       Zakres_min = 1
       Przekroczenie = 0
    
       Case 6:
       X = Miesiace
       Zakres_max = 12
       Zakres_min = 1
       Przekroczenie = 0
    
       Case 7:
       X = Lata
       Zakres_max = 99
       Zakres_min = 10
       Przekroczenie = 9
    
       End Select
       Tmp = 0
    
    End If
    
    
    If Klaw = 64 Then
       Incr X
       Sound Buzzer , 300 , 300
    End If
    If Klaw = 32 Then
       X = X + 10
       Sound Buzzer , 300 , 300
    End If
    If X > Zakres_max Then
       X = Zakres_min
    End If
    
    If Klaw = 2 Then
       Decr X
       Sound Buzzer , 300 , 100
    End If
    If Klaw = 1 Then
       X = X - 10
       Sound Buzzer , 300 , 100
    End If
    If X = Przekroczenie Then
       X = Zakres_max
    End If
    
    
    
    'Select Case X
    
    'Case Zakres_max To 110:
    '   X = Zakres_min
    
    'Case 245 To Zakres_min
    '   X = Zakres_max
    
    'End Select
    
    
    
    
    If Klaw = 8 Then
       Gosub Zapis
       Klaw = 0
       Exit Do
    End If
    If Klaw = 128 Then
       Exit Do
    End If
    
    
    If Klaw = 4 Then
       Incr Temp
       Tmp = 1
    End If
    
    If Temp > 7 Then
       Temp = 1
    End If
    
    If Klaw = 16 Then
       Decr Temp
       Tmp = 1
    End If
    
    If Temp = 0 Then
       Temp = 7
    End If
    
    
    
    'czytanie klawiatury
    Klaw_no = Klaw
    Set Reset_key
    I2cinit
    I2cstart
    I2cwbyte &B11011011
    I2crbyte Klaw , Ack
    I2crbyte Klaw , Nack
    I2cstop
    Reset Reset_key
    
    'aby wyeliminowac podwojne klikniecia
    If Klaw = Klaw_no Then
       Klaw = 0
    End If
    
    
    
    'wyswietlanie
    
    If Temp = 1 Then
       'Locate 1 , 1
       Lcd X ; ":"
       Godziny = X
       Lowerline
       Lcd "Godzina"
    End If
    
    If Temp = 2 Then
       'Locate 1 , 4
       Lcd Godziny ; ":" ; X
       Minuty = X
       Lowerline
       Lcd "Minuta"
    End If
    
    If Temp = 3 Then
       'Locate 1 , 7
       Lcd Godziny ; ":" ; Minuty ; ":" ; X
       Sekundy = X
       Lowerline
       Lcd "Sekunda"
    End If
    
    If Temp = 4 Then
       'Locate 1 , 1
       Lcd Godziny ; ":" ; Minuty ; ":" ; Sekundy
       Locate 1 , 14
       Lcd X
       Dni_tygodnia = X
       Lowerline
       Lcd "Dzien tygodnia"
    End If
    
    If Temp = 5 Then
       Lcd "Dzien miesiaca"
       Lowerline
       'Locate 2 , 1
       Lcd X ; "/"
       Daty = X
    End If
    
    If Temp = 6 Then
       Lcd "Miesiac"
       Lowerline
       Lcd Daty ; "/" ; X
       'Locate 2 , 4
       'Lcd X
       Miesiace = X
    End If
    
    If Temp = 7 Then
       Lcd "Rok"
       Lowerline
       'Locate 2 , 6
       Lcd Daty ; "/" ; Miesiace ; "/20" ; X
       Lata = X
    End If
    
    'wyswietlanie end
    
    Waitms 300
    Cls
    
    
    Loop
    
    
    
    
    
    Cls
    Lcd "powrot do glow"
    Wait 1
    
    Return
    
    
    
    
    
    
    
    Zapis:
    
    Sekundy = Makebcd(sekundy)
    Minuty = Makebcd(minuty)
    Godziny = Makebcd(godziny)
    Dni_tygodnia = Makebcd(dni_tygodnia)
    Daty = Makebcd(daty)
    Miesiace = Makebcd(miesiace)
    Lata = Makebcd(lata)
    
    I2cstart
    I2cwbyte 208
    I2cwbyte 0
    I2cwbyte Sekundy
    I2cwbyte Minuty
    I2cwbyte Godziny
    I2cwbyte Dni_tygodnia
    I2cwbyte Daty
    I2cwbyte Miesiace
    I2cwbyte Lata
    I2cstop
    
    I2cstart
    I2cwbyte 208
    I2cwbyte 8
    I2cwbyte Minuty_alarm
    I2cwbyte Godziny_alarm
    I2cstop
    
    Return
    
    
    
    
    
    
    Czytanie:
    
    'czytanie godziny
    I2cstart
    I2cwbyte 208                                                'zapis
    I2cwbyte 0
    I2cstop
    I2cstart
    I2cwbyte 209                                                'odczyt
    I2crbyte Sekundy , Ack
    I2crbyte Minuty , Ack
    I2crbyte Godziny , Ack
    I2crbyte Dni_tygodnia , Ack
    I2crbyte Daty , Ack
    I2crbyte Miesiace , Ack
    I2crbyte Lata , Nack
    I2cstop
    
    I2cstart
    I2cwbyte 208
    I2cwbyte 15
    I2cstop
    
    
    'przeliczanie na dziesietne
    Sekundy = Makedec(sekundy)
    Minuty = Makedec(minuty)
    Godziny = Makedec(godziny)
    Dni_tygodnia = Makedec(dni_tygodnia)
    Daty = Makedec(daty)
    Miesiace = Makedec(miesiace)
    Lata = Makedec(lata)
    
    Return
    
    
    
  • #10 8364958
    dasioo
    Poziom 14  
    jak zrobić aby zegar wyświetlał 09:05:06 zamiast 9:5:6 ??
  • #11 8365061
    McMonster
    Poziom 32  
    Banalnie prostym algorytmem. Sprawdzasz, czy liczba jest mniejsza od 10, jeśli tak, to zamieniasz na string i doklejasz zero na jego początku, w przeciwnym wypadku po prostu zamieniasz.
  • REKLAMA
  • #12 8365195
    dasioo
    Poziom 14  
    a prościej się nie da? stringi mi zżerają przestrzeń
  • #13 8365269
    McMonster
    Poziom 32  
    Nie wiem, jak dokładnie działa ten program, nie przepadam za Bascomem, podałem przykładowy sposób. Ściślej, musisz sprawdzić, czy liczba jest mniejsza od 10 i w zależności od tego wyświetlić lub nie wyświetlić zera, a potem wyświetlić liczbę. Jak to rozwiązać w sposób, który będzie efektywny w tym zastosowaniu, to już zostawiam tobie.
  • #14 8375285
    dasioo
    Poziom 14  
    można to zrobić wprost przy wyświetlaniu np:

    if x<10 then
    locate 1,1
    lcd "0";godz
REKLAMA