Witam. Nazwałem to urządzenie przewrotnie ponieważ służy do tego by rozliczać nocnego stróża z obchodów. W różnych miejscach fabryki na których zależy nam by stróż je odwiedzał co godzine rozłożone sa takie urządzenia. Stróż robiąc obchód co godzine powinien nacisnąć przycisk docierając do tego miejsca. Ma na to furtkę czasową plus minus 10min w każda stronę co godzinę. Osiem diod symbolizuje każda godzinę. Jeśli stróż nie naciśnie guzika w określonym czasie (50-70 min) to odpowiadającej tej godzinie diody już nie włączy. Może dopiero następną za 40min bo jest juz 10min po pełnej godzinie kiedy kończy się czas furtki. Minuty liczone sa osobno a Counter w dół jest po to żeby tylko jedną diode można było zapalić w furtce czasowej. $regfile = "2313def.dat" $crystal = 1000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Portb = &B11111111 : Portb = &B11111111 'cały portB jako wyjścia dla LED, LED zgaszone Config Portd = &B00000000 : Portd = &B11111111 'cały portD jako wejscia, podciaganie rezystorami wł Config Timer1 = Timer , Prescale = 64 Enable Timer1 : On Timer1 Clock 'co sekunde skok do podprogramu Clock Const Presettimer1 = 49912 ' wartosc ladowana do Timera1 Dim Seconds As Byte , Minutes As Byte , Hours As Byte Dim Countdown As Byte , B_port As Byte , Help As Byte Waitms 100 'czas na wszelki wypadek If Pind.6 = 0 Then 'jesli przy starcie nacisniety jest przycisk Hours = 0 'zeruj liczniki B_port = 255 Writeeeprom Hours , 2 Writeeeprom B_port , 4 Waitms 100 End If Readeeprom Hours , 2 'przy zaniku zasilania odczytaj zapisany już czas Readeeprom B_port , 4 'i stan diod If Hours > 24 Then Hours = 0 'zabezpieczenie dla czystej pamieci (FF przy programowaniu) Minutes = 10 ' przesuniecie by nie uzywac wartosci ujemnych Portb = B_port 'przypisanie portowi wartości z pamieci Enable Interrupts '************* START ****************** Do If Minutes = 81 Then 'jesli nic nie nacisnieto do 70minuty to Minutes = 21 'nie pozwoli właczyć tej diody Incr Hours Writeeeprom Hours , 2 Waitms 50 Countdown = 39 'odlicza tylko 40min bo jest juz 10min po End If Debounce Pind.6 , 0 , Time_check , Sub 'switch to ground Loop '************ END ********************* Time_check: Select Case Minutes Case 60 To 80 'pomiedzy 50 a 70min wliczajac przesuniecie If Countdown = 0 Then If Minutes < 70 Then 'obliczanei minut do kolejnej możliwości Help = 70 - Minutes Minutes = 10 - Help Elseif Minutes > 70 Then Help = Minutes - 70 Minutes = 10 + Help End If Countdown = 49 ' zablokowanie nastepnych przycisniec na 50min Select Case Hours Case 1 Reset Portb.0 Case 2 Reset Portb.1 Case 3 Reset Portb.2 Case 4 Reset Portb.3 Case 5 Reset Portb.4 Case 6 Reset Portb.5 Case 7 Reset Portb.6 Case 8 Reset Portb.7 End Select B_port = Portb 'zapisz wartość portu do zmiennej Incr Hours 'i zapisz Writeeeprom B_port , 4 Writeeeprom Hours , 2 Waitms 50 End If End Select Return Clock: Timer1 = Presettimer1 Incr Seconds If Seconds >= 60 Then Seconds = 0 Incr Minutes If Countdown > 0 Then Decr Countdown End If Return Miłego dnia :D
|
|||