'---------------------------Тип_микроконтроллера--------------------------------
$regfile = "m8def.dat"
$crystal = 4000000
'---------------------------Конфигурация портов---------------------------------
Config Portb = Output 'аноды
Config Portd = Output 'сегменты
Config 1wire = Portc.0 'ds18b20
A Alias Portd.5 'сигмент А
B Alias Portd.7 'сигмент В
C Alias Portd.3 'сигмент С
D Alias Portd.1 'сигмент D
E Alias Portd.0 'сигмент E
F Alias Portd.6 'сигмент F
G Alias Portd.4 'сигмент G
Dp Alias Portd.2 'сигмент Dp
Dig1 Alias Portb.3 'анод 1
Dig2 Alias Portb.2 'анод 2
Dig3 Alias Portb.1 'анод 3
Dig4 Alias Portb.0 'анод 4
Ledsettemp Alias Portb.4 'светодиод настроек термостата
Ledsetgis Alias Portb.5 'светодиод настроек гистерезиса
Out_thermostat Alias Portb.6 'выход для исполняющего устройства
Set Portc.1
Set Portc.2
Set Portc.3
Set Portc.4
Cn Alias Pinc.2 'кнопка плюс
Cv Alias Pinc.3 'кнопка минус
Vv Alias Pinc.4 'кнопка ввод
M Alias Pinc.1 'кнопка меню
'---------------------------Переменные------------------------------------------
Dim W As Byte
Dim Z As Byte
Dim Y As Byte
Dim X As Byte
Dim Chislo(8) As Integer
Dim Dp_flag1 As Bit
Dim Dp_flag2 As Bit
Dim Dp_flag3 As Bit
Dim Dp_flag4 As Bit
Dim T1 As Integer
Dim T2 As Integer
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Ee_thermosetting As Eram Integer ' Ячейка памяти в EEPROM, в которой хранится текущая поддерживаемая температура.
Dim Ee_gisterzis As Eram Integer ' Ячейка памяти в EEPROM, в которой хранится гистерзис.
Dim Thermo_setting As Integer ' Поддерживаемая термостатом температура.
Dim Gis_setting As Integer
Dim T As Integer 'флаг режима 1=нагрев,0=охлаждение(требуется для корректной работы гистерезиса)
Dim X1 As Byte
Dim Aa As Byte
Dim Min1 As Byte
Dim Gg As Byte
'------------------------------------Процедуры----------------------------------
Declare Sub Enterdatetime()
Declare Sub Getkey()
Declare Sub Thermocontrol()
Declare Sub Menu()
'-------------------------------Таймеры-----------------------------------------
Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Config Timer1 = Timer , Prescale = 8 : On Timer1 Bootons : ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0 : Enable Timer1 ' разрешаем прерывания и таймер 0
'-----------------------------Основной цикл-------------------------------------
Thermo_setting = Ee_thermosetting
Gis_setting = Ee_gisterzis
If Thermo_setting < 50 Or Thermo_setting > 130 Then ' Такие температуры не поддерживаются.
Chislo(4) = 13
Chislo(3) = 13
Waitms 1800
End If
Ledsetgis = 0
Ledsettemp = 0
Do
1wreset
Stop Timer0 ' : Portd = 255
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Start Timer0
Waitms 750 ' Ждем окончания преобразования
1wreset
Stop Timer0 ': Portd = 255
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread() ' Читаем первый байт
Start Timer0
If Byte1 >= 248 Then ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Chislo(4) = 10
Else
Chislo(4) = 11
End If
T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2 ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
T1 = T1 / 2
Chislo(1) = 12
Chislo(2) = T1 Mod 10
T2 = T1 / 10
Chislo(3) = T2 Mod 10
If T1 > 99 Then Chislo(4) = 1
Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
If Pinc.1 = 0 Then
Gosub Menu
End If
' Call Thermocontrol
Loop
'-----------------------------Вывод на индикатор--------------------------------
Pulse:
Reset Watchdog
Stop Timer0 ' останавливаем таймер 0
Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4
Incr W : If W > 4 Then W = 1 ' выбираем какую цифру сейчас включать
Y = 0
Gosub Look : A = Z ' переходим к подпрограмме Look, которая определяет нужно ли сейчас загорется сегменту А
Gosub Look : B = Z
Gosub Look : C = Z
Gosub Look : D = Z
Gosub Look : E = Z
Gosub Look : F = Z
Gosub Look : G = Z
Select Case W ' включаем цифру которую выбрали (w). Подаем плюс на общий провод конкретной цифры
Case 1 :
If Dp_flag1 = 1 Then Reset Dp Else Set Dp
Set Dig1
Case 2 :
If Dp_flag2 = 1 Then Reset Dp Else Set Dp
Set Dig2
Case 3 :
If Dp_flag3 = 1 Then Reset Dp Else Set Dp
Set Dig3
Case 4 :
If Dp_flag4 = 1 Then Reset Dp Else Set Dp
Set Dig4
End Select
'( ' для индикатора с общим минусом
Select Case W ' включаем цифру которую выбрали (w). Подаем минус на общий провод конкретной цифры
Case 1 :
If Dp_flag1 = 1 Then Set Dp Else Reset Dp
Reset Dig1
Case 2 :
If Dp_flag2 = 1 Then Set Dp Else Reset Dp
Reset Dig2
Case 3 :
If Dp_flag3 = 1 Then Set Dp Else Reset Dp
Reset Dig3
Case 4 :
If Dp_flag4 = 1 Then Set Dp Else Reset Dp
Reset Dig4
End Select
')
Start Timer0 ' запускаем таймер0
Return ' возвращаемся к выполнению основной программы
Look: ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri) ' выбираем из таблици включить или выключить нужный сегмент
Incr Y 'Y это номер сегмента (A=0 B=1 C=2...)
Return 'возвращаемся на место откуда сюда прислали
Cifri:
' таблица сегментом для семисегментников с общим плюсом |Chislo(i)| Символ |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1 '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0 '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0 '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0 '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0 '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0 '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1 '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0 '9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '10 "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '11 ""
Data 0 , 1 , 1 , 0 , 0 , 0 , 1 '12 "C"
Data 0 , 0 , 1 , 1 , 0 , 0 , 0 '13 "P"
Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '14 "t"
'( ' для индикатора с общим минусом
Data 1 , 1 , 1 , 1 , 1 , 1 , 0 '0
Data 0 , 1 , 1 , 0 , 0 , 0 , 0 '1
Data 1 , 1 , 0 , 1 , 1 , 0 , 1 '2
Data 1 , 1 , 1 , 1 , 0 , 0 , 1 '3
Data 0 , 1 , 1 , 0 , 0 , 1 , 1 '4
Data 1 , 0 , 1 , 1 , 0 , 1 , 1 '5
Data 1 , 0 , 1 , 1 , 1 , 1 , 1 '6
Data 1 , 1 , 1 , 0 , 0 , 0 , 0 '7
Data 1 , 1 , 1 , 1 , 1 , 1 , 1 '8
Data 1 , 1 , 1 , 1 , 0 , 1 , 1 '9
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 '10 "-"
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 '11 "" пусто
Data 1 , 0 , 0 , 1 , 1 , 1 , 0 '12 "C"
Data 1 , 1 , 0 , 0 , 1 , 1 , 1 '13 "P"
Data 0 , 0 , 0 , 1 , 1 , 1 , 1 '14 "t"
')
'----------------Контроль температуры у управление нагрузкой--------------------
Bootons:
If T = 1 Then
Gg = Thermo_setting + Gis_setting
Gg = Gg - 1
If T1 <= Gg Then
Out_thermostat = 1
Else
Out_thermostat = 0
T = 0
End If
End If
If T = 0 Then
If T1 <= Thermo_setting Then
T = 1
End If
End If
Return
'--------------------------Сохраняем данные в EEPROM----------------------------
Getdatetime:
Return
Setdate:
Ee_thermosetting = Thermo_setting
Ledsetgis = 0
Ledsettemp = 0
Return
Settime:
Ee_gisterzis = Gis_setting
Ledsetgis = 0
Ledsettemp = 0
Return
'------------------------Настройка термостата-----------------------------------
Sub Enterdatetime()
Aa = 0
X1 = Thermo_setting
Do
Ledsetgis = 0
Ledsettemp = 1
If X1 > 120 Then X1 = 50
If X1 < 50 Then X1 = 120
Chislo(2) = X1 Mod 10
T2 = X1 / 10
Chislo(3) = T2 Mod 10
If X1 > 99 Then Chislo(4) = 1
If X1 <= 99 Then Chislo(4) = 11
Getkey
Thermo_setting = X1
Gosub Setdate
Loop Until Aa = 1
'----------------------Настройка гистерезиса------------------------------------
Aa = 0
X1 = Gis_setting
Do
Ledsetgis = 1
Ledsettemp = 0
If X1 > 20 Then X1 = 1
If X1 < 1 Then X1 = 20
Chislo(2) = X1 Mod 10
T2 = X1 / 10
Chislo(3) = T2 Mod 10
If X1 < 99 Then Chislo(4) = 11
Getkey
Min1 = X1
Loop Until Aa = 1
Gis_setting = Min1
Gosub Settime
End Sub
'-----------------------------Обработка клавиш----------------------------------
Sub Getkey()
Waitms 300
If Cv = 0 Then
Incr X1
Waitms 24
End If
If Cn = 0 Then
Decr X1
Waitms 24
End If
If Vv = 0 Then
Aa = 1
Waitms 24
Else
Aa = 0
Waitms 24
End If
End Sub
'---------------------------Нажата кнопка "МЕНЮ"--------------------------------
Sub Menu()
Aa = 0
Getkey
Enterdatetime
Cls
End Sub