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

[Atmega8][Bascom] Problem z przyciskami

11 Lip 2008 09:10 1766 1
  • Poziom 31  
    Witam. Skleciłem taki o to "fragment" kodu do obsługi zegarka RTC. Wszystko działa [prawie] bardzo dobrze oprócz kilku mało istotnych rzeczy z którymi se poradzę.

    Moim głównym problem są przyciski. Narazie mam ich 5 podpiętych z czego każdy odpowiada nastawianiu w górę jednej wartości w zegarze co jest troszkę męczące. Chciałbym to zmniejszyć do 3 przycisków, tak aby np.

    S1 służył do wchodzenia do menu / wybierania funkcji z menu;

    S2 służył do poruszania się po menu w górę / zwiększania wartości np. godziny, minuty o 1;

    S3 służył do poruszania się po menu w dół / zmniejszania wartości np. godziny, minuty o 1.

    Zegarek docelowo będzie używany przez dziewczynę, więc musi być przejrzysty.


    Oto kod który napisałem:

    Code:
    'Program do obsługi zegara czasu rzeczywistego RTC PCF8583 Philips za pomoca magistrali I2C
    

    $regfile = "m8def.dat"                                      'Atmega8
    $crystal = 8000000                                          'Kwarc 8MHz

    Config Lcd = 20 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

    '************************************* I2C **************************************************************

    Config Sda = Portc.1
    Config Scl = Portc.0

    '************************************** 1 wire **********************************************************

    Config 1wire = Portc.5                                      'Złącze do obsługi DS18b20

    '************************************* Przyciski ********************************************************

    Config Pind.0 = Input                                       'Ustawianie godzin
    Config Pind.1 = Input                                       'Ustawianie minut
    Config Pind.6 = Input                                       'Ustawianie dni
    Config Pind.2 = Input                                       'Ustawianie miesiąca
    Config Pind.5 = Input                                       'Zatwierdzanie w/w ustawień

    Declare Sub Wyslij_do_rtc
    Declare Sub Ustaw_czas
    Declare Sub Pokaz_czas

    Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3               'Znak stopnia Celsjusza
    Deflcdchar 1 , 32 , 4 , 14 , 21 , 4 , 4 , 4 , 32            ' strzałka góra
    Deflcdchar 2 , 32 , 4 , 4 , 4 , 21 , 14 , 4 , 32            ' strzałka dół

    Dim Poprzedni_miesiac As Byte                               'dodatkowa zmienna
    Dim S As Byte                                               'deklaracja sekund
    Dim M As Byte                                               'deklaracja minut
    Dim H As Byte                                               'deklaracja godzin
    Dim Day As Byte                                             'deklaracja dni
    Dim Month As Byte                                           'deklaracja miesiecy

    Dim Miesiac As String * 11                                  '"pomocniczy miesiac"
    Dim Rok As Word
    Dim A As Byte                                               'Zmienna od przesuwania ekranu startowego
    Dim W As Byte                                               'Zmienna informująca o ilości czujników DS18b20

    Dim Dsid1(8) As Byte                                        'deklaracja obsługi czujników DS18b20
    Dim Dsid2(8) As Byte
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer ,
    Dim I11 As Integer                                          ' przechowuje poprzednią wartoś temp
    Dim I22 As Integer                                          ' przechowuje poprzednią wartoś temp

    Set Portd.0
    Set Portd.1
    Set Portd.6
    Set Portd.2
    Set Portd.5

    S = 0
    M = 0                                                       'wartosci poczatkowe zegara i daty
    H = 0
    Day = 1
    Month = 1
    Rok = 8

    Cls
    Cursor Off                                                  'Wyłączam kursor

    '*************************************** 1 wire ********************************************************

    W = 1wirecount()
    Lcd "Ilosc czujnikow:" ; W                                  'Informuje ile czujników jest podpiętych do układu (pojawia się tylko podczas włączania urządzenia)
    Wait 3

    Cls

    Dsid1(1) = 1wsearchfirst()                                  'Znajdź pierwszy czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź następny czujnik podpięty do portu



    '**************************************** Pokazywanie czasu **********************************************
    Do
    Call Pokaz_czas                                             'w pierwszej kolejności zostaje

    If Pind.0 = 0 Then
       Wait 2
          If Pind.0 = 0 Then
          Cls
          Gosub Ustaw_czas
       End If
       Cls
    End If

    Loop


    '************************************** I2C Pokazywanie czasu ******************************************************

    Sub Pokaz_czas

    I2cstart
       I2cwbyte 160
       I2cwbyte 0
       I2cwbyte 8                                               ' włącza maskowanie roku i dnia tygodnia
       I2cstop
       I2cstart
       I2cwbyte 160
       I2cwbyte 2
       I2cstart
       I2cwbyte 161
       I2crbyte S , Ack
       I2crbyte M , Ack
       I2crbyte H , Ack
       I2crbyte Day , Ack
       I2crbyte Month , Nack
       I2cstop                                                  'koniec transmisji

    S = Makedec(s)
    M = Makedec(m)
    H = Makedec(h)
    Day = Makedec(day)
    Month = Makedec(month)

    '************** obsluga roku************************
    If Poprzedni_miesiac <> Month Then                          'sprawdzamy czy zmienil sie miesiac
       If Month = 1 Then                                        'jesli miesiac zmienil sie na styczen , to zwiekszamy rok
          Incr Rok
       End If
       Poprzedni_miesiac = Month
    End If

    '***************************************

    Miesiac = Lookupstr(month , Miesiace)                       'wybieram miesiac spośród danych



    '************************************** 1 wire ***************************************************************
      Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)
       '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)
       1wwrite &HBE
       I2 = 1wread(2)
       '---------------------------------
       1wreset
       1wwrite &HCC
       1wwrite &H44

     Waitms 751                                                 ' czekaj na konwersję temperatury (normalnie powinno być 750,
                                                                 'ale jest ustawione na 751, aby nie kolidowało z odświeżaniem sekund)

       I1 = I1 * 10
       I1 = I1 / 16
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")                                 ' Format wyświetlania temperatury


       I2 = I2 * 10
       I2 = I2 / 16
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")




    '*********************** Wyswietlam dane na lcd po zatwierdzeniu ustawień**************************

    'Format wyświetlania:
     Locate 1 , 1
     If H < 10 Then
       Lcd "0" ; H ; ":"                                        'godziny
       Else
       Lcd H ; ":"
     End If

     Locate 1 , 4
       If M < 10 Then
       Lcd "0" ; M ; ":"                                        'minuty
       Else
       Lcd M ; ":"
     End If

     Locate 1 , 7
       If S < 10 Then
          Lcd "0" ; S ;                                         'sekundy
          Else
          Lcd ; S ;
     End If

     Locate 2 , 1
       If Day < 10 Then                                         'dni
          Lcd "0" ; Day ; "/"
          Else
          Lcd Day ; "/"
     End If

     Locate 2 , 4                                               'miesiąc
          Lcd Miesiac ; "/"

     Locate 2 , 8
     If Rok < 10 Then                                           'rok
          Lcd "0" ; Rok
          Else
          Lcd Rok
     End If

       If I1 >= I11 Then                                        'format wyświetlania 1 czujnika ds18b20
       I11 = I1
       If I1 > 0 Then
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 11
       Lcd Ss ; Chr(0) ; Chr(1) ;
       Else
       Ss = Str(i1)
       Ss = Format(ss , "0.0")
       Locate 1 , 1
       Lcd Ss ; Chr(0) ; Chr(1) ; ""
       End If
       Else
       I11 = I1
       If I1 > 0 Then
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 11
       Lcd Ss ; Chr(0) ; Chr(2) ;
       Else
       Ss = Str(i1)
       Ss = Format(ss , "0.0")
       Locate 1 , 11
       Lcd Ss ; Chr(0) ; Chr(2) ;
       End If
       End If

       If I2 >= I22 Then                                        'format wyświetlania 2 czujnika ds18b20
       I22 = I2
       If I2 > 0 Then
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 2 , 11
       Lcd Ss ; Chr(0) ; Chr(1) ;
       Else
       Ss = Str(i2)
       Ss = Format(ss , "0.0")
       Locate 2 , 11
       Lcd Ss ; Chr(0) ; Chr(1) ;
       End If
       Else
       I22 = I2
       If I1 > 0 Then
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 2 , 11
       Lcd Ss ; Chr(0) ; Chr(2) ;
       Else
       Ss = Str(i2)
       Ss = Format(ss , "0.0")
       Locate 2 , 11
       Lcd Ss ; Chr(0) ; Chr(2) ;
       End If
       End If


    End Sub



    '************************************ I2C Ustawianie czasu ***********************************************
    Sub Ustaw_czas
    Do

    If Pind.0 = 0 Then
    Waitms 100                                                  'zwieksz godzine
    Incr H
    End If

    If Pind.1 = 0 Then
    Waitms 100                                                  'zwieksz minute
    Incr M
    End If

    If Pind.6 = 0 Then
    Waitms 100                                                  'zwieksz dzien
    Incr Day
    End If

    If Pind.2 = 0 Then
    Waitms 100                                                  'zwieksz miesiac
    Incr Month
    End If

    If Pind.5 = 0 Then                                          'zatwierdź wprowadzone dane
    Waitms 100
    Call Wyslij_do_rtc

    For A = 1 To 15
    Shiftlcd Left
    Waitms 200
    Next A

    Cls

    Exit Sub
    End If

    If M = 60 Then
    M = 0
    End If

    If H = 24 Then
    H = 0
    End If

    If Day = 32 Then
    Day = 1
    End If

    If Month = 13 Then
    Rok = Rok + 1
    Month = 1
    End If


    Miesiac = Lookupstr(month , Miesiace)                       'wybieram miesiac spośród danych



    '*********************** Format wyświetlania czasu w ustawieniach**********************************************
    Locate 1 , 3
    Lcd "Ustaw czas"

    Locate 2 , 1
     If H < 10 Then
       Lcd "0" ; H ; ":"                                        'godziny
       Else
       Lcd H ; ":"
     End If
     Locate 2 , 4
       If M < 10 Then
       Lcd "0" ; M                                              'minuty
       Else
       Lcd M
     End If

    Locate 2 , 7
       If Day < 10 Then                                         'dni
          Lcd "0" ; Day ; "/"
          Else
          Lcd Day ; "/"
     End If

     Locate 2 , 10                                              'miesiące
          Lcd Miesiac ; "/"

     Locate 2 , 14
     If Rok < 10 Then                                           'rok
          Lcd "0" ; Rok
          Else
          Lcd Rok
     End If

    Loop

    End Sub

    '********************************************************************************************************
    Sub Wyslij_do_rtc                                           'Podprogram do zapisywania danych w pcf-ie

    S = Makebcd(s)
    M = Makebcd(m)
    H = Makebcd(h)
    Day = Makebcd(day)
    Month = Makebcd(month)
    Rok = Makebcd(rok)

    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cwbyte S
    I2cwbyte M
    I2cwbyte H
    I2cwbyte Day
    I2cwbyte Month
    I2cwbyte Rok

    I2cstop

    End Sub



    '**************************************************************************************************
    Miesiace:

    Data " " , "Sty" , "Lut" , "Mar" , "Kwi" , "Maj" , "Cze"
    Data "Lip" , "Sie" , "Wrz" , "Paz" , "Lis" , "Gru"

    '****************************************************************************************************
    Loop
       
  • Pomocny post
    Poziom 22  
    Witam,

    tu w LINKU

    znajdziesz mój program w którym jest menu 3 przyciskowe.


    Pozdrawiam.


    ps
    Cytat:
    Zegarek docelowo będzie używany przez dziewczynę, więc musi być przejrzysty.
    - to już szowinizm...