$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 64
$hwstack = 64
$swstack = 64
'библиотека взята с сайта Модели LCD для Протеуса
$lib "glcd-Nokia1100.lib"
'настраиваем таймер1 на импульс длительностью 1 сек
Config Timer1 = Timer , Prescale = 64
Const Timer1pre = 3035
Config Debounce = 50
Config Portd.2 = Output : Portd.2 = 0 : Led3 Alias Portd.2 'led3
Config Portd.1 = Output : Portd.1 = 0 : Led2 Alias Portd.1 'led2
Config Portd.0 = Output : Portd.0 = 0 : Led1 Alias Portd.0 'led1
Config Portb.5 = Output : Sound , Portb.5 , 330 , 1000 'buzer
Config Portb.0 = Input : Portb.0 = 1 'buton стоп
Config Portb.1 = Input : Portb.1 = 1 'buton 1мин
Config Portb.2 = Input : Portb.2 = 1 'buton 10мин
Config Portb.3 = Input : Portb.3 = 1 'buton 60мин
Config Portb.4 = Input : Portb.4 = 1 'buton старт
Config Portd.3 = Input : Portd.3 = 1 'buton_timer_nomer_up
Config Portd.4 = Input : Portd.4 = 1 'buton_timer_nomer_down
Config Graphlcd = 128x64sed , Cs1 = Portc.3 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.2
Const Negative_lcd = 0
Const Mirror_y = -1
Const Mirror_x = 1
Initlcd
Cls
'Переменная для секундных импульсов от таймера1
Dim Puls_time As Bit : Puls_time = 0
Dim Time_rabora As Integer : Time_rabora = 0
'Номер таймера в строке 1-2-3
Dim Nomer_timer As Byte : Nomer_timer = 1
'Переменная для позиции курсора
Dim Poza_nomer_timer As Byte
'Переменные для функции перевода количества секунд в формат времени чч-мм-сс
'Время считаю прямым счетом в секундах, в сутках 86400 секунд
'по этому переменные типа Long.
'если суточный таймер не нужен,
'можно использовать переменные типа Integer(32768 Секунд)
'или типа Word (65535 секунд)
Dim Time_funk_val As Long
Dim Time_funk_str As String * 8
Dim _4as_val As Long
Dim _4as_str As String * 2
Dim _m_in_val As Long
Dim _m_in_str As String * 2
Dim _s_ec_val As Long
Dim _s_ec_str As String * 2
Declare Function Time_str(byval Time_val As Long) As String * 8
'Признак нажатия первой кнопки старт, тогда стразу секундомер
Dim Buton_start_press(3) As Byte
Buton_start_press(1) = 0
Buton_start_press(2) = 0
Buton_start_press(3) = 0
Dim Regim_rabota(3) As Integer
Regim_rabota(1) = 0 '0-stop, 1-cekundomer, 2-timer
Regim_rabota(2) = 0
Regim_rabota(3) = 0
'Переменная для надписей "Секн"и"Тайм"
Dim Regim_rabota_str(3) As String * 4
'Переменные для счета секунд
Dim Period_rabota(3) As Long
Period_rabota(1) = 0
Period_rabota(2) = 0
Period_rabota(3) = 0
'Переменные для счета секунд в формате чч-мм-сс
Dim Period_rabota_str(3) As String * 8
Dim I As Byte
Enable Interrupts
Enable Timer1
On Timer1 Pulse:
'Рисуем первую картинку
Setfont Font6x8
Lcdat 1 , 1 , "----------------"
Lcdat 2 , 1 , "=> 00:00:00 "
Lcdat 3 , 1 , "----------------"
Lcdat 4 , 1 , " 00:00:00 "
Lcdat 5 , 1 , "----------------"
Lcdat 6 , 1 , " 00:00:00 "
Lcdat 7 , 1 , "----------------"
Lcdat 8 , 1 , "----------------"
Do
Debounce Pind.3 , 0 , Buton_timer_nomer_up , Sub
Debounce Pind.4 , 0 , Buton_timer_nomer_down , Sub
Debounce Pinb.0 , 0 , Buton_stop , Sub
If Buton_start_press(nomer_timer) <> 0 Then Goto 10
Debounce Pinb.1 , 0 , Buton_1_minut , Sub
Debounce Pinb.2 , 0 , Buton_10_minut , Sub
Debounce Pinb.3 , 0 , Buton_60_minut , Sub
Debounce Pinb.4 , 0 , Buton_start , Sub
10:
If Puls_time = 0 Then Goto Konec_scheta
For I = 1 To 3
Select Case Regim_rabota(i)
Case 1 ' 1-cekundomer
Incr Period_rabota(i)
If Period_rabota(i) => 86400 Then Period_rabota(i) = 0
Period_rabota_str(i) = Time_str(period_rabota(i))
Poza_nomer_timer = I * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(i)
Case 2 ' 2-timer
Decr Period_rabota(i)
Period_rabota_str(i) = Time_str(period_rabota(i))
Poza_nomer_timer = I * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(i)
Select Case Period_rabota(i)
Case 1 To 5
Sound , Portb.5 , 330 , 500
Case 0
Sound , Portb.5 , 330 , 1000
Select Case I
Case 1
Led1 = 0
Case 2
Led2 = 0
Case 3
Led3 = 0
End Select
Period_rabota(i) = 0
Period_rabota_str(i) = "00:00:00"
Regim_rabota(i) = 0
Poza_nomer_timer = I * 2
Lcdat Poza_nomer_timer , 19 , "00:00:00 "
Buton_start_press(i) = 0
End Select
End Select
Next I
Puls_time = 0
Konec_scheta:
Loop
End 'end program
$include "font6x8.font"
Pulse:
Timer1 = Timer1pre
Puls_time = 1
Return
Buton_timer_nomer_down:
Incr Nomer_timer
If Nomer_timer > 3 Then Nomer_timer = 1
Select Case Nomer_timer
Case 1
Lcdat 2 , 1 , "=>"
Lcdat 6 , 1 , " "
Case 2
Lcdat 4 , 1 , "=>"
Lcdat 2 , 1 , " "
Case 3
Lcdat 6 , 1 , "=>"
Lcdat 4 , 1 , " "
End Select
Return
Buton_timer_nomer_up:
Decr Nomer_timer
If Nomer_timer < 1 Then Nomer_timer = 3
Select Case Nomer_timer
Case 1
Lcdat 2 , 1 , "=>"
Lcdat 4 , 1 , " "
Case 2
Lcdat 4 , 1 , "=>"
Lcdat 6 , 1 , " "
Case 3
Lcdat 6 , 1 , "=>"
Lcdat 2 , 1 , " "
End Select
Return
Buton_stop:
Select Case Nomer_timer
Case 1
Led1 = 0
Case 2
Led2 = 0
Case 3
Led3 = 0
End Select
Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = "00:00:00"
Regim_rabota(nomer_timer) = 0
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , "00:00:00 "
Buton_start_press(nomer_timer) = 0
Return
Buton_1_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 60
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return
Buton_10_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 600
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return
Buton_60_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 3600
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return
Buton_start:
Buton_start_press(nomer_timer) = 1
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Select Case Period_rabota(nomer_timer)
Case 0
Regim_rabota(nomer_timer) = 1
Lcdat Poza_nomer_timer , 73 , "Секн"
Case Else
Regim_rabota(nomer_timer) = 2
Lcdat Poza_nomer_timer , 73 , "Тайм"
End Select
Select Case Nomer_timer
Case 1
Led1 = 1
Case 2
Led2 = 1
Case 3
Led3 = 1
End Select
Return
Function Time_str(byval Time_val As Integer) As String * 8
Time_funk_val = Time_val
'-------------------------------------------------------------
_4as_val = Time_funk_val / 3600
If _4as_val < 10 Then _4as_str = "0" + Str(_4as_val)
If _4as_val >= 10 Then _4as_str = Str(_4as_val)
'-------------------------------------------------------------
_4as_val = _4as_val * 3600
_m_in_val = Time_funk_val - _4as_val
_m_in_val = _m_in_val / 60
If _m_in_val < 10 Then _m_in_str = "0" + Str(_m_in_val)
If _m_in_val >= 10 Then _m_in_str = Str(_m_in_val)
'-------------------------------------------------------------
_m_in_val = _m_in_val * 60
_s_ec_val = Time_funk_val - _4as_val
_s_ec_val = _s_ec_val - _m_in_val
If _s_ec_val < 10 Then _s_ec_str = "0" + Str(_s_ec_val)
If _s_ec_val >= 10 Then _s_ec_str = Str(_s_ec_val)
'-------------------------------------------------------------
Time_str = _4as_str + ":" + _m_in_str + ":" + _s_ec_str
End Function
Двухцветные светодиоды подключал по этой схеме.
Резисторы подбирал в зависимости от примененного транзистора, и по яркости свечения. Чтоб не сильно ярко.
Удобно применить пару BC546(547,548)-BC556(557,558). У них базовый вывод в центре.
Схема (как смог, так и нарисовал... художник из меня еще тот)