$regfile = "m328def.dat" $crystal = 8000000 $framesize = 32 $swstack = 32 $hwstack = 48 Config Base = 0 'damit Arrays bei 0 beginnen Dim Key As Byte Dim Btmp1 , Btmp2 As Byte Dim Zaehler As Byte Dim Ausgang As Byte Dim _sec As Byte Dim _min As Byte Dim _min_old As Byte Dim _hour As Byte Dim _day As Byte Dim _month As Byte Dim _year As Byte Dim Domm As Byte Dim Dom(13) As Byte 'Anzahl Tage im Monat Dom(1) = 31 Dom(2) = 28 Dom(3) = 31 Dom(4) = 30 Dom(5) = 31 Dom(6) = 30 Dom(7) = 31 Dom(8) = 31 Dom(9) = 30 Dom(10) = 31 Dom(11) = 30 Dom(12) = 31 Dim Dummy As Eram Byte Dim Jahr As Eram Byte Dim Jahrhundert As Eram Byte Dim Wasser_eram As Eram Word ' ccm seit letztem Wechsel; max. 65 Liter Dim Wasser As Word Wasser = Wasser_eram Dim Wasserplus As Word Dim Wechsel_eram As Eram Byte 'Anzahl Tage seit letztem Wechsel Dim Wechsel As Byte Wechsel = Wechsel_eram Dim Menue1(6) As String * 16 Dim Menue1max As Byte Dim Menue1index As Byte Menue1(1) = "Wasser nachf. " Menue1(2) = "neuer Filter " Menue1(3) = "Uhrzeit stellen" Menue1(4) = "Datum stellen " Menue1(5) = "zurueck " Menue1max = 5 Dim Tsoll(5) As Byte Dim Dsoll(8) As Byte Dim Tindex As Byte Dim Dindex As Byte Dim Tmax(5) As Byte Dim Tmin(5) As Byte Dim Dmax(8) As Byte Dim Dmin(8) As Byte Dim Wtag(8) As String * 2 Tmax(1) = 2 'Stunden Zehner maximal 29:59 Tmax(2) = 9 'Stunden Einer Tmax(3) = 5 'Minuten Zehner Tmax(4) = 9 'Minuten Einer Tmin(1) = 0 'Stunden Zehner minimal 00:00 Tmin(2) = 0 'Stunden Einer Tmin(3) = 0 'Minuten Zehner Tmin(4) = 0 'Minuten Einer Dmax(1) = 3 'Tag Zehner maximal 39.19.2999 Dmax(2) = 9 'Tag Einer Dmax(3) = 1 'Monat Zehner Dmax(4) = 9 'Monat Einer 'Dmax(5) = 2 'Jahr Tausend 'Dmax(6) = 9 'Jahr Hundert Dmax(5) = 9 'Jahr Zener Dmax(6) = 9 'Jahr Einer Dmax(7) = 6 ' Sonntag Dmin(1) = 0 'Tag Zehner minimal 01.01.2000 Dmin(2) = 1 'Tag Einer Dmin(3) = 0 'Monat Zehner Dmin(4) = 1 'Monat Einer 'Dmin(5) = 2 'Jahr Tausend 'Dmin(6) = 0 'Jahr Hundert Dmin(5) = 0 'Jahr Zener Dmin(6) = 0 'Jahr Einer Dmin(7) = 0 'Montag Wtag(0) = "Mo" Wtag(1) = "Di" Wtag(2) = "Mi" Wtag(3) = "Do" Wtag(4) = "Fr" Wtag(5) = "Sa" Wtag(6) = "So" Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5 Config Lcd = 16 * 3 , Chipset = Dogm163v3 , Contrast = &H71 '16*3 type LCD display Initlcd Deflcdchar 1 , 4 , 14 , 21 , 4 , 4 , 4 , 4 , 32 ' replace [x] with number (0-7) Deflcdchar 2 , 4 , 4 , 4 , 4 , 21 , 14 , 4 , 32 ' replace [x] with number (0-7) Cls Dim I As Byte 'Schleifenzähler Dim Sj As Byte '0-4 , Schaltjahr = 0 Dim Wt As Byte '0-6 ; Wochentag ; Montag = 0 , Sonntag = 6 Dim J As Byte Dim Sec_alt As Byte J = 16 Dim Sw_flag As Byte 'Sommer - Winterzeit Portd = &B1111_1100 Battadc Alias Pinc.1 Config Battadc = Input Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1 Dim Adcbattwert As Integer Dim R_1 As Single Dim R_2 As Single Dim R_g As Single Dim Uref As Single Dim Udigit As Single Dim Vh As Single Dim Spannung As Single Start Adc R_1 = 97.6 'Spannungsteiler Widerstand 1(oben) in kOhm R_2 = 21.54 'Spannungsteiler Widerstand 2(unten) in kOhm Uref = 1088 'Referenzspannung im mV 1,1V =1100mV R_g = R_1 + R_2 Vh = R_g / R_2 'Verhältnis ausrechnen Udigit = Uref / 1023 Dim Int0_flag As Byte Dim Tmp1 As Byte Config Portd.2 = Input Portd.2 = 1 Config Int0 = Low Level On Int0 Int0_irq Enable Int0 Config Timer2 = Timer , Prescale = 256 , Async = On ' 2 Sekunden On Timer2 Timer2_ovl Enable Timer2 Enable Interrupts Gosub Mess Gosub Anzeige Do If _min <> _min_old Then 'Anzeige aktualisieren Gosub Mess Gosub Anzeige _min_old = _min End If Config Powermode = Powersave '2 Sekunden schlafen If Int0_flag = 1 Then Disable Int0 'Taste wurde gedrückt Cls Menue1index = 1 Ausgang = 0 Do If Menue1index > 1 Then Locate 1 , 1 Lcd Chr(1) Else Locate 1 , 1 Lcd " " End If Locate 2 , 2 Lcd Menue1(menue1index) If Menue1index < Menue1max Then Locate 3 , 1 Lcd Chr(2) Else Locate 3 , 1 Lcd " " End If Locate 2 , 1 Cursor Noblink Gosub Taste_nokey Gosub Taste_wait Select Case Key Case 1 : If Menue1index = 1 Then Gosub Wasser_f Ausgang = 1 End If If Menue1index = 2 Then Gosub Filter_w Ausgang = 1 End If If Menue1index = 3 Then Gosub Zeit_stellen Ausgang = 1 End If If Menue1index = 4 Then Gosub Datum_stellen Ausgang = 1 End If If Menue1index = 5 Then Ausgang = 1 End If Case 2 : Case 4 : Case 8 : If Menue1index > 1 Then Decr Menue1index End If Case 16 : If Menue1index < Menue1max Then Incr Menue1index End If Case Else : End Select Gosub Taste_nokey Loop Until Ausgang = 1 ' Wait 2 Cls Gosub Mess Gosub Anzeige Int0_flag = 0 Enable Int0 End If Loop End Int0_irq: 'Taste gedrückt Int0_flag = 1 Return Timer2_ovl: 'alle 2 Sekunden Incr _sec ' Incr _sec If _sec > 59 Then _sec = _sec - 60 Incr _min If _min > 59 Then _min = _min - 60 Incr _hour If _hour > 23 Then _hour = _hour - 24 Incr _day Incr Wt If Wt > 6 Then Wt = 0 End If Domm = Dom(_month) If _month = 2 And Sj = 0 Then Incr Domm End If If _day > Domm Then _day = 1 Incr _month If _month > 12 Then _month = 1 Incr _year Jahr = _year End If End If Incr Wechsel Wechsel_eram = Wechsel End If If _day < 25 Then Sw_flag = 0 If _day => 25 And _month = 3 And _hour = 02 And Wt = 6 And Sw_flag = 0 Then _hour = _hour + 1 Sw_flag=1 ' Gosub Settime End If If _day => 25 And _month = 10 And _hour = 03 And wt = 6 And Sw_flag = 0 Then _hour = _hour - 1 Sw_flag = 1 ' Gosub Settime End If End If End If Return Anzeige: Locate 1 , 1 If _day < 10 Then Lcd "0" Lcd _day ; "." If _month < 10 Then Lcd "0" Lcd _month ; "." Lcd _year ; " " ; Wtag(wt) If _hour < 10 Then Lcd "0" Lcd _hour ; ":" If _min < 10 Then Lcd "0" Lcd _min ' ; ":" ' If _sec < 10 Then Lcd "0" ' Lcd _sec Locate 2 , 1 Lcd Wasser ; " ccm " ; Str(wechsel) ; " Tage " Locate 3 , 1 Lcd Adcbattwert ; "adc" Locate 3 , 10 Lcd Fusing(spannung , "#.###") ; "V" Return Mess: Adcbattwert = Getadc(1) Spannung = Adcbattwert * Udigit Spannung = Spannung * Vh Spannung = Spannung / 1000 'In Volt umrechnen Return 'Tasten abfragen Taste_nokey: 'warte, bis keine Taste gedrückt Do Gosub Taste_get Loop Until Key = 0 Return Taste_wait: ' warte, bis Taste gedrückt Do Gosub Taste_get Loop Until Key > 0 Gosub Taste_get Return Taste_get: Zaehler = 0 Btmp2 = 0 While Zaehler < 20 Gosub Taste_check If Btmp1 = Btmp2 Then Incr Zaehler Else Zaehler = 0 Btmp2 = Btmp1 End If Waitms 1 Wend Key = Btmp1 'Btmp2 = 0 Return Taste_check: ' Taste? Btmp1 = Pind Xor 255 Shift Btmp1 , Right , 2 Return Wasser_f: Cls Ausgang = 0 Wasserplus = 1000 Do Locate 2 , 1 Lcd "+" ; Wasserplus ; " " Gosub Taste_nokey Gosub Taste_wait Select Case Key Case 1 : Wasser = Wasser + Wasserplus Wasser_eram = Wasser Ausgang = 1 Case 2 : Case 4 : Case 8 : Wasserplus = Wasserplus + 100 Case 16 : Wasserplus = Wasserplus - 100 Case Else : End Select Gosub Taste_nokey Loop Until Ausgang = 1 Return Filter_w: Wasser = 0 Wechsel = 0 Wechsel_eram = 0 Cls Lcd "Werte auf Null" Wait 2 Return Zeit_stellen: Disable Timer2 Cls Ausgang = 0 Tindex = 4 Tsoll(1) = _hour \ 10 Tsoll(2) = _hour Mod 10 Tsoll(3) = _min \ 10 Tsoll(4) = _min Mod 10 Do Locate 2 , 1 Lcd Tsoll(1) ; Tsoll(2) ; Tsoll(3) ; Tsoll(4) Locate 3 , 1 Lcd " " Locate 3 , Tindex Lcd Chr(1) Locate 3 , Tindex Cursor Noblink Gosub Taste_nokey Gosub Taste_wait Select Case Key Case 1 : _hour = Tsoll(1) * 10 _hour = _hour + Tsoll(2) _min = Tsoll(3) * 10 _min = _min + Tsoll(4) _sec = 0 Ausgang = 1 Timer2 = 0 Enable Timer2 Case 2 : Decr Tindex If Tindex < 1 Then Tindex = 4 End If Case 4 : Incr Tindex If Tindex > 4 Then Tindex = 1 End If Case 8 : Tsoll(tindex) = Tsoll(tindex) + 1 If Tsoll(tindex) > Tmax(tindex) Then Tsoll(tindex) = Tmin(tindex) End If Case 16 : Tsoll(tindex) = Tsoll(tindex) - 1 If Tsoll(tindex) > Tmax(tindex) Then Tsoll(tindex) = Tmax(tindex) End If Case Else : End Select Gosub Taste_nokey Loop Until Ausgang = 1 Return Datum_stellen: Disable Timer2 Cls Ausgang = 0 Dindex = 1 Dsoll(1) = _day \ 10 Dsoll(2) = _day Mod 10 If _month < 10 Then Dsoll(3) = 0 Else Dsoll(3) = 1 End If Dsoll(4) = _month Mod 10 Dsoll(5) = _year \ 10 Dsoll(6) = _year Mod 10 Dsoll(7) = Wt Do Locate 2 , 1 Lcd Dsoll(1) ; Dsoll(2) ; Dsoll(3) ; Dsoll(4) ; Dsoll(5) ; Dsoll(6) ; Wtag(dsoll(7)) Locate 3 , 1 Lcd " " Locate 3 , Dindex Lcd Chr(1) Locate 3 , Dindex Cursor Noblink Gosub Taste_nokey Gosub Taste_wait Select Case Key Case 1 : _day = Dsoll(1) * 10 _day = _day + Dsoll(2) _month = Dsoll(3) * 10 _month = _month + Dsoll(4) _year = Dsoll(5) * 10 _year = _year + Dsoll(6) Wt = Dsoll(7) Enable Timer2 Ausgang = 1 Case 2 : Decr Dindex If Dindex < 1 Then Dindex = 7 End If Case 4 : Incr Dindex If Dindex > 7 Then Dindex = 1 End If Case 8 : Dsoll(dindex) = Dsoll(dindex) + 1 If Dsoll(dindex) > Dmax(dindex) Then Dsoll(dindex) = Dmin(dindex) End If Case 16 : Dsoll(dindex) = Dsoll(dindex) - 1 If Dsoll(dindex) > Dmax(dindex) Then Dsoll(dindex) = Dmax(dindex) End If Case Else : End Select Gosub Taste_nokey Loop Until Ausgang = 1 Return