'************* Konfiguracja uC ***************** '*********************************************** $regfile = "m8def.dat" $crystal = 8000000 'oscylator RC wewnetrzny Config Portb = &B11111111 : Portb = &B00000001 Config Portc = &B00000000 : Portc = &B11111111 Config Portd = &B11111111 : Portd = &B00000000 Config Scl = Portc.5 Config Sda = Portc.4 I2cinit Config Timer0 = Timer , Prescale = 64 Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts '********** Konfiguracja uC Koniec ************ '****************** Zmienne ******************* '*********************************************** Dim Flaga4ms As Bit , Flaga05s As Bit Dim Co4ms As Byte , Co05s As Byte Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte Dim Godziny_budz As Byte , Minuty_budz As Byte Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte Dim Mux As Byte Dim Stan_katod As Byte Dim Wartosc_wysw(2) As Byte Dim Neonowka As Bit Dim Licznik_sw As Byte , Stan_portu As Byte , Sw_port As Byte Dim Poz_menu As Byte Dim Zezwolenie_budz As Bit Dim Autopowrot_ust(2) As Byte Dim Temp As Byte Dim Sygnal_budzenia As Byte '************* Zmienne Koniec **************** '************ Warunki Poczatkowe *************** '*********************************************** Poz_menu = 0 Flaga05s = 1 Readeeprom Temp , 2 'wczytaj zapiane zezwolenie budzenia If Temp = 100 Then Zezwolenie_budz = 1 Else Zezwolenie_budz = 0 Readeeprom Godziny_budz , 3 Readeeprom Minuty_budz , 4 If Godziny_budz > 23 Then Godziny_budz = 8 If Minuty_budz > 59 Then Minuty_budz = 0 '******* Warunki Poczatkowe Koniec *********** '************** Petla glowna ****************** '*********************************************** Do If Flaga4ms = 1 Then Flaga4ms = 0 Gosub Wyswietl Gosub Przyciski End If If Flaga05s = 1 Then Flaga05s = 0 Neonowka = Not Neonowka Select Case Poz_menu Case 0: ' odczyt czasu z rtc 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) Case 1: 'po 4s automatycznie zapisz czas w RTC i wroc do wysw czasu Incr Autopowrot_ust(1) If Autopowrot_ust(1) = 8 Then Gosub Zapis_rtc Poz_menu = 0 End If Case 2: 'po 4s automatycznie zapisz czas budzenia w eeprom i wroc do wysw czasu Incr Autopowrot_ust(2) If Autopowrot_ust(2) = 8 Then Writeeeprom Godziny_budz , 3 Writeeeprom Minuty_budz , 4 Poz_menu = 0 End If End Select If Sygnal_budzenia > 0 Then Portb.0 = 0 Decr Sygnal_budzenia If Sygnal_budzenia = 0 Then Portb.0 = 1 End If Gosub Budzenie End If Loop End '************ Petla glowna Koniec ************** '************ Przerwanie timer 0 *************** '*********************************************** Prztimer0: 'Incr Co4ms 'If Co4ms >= 2 Then 'Co4ms = 0 Set Flaga4ms 'dziala co 2 ms mimo nazwy Incr Co05s If Co05s >= 250 Then Co05s = 0 Set Flaga05s End If 'End If Return '******** Przerwanie timer 0 Koniec ************ '*********************************************** Wyswietl: Incr Mux If Mux = 8 Then Mux = 0 Select Case Poz_menu Case 0: 'pokazuj czas Portb.1 = Neonowka Wartosc_wysw(1) = Godziny 'wysw 1 i 2 Wartosc_wysw(2) = Minuty 'wysw 3 i 4 Case 1: 'ustawiaj czas Portb.1 = 1 Wartosc_wysw(1) = Godziny 'wysw 1 i 2 Wartosc_wysw(2) = Minuty 'wysw 3 i 4 Case 2: 'ustaw budzik Portb.1 = 0 Wartosc_wysw(1) = Godziny_budz 'wysw 1 i 2 Wartosc_wysw(2) = Minuty_budz 'wysw 3 i 4 End Select Select Case Mux Case 0: Stan_katod = Wartosc_wysw(1) / 10 If Stan_katod = 0 Then Stan_katod = 10 'wygaszenie zara na pierwszym miejscu Gosub Ustaw_katody Set Portb.5 Case 1: Reset Portb.5 Case 2: Stan_katod = Wartosc_wysw(1) Mod 10 Gosub Ustaw_katody Set Portb.4 Case 3: Reset Portb.4 Case 4: Stan_katod = Wartosc_wysw(2) / 10 Gosub Ustaw_katody Set Portb.3 Case 5: Reset Portb.3 Case 6: Stan_katod = Wartosc_wysw(2) Mod 10 Gosub Ustaw_katody Set Portb.2 Case 7: Reset Portb.2 End Select Return '*********************************************** Ustaw_katody: Select Case Stan_katod Case 0 : Portb.6 = 0 : Portb.7 = 0 : Portd = 128 Case 1: Portb.6 = 0 : Portb.7 = 0 : Portd = 64 Case 2: Portb.6 = 0 : Portb.7 = 0 : Portd = 32 Case 3: Portb.6 = 0 : Portb.7 = 1 : Portd = 0 Case 4: Portb.6 = 1 : Portb.7 = 0 : Portd = 0 Case 5: Portb.6 = 0 : Portb.7 = 0 : Portd = 16 Case 6: Portb.6 = 0 : Portb.7 = 0 : Portd = 8 Case 7: Portb.6 = 0 : Portb.7 = 0 : Portd = 4 Case 8: Portb.6 = 0 : Portb.7 = 0 : Portd = 2 Case 9: Portb.6 = 0 : Portb.7 = 0 : Portd = 1 Case 10: Portb.6 = 0 : Portb.7 = 0 : Portd = 0 End Select Return '*********************************************** Przyciski: Sw_port = Pinc Sw_port = Sw_port Or &B11110000 If Sw_port <> 255 And Stan_portu = Sw_port Then Incr Licznik_sw If Licznik_sw = 80 Then Licznik_sw = 0 Select Case Stan_portu Case 247: '-godziny Select Case Poz_menu Case 0: 'wylacz budzik Zezwolenie_budz = 0 Temp = 0 Writeeeprom Temp , 2 Sygnal_budzenia = 2 'sygnal na 0,5s Case 1: Decr Godziny If Godziny = 255 Then Godziny = 23 Case 2: Decr Godziny_budz If Godziny_budz = 255 Then Godziny_budz = 23 End Select Case 251: '+godziny Select Case Poz_menu Case 0: 'wchodzi do ustawien czasu Poz_menu = 1 Case 1: Incr Godziny If Godziny = 24 Then Godziny = 0 Case 2: Incr Godziny_budz If Godziny_budz = 24 Then Godziny_budz = 0 End Select Case 253: '-minuty Select Case Poz_menu Case 0: 'wlacz budzik Zezwolenie_budz = 1 Temp = 100 Writeeeprom Temp , 2 Sygnal_budzenia = 3 'sygnal na 1s Case 1: Decr Minuty If Minuty = 255 Then Minuty = 59 Case 2: Decr Minuty_budz If Minuty_budz = 255 Then Minuty_budz = 59 End Select Case 254: '+minuty Select Case Poz_menu Case 0: 'wchodzi do ustawien budzika Poz_menu = 2 Case 1: Incr Minuty If Minuty = 60 Then Minuty = 0 Case 2: Incr Minuty_budz If Minuty_budz = 60 Then Minuty_budz = 0 End Select 'Case 252: End Select Autopowrot_ust(1) = 0 Autopowrot_ust(2) = 0 End If Else Stan_portu = Sw_port Licznik_sw = 60 End If Return '*********************************************** Zapis_rtc: Godziny_bcd = Makebcd(godziny) Minuty_bcd = Makebcd(minuty) Sekundy_bcd = 0 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 '*********************************************** Budzenie: If Zezwolenie_budz = 1 Then If Godziny = Godziny_budz And Minuty = Minuty_budz Then Portb.0 = Neonowka Else If Sygnal_budzenia = 0 Then Portb.0 = 1 End If End If Return '***********************************************