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:
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