Представляю исходник таймера для включения УФ лампы, имеется одна кнопка и 8 светодиодов для индикации установленного времени, с шагом 5мин, от 10мин. Короткое нажатие на кнопку выбирает по кругу время с индикацией со звуковым дублированием на зуммере (с генератором), длительное нажатие приводит к пуску таймера с выбранным временем и включением зуммера (предупреждение о включении лампы и необходимости покинуть помещение), далее включается реле, включающее УФ лампу. Раз в секунду включается зуммер, указывая, что работает лампа, по истечении времени, все отключается.
Контроллер используется ATTINY2313, тактирование от внутреннего генератора, без делителя.

Код:
$regfile = "attiny2313.dat"
$crystal = 8000000


Dim Count As Word
Dim Minutes As Byte
Dim Hours As Byte
Dim Set_time As Word
Dim Times As Byte
Dim Times1 As Byte
Dim Step_timer As Byte , Step_timer_eep As Eram Byte
Dim I As Byte
Dim Status As Boolean
Dim A As Byte
Dim B As Byte
Button Alias Pind.2 : Config Pind.2 = Input
Buzzer Alias Portd.6 : Config Portd.6 = Output
Relay Alias Portd.5 : Config Portd.5 = Output
Config Portb = Output


Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 256
Const Timer1pre = 33594                                
Stop Timer1

Enable Interrupts
Enable Timer1
Enable Timer0

On Timer0 But
On Timer1 Pulse
Start Timer0
Relay = 0
Buzzer = 0


' последовательно включаются все светодиоды
Portb = &B00000001
Waitms 100
Portb = &B00000010
Waitms 100
Portb = &B00000100
Waitms 100
Portb = &B00001000
Waitms 100
Portb = &B00010000
Waitms 100
Portb = &B00100000
Waitms 100
Portb = &B01000000
Waitms 100
Portb = &B10000000
Wait 2
Portb = 0

Do

   Select Case Step_timer
      Case 0 : Portb = &B10000000                           ' 10 min
         Set_time = 600
      Case 1 : Portb = &B01000000                           ' 15 min
         Set_time = 900
      Case 2 : Portb = &B00100000                           ' 20 min
         Set_time = 1200
      Case 3 : Portb = &B00010000                           ' 25 min
         Set_time = 1500
      Case 4 : Portb = &B00001000                           ' 30 min
         Set_time = 1800
      Case 5 : Portb = &B00000100                           ' 35 min
         Set_time = 2400
      Case 6 : Portb = &B00000010                           ' 40 min
         Set_time = 2700
      Case 7 : Portb = &B00000001                           ' 45 min
   End Select


   If Status = 1 Then
      Stop Timer0
      Start Timer1
      Do
         Relay = 1                                          ' работа реле только указанное время
      Loop Until Count = Set_time
      Relay = 0
      Status = 0
   End If
   Stop Timer1                                              '
   Count = 0
   Start Timer0                                             '
Loop


Pulse:
   Timer1 = Timer1pre
   Incr Count
   Buzzer = 1
   Waitms 200
   Buzzer = 0
   'If Status = 1 Then Gosub Beeper2                         ' звуковое оповещение включенного реле
Return


But:
   If Button = 0 Then
      For Times = 0 To 255
         Incr Times1
         If Times1 >= 200 Then                              ' длинное нажатие кнопки
            Waitms 200
            Buzzer = 1                                      ' включение предупреждающего сигнала на 10сек
            Wait 10
            Buzzer = 0
            Status = 1
         End If
         If Button = 1 Then Exit For
         Waitms 5
      Next
      If Status = 0 Then                                    ' блокировка режима выбора времени во время работы реле
         If Times1 < 50 Then
            Gosub Beeper1
            Incr Step_timer                                 ' короткое нажатие кнопки
            If Step_timer > 7 Then Step_timer = 0
         End If
      End If
   End If
   Times = 0
   Times1 = 0
   Gifr = 64
Return

Beeper1:                                                    ' звуковое дублирование нажатия кнопки
   Buzzer = 1
   Waitms 35
   Buzzer = 0
Return

End