'************* Konfiguracja uC ***************** '*********************************************** $regfile = "m16def.dat" $crystal = 16000000 Config Porta = &B11111111 : Porta = &B00000000 Config Portb = &B11111000 : Portb = &B11111111 Config Portc = &B11111111 : Portc = &B00000111 Config Portd = &B11111111 : Portd = &B11111111 Config Scl = Portd.6 Config Sda = Portd.5 I2cinit Config Timer0 = Timer , Prescale = 256 Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts Sw_port Alias Pinb Buzzer Alias Portc.3 L1 Alias Portb.3 L2 Alias Portb.4 L3 Alias Portb.5 L4 Alias Portb.6 '********** Konfiguracja uC Koniec ************ '****************** Zmienne ******************* '*********************************************** Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte Dim Godziny_budz As Byte , Minuty_budz As Byte Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte Dim Poz_ust As Byte , Poz_wysw As Byte Dim Zapisz_czas As Bit Dim Alarm_en As Bit , Al_buz As Bit , Beep_buz As Bit , Beep As Byte Dim Wysw(2) As Word Dim Mux As Bit Dim Helpbyte(1) As Byte Dim Mig As Bit , Godz24 As Bit Dim Dzielnik(1) As Byte Dim Flaga_4ms As Bit , Flaga_500ms As Bit '************* Zmienne Koniec **************** '************ Warunki Poczatkowe *************** '*********************************************** Poz_wysw = 1 '******* Warunki Poczatkowe Koniec *********** '************** Petla glowna ****************** '*********************************************** Do If Flaga_4ms = 1 Then Flaga_4ms = 0 Gosub Przyciski Gosub Wyswietlanie If Beep <> 0 Then Beep_buz = 1 Decr Beep Else Beep_buz = 0 End If If Al_buz = 1 Or Beep_buz = 1 Then Buzzer = 1 Else Buzzer = 0 End If If Flaga_500ms = 1 Then Flaga_500ms = 0 Toggle Mig If Poz_wysw <> 1 Or Poz_ust = 0 Then If Zapisz_czas = 1 Then Gosub Zapis_rtc 'jednorazowo zapisuje po wyjściu z ustawień Zapisz_czas = 0 Else Gosub Odczyt_rtc 'odczytuje czas End If Else Zapisz_czas = 1 End If Select Case Poz_wysw Case 1: Wysw(1) = Godziny Wysw(2) = Minuty Case 2: Wysw(1) = Godziny_budz Wysw(2) = Minuty_budz End Select Gosub Przelicz Gosub Alarm End If Loop End '************ Petla glowna Koniec ************** '************ Przerwanie timer 0 *************** '*********************************************** Prztimer0: Timer0 = 5 Set Flaga_4ms Incr Dzielnik(1) If Dzielnik(1) = 125 Then Dzielnik(1) = 0 Set Flaga_500ms End If Return '******** Przerwanie timer 0 Koniec ************ '****************** Zapis RTC ******************** Zapis_rtc: 'zapisuje czas g,m i s do układu RTC Godziny_bcd = Makebcd(godziny) Minuty_bcd = Makebcd(minuty) Sekundy_bcd = Makebcd(sekundy) I2cstart I2cwbyte 162 I2cwbyte 0 'rejestr kontrolny I2cwbyte 8 'ustawienie rejestru zapisu daty I2cstop I2cstart I2cwbyte 162 I2cwbyte 2 I2cwbyte Sekundy_bcd I2cwbyte Minuty_bcd I2cwbyte Godziny_bcd I2cstop Return '************* Zapis RTC Koniec ***************** '****************** Odczyt RTC ******************** Odczyt_rtc: 'odczytuje czas z RTC do zmiennych I2cstart I2cwbyte 162 'adres zapisu I2cwbyte 2 'rejestr sekund I2cstart I2cwbyte 163 'adres odczytu I2crbyte Sekundy_bcd , Ack I2crbyte Minuty_bcd , Ack I2crbyte Godziny_bcd , Nack I2cstop Sekundy = Makedec(sekundy_bcd) Minuty = Makedec(minuty_bcd) Godziny = Makedec(godziny_bcd) Return '************** Odczyt RTC Koniec ***************** '************** Przelicz ***************** Przelicz: If Wysw(1) > 12 Then Godz24 = 1 Else Godz24 = 0 Wysw(1) = Wysw(1) Mod 12 Select Case Wysw(1) Case 0 : Wysw(1) = &B0000000100000000 Case 1 : Wysw(1) = &B0000000000000001 Case 2 : Wysw(1) = &B0000000000000010 Case 3 : Wysw(1) = &B0000010000000000 Case 4 : Wysw(1) = &B0000000000100000 Case 5 : Wysw(1) = &B0000000000000100 Case 6 : Wysw(1) = &B0000000001000000 Case 7 : Wysw(1) = &B0000000000001000 Case 8 : Wysw(1) = &B0000000010000000 Case 9 : Wysw(1) = &B0000001000000000 Case 10 : Wysw(1) = &B0000000000010000 Case 11 : Wysw(1) = &B0000100000000000 'Case 12 : Wysw(1) = &B0000000100000000 End Select Helpbyte(1) = Wysw(2) Mod 5 Wysw(2) = Wysw(2) / 5 Select Case Wysw(2) Case 0 : Wysw(2) = &B0000000000000000 '0....4 Case 1 : Wysw(2) = &B0000000000001000 '5...9 Case 2 : Wysw(2) = &B0000010000000000 '10...14 Case 3 : Wysw(2) = &B0000000000000001 '15...19 Case 4 : Wysw(2) = &B0000100000000000 '20...24 Case 5 : Wysw(2) = &B0000100000001000 '25...30 Case 6 : Wysw(2) = &B0000000001000000 '31...34 Case 7 : Wysw(2) = &B0000000001001000 '35...39 Case 8 : Wysw(2) = &B0000000010000000 '40...44 Case 9 : Wysw(2) = &B0000000010001000 '45...49 Case 10 : Wysw(2) = &B0000000000100000 '50...54 Case 11 : Wysw(2) = &B0000000000101000 '55...59 End Select Select Case Helpbyte(1) Case 0 : L1 = 1 : L2 = 1 : L3 = 1 : L4 = 1 Case 1 : L1 = 0 : L2 = 1 : L3 = 1 : L4 = 1 Case 2 : L1 = 0 : L2 = 0 : L3 = 1 : L4 = 1 Case 3 : L1 = 0 : L2 = 0 : L3 = 0 : L4 = 1 Case 4 : L1 = 0 : L2 = 0 : L3 = 0 : L4 = 0 End Select If Poz_ust <> 0 Then If Poz_ust = 1 Then If Mig = 1 Then Wysw(1) = 0 : L1 = 1 : L2 = 1 : L3 = 1 : L4 = 1 Else If Godz24 = 1 Then L1 = 1 : L2 = 1 : L3 = 1 : L4 = 0 Else L1 = 1 : L2 = 1 : L3 = 0 : L4 = 1 End If End If End If If Poz_ust = 2 Then If Mig = 1 Then Wysw(2) = 0 : L1 = 1 : L2 = 1 : L3 = 1 : L4 = 1 End If End If Wysw(2).4 = 1 If Poz_wysw = 1 Then Wysw(2).1 = 1 If Poz_wysw = 2 Then Wysw(2).2 = 1 Else If Poz_wysw = 2 Then Wysw(2).2 = 1 End If Return '************** Wyswietlanie ***************** Wyswietlanie: Toggle Mux If Mux = 1 Then Set Portc.2 Porta = Wysw(1) Portc.4 = Wysw(1).8 Portc.5 = Wysw(1).9 Portc.6 = Wysw(1).10 Portc.7 = Wysw(1).11 Reset Portc.1 Else Set Portc.1 Porta = Wysw(2) Portc.6 = Wysw(2).10 Portc.7 = Wysw(2).11 Reset Portc.2 End If Return '************** Alarm ***************** Alarm: If Alarm_en = 1 Then If Godziny = Godziny_budz And Minuty = Minuty_budz Then Toggle Al_buz Else Al_buz = 0 Else Al_buz = 0 End If Return '************** Przyciski ***************** Przyciski: Sw = Sw_port And &B00000111 If Sw <> &B00000111 And Stan_sw = Sw Then Incr Licznik_sw If Licznik_sw = 158 Then Licznik_sw = 0 Select Case Stan_sw Case &B00000110: 'incr '*********************************************************** Select Case Poz_wysw Case 1: Select Case Poz_ust Case 0: Poz_ust = 1 Case 1: Incr Godziny If Godziny = 24 Then Godziny = 0 Sekundy = 0 Case 2: Incr Minuty If Minuty = 60 Then Minuty = 0 Sekundy = 0 End Select Case 2: 'dotyczy budzika Select Case Poz_ust Case 0: Poz_ust = 1 Case 1: Incr Godziny_budz If Godziny_budz = 24 Then Godziny_budz = 0 Case 2: Incr Minuty_budz If Minuty_budz = 60 Then Minuty_budz = 0 End Select End Select Case &B00000011: 'decr '*********************************************************** Select Case Poz_wysw Case 1: Select Case Poz_ust Case 0: Toggle Alarm_en If Alarm_en = 1 Then Beep = 125 Else Beep = 20 Case 1: Decr Godziny If Godziny = 255 Then Godziny = 23 Sekundy = 0 Case 2: Decr Minuty If Minuty = 255 Then Minuty = 59 Sekundy = 0 End Select Case 2: 'dotyczy budzika Select Case Poz_ust Case 0: Toggle Alarm_en If Alarm_en = 1 Then Beep = 125 Else Beep = 20 Case 1: Decr Godziny_budz If Godziny_budz = 255 Then Godziny_budz = 23 Case 2: Decr Minuty_budz If Minuty_budz = 255 Then Minuty_budz = 59 End Select End Select Case &B00000101: 'next menu '*********************************************************** If Poz_ust > 0 Then 'jeśli ustawinia Incr Poz_ust If Poz_ust >= 3 Then Poz_ust = 0 Else 'jesli wyswietlanie Incr Poz_wysw If Poz_wysw = 3 Then Poz_wysw = 1 End If End Select End If Else Stan_sw = Sw Licznik_sw = 145 End If Return '***********************************************