Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



I2C CLOCK+ALARM

Сообщений 1 страница 30 из 76

1

Часы работают в 5ти основных режимах. Поочередно отображают Текущее время, дату, температуру либо их комбинации, либо по отдельности,  кроме числа.
В часах имеется один будильник.
Настройка времени, даты и времени срабатывания будильника  производится  манипуляцией двумя кнопками SET и MODE. Третья кнопка  ALARM предназначена для включения, отключения будильника.

MODE в основном режиме переключает поочередность отображения информации ( время, число, температура;  время; время, число; время, температура; температура).  При нажатии отображается какой режим выбран (Вр, Ч, t’, t’C)
В режиме настройки увеличивает настраиваемую величину

ALARM в любом режиме работы (кроме режима настройки ) включает либо отключает будильник. Это отображается точкой в верху перед последним элементом во время отображения текущего времени)

SET поочередно переключает параметры времени/даты/будильника, которые можно менять кнопкой MODE.
Поочередность изменяемых параметров:
Часы (23:__) ‘ при изменении данного параметра после наж. SET в корректировке минут секунды установятся на 00
Минуты (__:53) ‘ при изменении данного параметра после наж. SET секунды установятся на 00
Число (31.__)
Месяц (__.12)
Год    (2010)  ‘ нигде не отображается, он нужен для правильного отображения чисел в высокосные года
Часы будильника     (23:_’_)
Минуты будильника (__:5’9)

Будильник Пищит по 2 раза через паузу. На подобии как китайские часы.

При первом запуске, либо при замене батарейки сразу вместо даты и времени появится абракадабра!!!!! Необходимо зайти в настройки (кнопка SET) и выставить текущее время и дату.

с общим катодом

Код:
'I2C KLOCK+ALARM
'P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      ' говорим компилятору что у нас микропроцессор Atmega 8
$crystal = 8000000                                          ' говорим компилятору что процессор тактируется от генератора с частотой 8, 000 000 мегагерц
Config Watchdog = 2048                                      'reset after 2048 mSec
'Start Watchdog
$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"                                      ' modified lib
Config Sda = Portc.4 : Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Config Clock = User                                         ' this will dim the bytes automatic
Config Pinb.4 = Input : Portb.4 = 1
Config Pinb.5 = Input : Portb.5 = 1
Config Pinb.7 = Input : Portb.7 = 1
Config Portb = Output : Config Portd = Output               ' конфигурируем порты на выход к которым подключен семисегментник                                       ' ‘
Config 1wire = Portc.0                                      ' на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(8) As Integer , Viv_peremennaya As Integer , Temp_print As Integer , Chasi As Byte , Minuti As Byte , Secundi As Byte , Chasi_alarm As Byte , Minuti_alarm As Byte , Weekday As Byte , Clock_flag As Bit , Dp_flag1 As Bit , Dp_flag2 As Bit , Dp_flag3 As Bit , Dp_flag4 As Bit , Migalka As Integer , Den As Byte , Mesjac As Byte , God As Byte , Set_flag As Byte , Mode_flag As Byte , View_menu As Byte , Alarm_flag As Byte , Stop_alarm As Bit , Nosave_time As Byte       ' задаем переменные
Dim T1 As Integer , T2 As Integer , Byte0 As Byte , Byte1 As Byte

Readeeprom View_menu , 0                                    'читаем  из еепрома состояние вида меню основного режима роботы
Readeeprom Chasi_alarm , 10                                 'читаем  из еепрома во сколько часов должен сработать будильник
Readeeprom Minuti_alarm , 20                                'читаем  из еепрома во сколько минут должен сработать будильник
Readeeprom Alarm_flag , 30                                  'читаем  из еепрома должен ли вообще сработать будильник
If View_menu >= 5 Or View_menu < 0 Then View_menu = 0       ' если был сбой eeprom то возращаем вид меню к установке по умолчанию
A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.3 : Dig2 Alias Portb.2 : Dig3 Alias Portb.1 : Dig4 Alias Portb.0       ' тут вписываем порты к которым подключены общие провода каждой цифры
Speaker Alias Portb.6                                       ' сюда вешаем транзистор с динамиком
For X = 1 To 4                                              ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались ноли
Chislo(x) = 11
Next
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

Do                                                          'Основной режим работы. Отображение времени, числа, температуры.
Times:
If View_menu = 0 Or View_menu = 1 Or View_menu = 2 Or View_menu = 3 Then       ' показываем или не показываем время в основном режиме
'*******************************************************************************
' Запрос по i2c времени и пересчет его в четырех значное число а также мигалка двух средних точек (22:03)
For X = 1 To 40
If View_menu > 3 Then Exit For
Set Clock_flag
Gosub Getdatetime
Stop Timer0
Viv_peremennaya = Chasi * 100
Viv_peremennaya = Viv_peremennaya + Minuti
Start Timer0
Migalka = Secundi Mod 2
If Migalka <> 0 Then
Dp_flag2 = 1
Dp_flag3 = 1
Dp_flag4 = 0
Else
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
If Alarm_flag = 1 Then Dp_flag1 = 1 Else Dp_flag1 = 0
Waitms 80
Next
'*******************************************************************************
End If

If View_menu = 0 Or View_menu = 3 Or View_menu = 4 Then     ' показываем или не показываем температуру в основном режиме
'*******************************************************************************
' Запрос с DS18b20 Температуры, погашение первого числа если температура положительная и зажигания там минуса если отритцательная, либо единици если температура > 99. Зажигание последнего символа в виде буквы С и установка перед ней в верху точки (-22'C)(108'C)(05'C)
Reset Clock_flag
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 сама преобразует его в десятичный вид

Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1

Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Waitms 1800
'*******************************************************************************
End If

If View_menu = 0 Or View_menu = 2 Then                      ' показываем или не показываем дату в основном режиме
'*******************************************************************************
' Запрос текущего числа и месяца и установка точки посредине между числом и месяцем. Пересчет даты в четырех значное число (28.12)
Set Clock_flag
Stop Timer0
Viv_peremennaya = Den * 100
Viv_peremennaya = Viv_peremennaya + Mesjac
Start Timer0
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 1
Dp_flag4 = 0
Waitms 700
'*******************************************************************************
End If

Loop

'*******************************************************************************
'работа с  ds1307
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
Secundi = Makedec(_sec) : Minuti = Makedec(_min) : Chasi = Makedec(_hour)

   Den = Makedec(_day) : Mesjac = Makedec(_month) : God = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
'*******************************************************************************

'*************************Вывод на индикатор************************************
Pulse:
Reset Watchdog
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya
If Clock_flag = 1 Then
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next
If Viv_peremennaya < 1000 Then Chislo(4) = 11
End If
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

')

If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then : Set Stop_alarm : End If
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...)

'If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then Alarm_flag = 0

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:

Stop Timer1

If Pinb.7 = 0 Then Gosub Alarm
If Pinb.5 = 0 Then Gosub Set_booton
If Pinb.4 = 0 Then Gosub Mode_booton

Bitwait Pinb.7 , Set
Bitwait Pinb.5 , Set                                        'ждем пока не отпустят кнопку
Bitwait Pinb.4 , Set

If Stop_alarm = 0 Then
If Alarm_flag = 1 Then                                      ' проверяем включен ли будильник
If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then       ' проверяем надо ли играть мелодию будильника
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Waitms 250
Stop Timer0
Portd = 255                                                 ' гасим дисплей
Sound Speaker , 124 , 500                                   'пищим
Start Timer0
Waitms 30
Stop Timer0
Portd = 255                                                 ' гасим дисплей
Sound Speaker , 124 , 500                                   'пищим
Start Timer0
End If
End If
End If
Start Timer1
If Minuti <> Minuti_alarm Then : Stop_alarm = 0 : End If    ' если сейчас не время работы будильника то выключаем флаг временной остановки будильника, для того чтоб через сутки будильник снова зазвенел
Return

Alarm:
If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then : Set Stop_alarm
Elseif Alarm_flag = 1 Then : Alarm_flag = 0 : Else : Alarm_flag = 1 : End If       ' включаем / отключаем будильник (можно только во время когда будильник не должен звонить)

Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1

Writeeeprom Alarm_flag , 30                                 ' записываем в eeprom вкл/откл будильник
Return

'*****************************вывод меню настройки******************************
Set_booton:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Set_flag = 1

Reset Clock_flag

Bitwait Pinb.5 , Set                                        ' ждем пока не отпустим кнопку настроек
  Do                                                        ' цикл настройки часов
                                         ' включаем первые две цифры на которых показаны текущие часы суток, второй кнопкой их можно прибавлять
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi Mod 10
    Chislo(4) = Chasi / 10
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Chasi : Set Nosave_time : End If
    If Chasi >= 24 Then Chasi = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set                                        ' ждем пока не отпустят кнопку настроек

  Do                                                        ' цикл настройки минут
                                         ' включаем вторые две цифры с минутами -||-
    Chislo(1) = Minuti Mod 10
    Chislo(2) = Minuti / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Minuti : _sec = 0 : Set Nosave_time : End If
    If Minuti >= 60 Then Minuti = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  If Nosave_time = 1 Then                                   ' смотрим было ли изменение времени, если да то записываем установленное время по i2c
  _hour = Chasi
  _min = Minuti
  Gosub Settime                                             ' устанавливаем по i2c текущее время
  Else
  Reset Nosave_time
  End If

  Do                                                        ' цикл настройки номера месяца
                                          ' включаем первые две цифры с днем месяца -||-
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Den Mod 10
    Chislo(4) = Den / 10
    Reset Dp_flag1
    Reset Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Den : Set Nosave_time : End If
    If Den >= 32 Then Den = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' цикл настройки дня месяца  ' включаем вторые две цифры с номером месяца -||-

    Chislo(1) = Mesjac Mod 10
    Chislo(2) = Mesjac / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Reset Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Mesjac : Set Nosave_time : End If
    If Mesjac >= 13 Then Mesjac = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' включаем первые две цифры с номером года 20 и вторые две, которые можно изменять 10. все изменяется от 2010 до 2099

    Chislo(1) = God Mod 10
    Chislo(2) = God / 10
    Chislo(3) = 0
    Chislo(4) = 2
    Reset Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr God : Set Nosave_time : End If
    If God >= 100 Then God = 10
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

 If Nosave_time = 1 Then
_day = Den
_month = Mesjac
_year = God
Gosub Setdate                                               ' устанавливаем по i2c текущую дату не зависимо меняли ее или нет
Else
  Reset Nosave_time
End If


  Do                                                        ' часы будильника
    If Chasi_alarm > 23 Then Chasi_alarm = 0
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi_alarm Mod 10
    Chislo(4) = Chasi_alarm / 10
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Chasi_alarm : Set Nosave_time : End If
     If Chasi_alarm > 23 Then Chasi_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do
                                              ' минуты будильника
    If Minuti_alarm > 59 Then Minuti_alarm = 0
    Chislo(1) = Minuti_alarm Mod 10
    Chislo(2) = Minuti_alarm / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Minuti_alarm : Set Nosave_time : End If       ' записываем в eeprom вкл/откл будильник : End If
     If Minuti_alarm > 59 Then Minuti_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0


 If Nosave_time = 1 Then : Writeeeprom Chasi_alarm , 10 : Writeeeprom Minuti_alarm , 20 : Reset Nosave_time : End If       ' сохраняем в eeprom часы и минуты будильника
Set_flag = 0                                                ' флаг окончания настройки
Bitwait Pinb.5 , Set
Start Timer1
Goto Times:                                                 ' переход к отображению времени

Return


Mode_booton:                                                ' кнопка mode которая в основном режиме управляет режимом вывода информации
Enable Interrupts : Enable Timer0 : Start Timer0
If Set_flag = 0 Then
Incr View_menu
If View_menu >= 5 Then View_menu = 0
Writeeeprom View_menu , 0
Reset Clock_flag


          Select Case View_menu
           Case 0 :                                         'показываем по кругу Вр_емя, Ч_исло, t' температуру Вр + Ч + t'
           Chislo(1) = 4
           Chislo(2) = 14
           Chislo(3) = 13
           Chislo(4) = 8
           Set Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 1 :                                         ' Вр
           Chislo(1) = 11
           Chislo(2) = 13
           Chislo(3) = 8
           Chislo(4) = 11
           Reset Dp_flag1
           Reset Dp_flag2
           Reset Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 2 :                                         ' Вр + Ч
           Chislo(1) = 4
           Chislo(2) = 11
           Chislo(3) = 13
           Chislo(4) = 8
           Reset Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 3 :                                         ' Вр + t'
           Chislo(1) = 14
           Chislo(2) = 11
           Chislo(3) = 13
           Chislo(4) = 8
           Reset Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 4 :                                         ' t'
           Chislo(1) = 12
           Chislo(2) = 14
           Chislo(3) = 11
           Chislo(4) = 11
           Set Dp_flag1
           Reset Dp_flag2
           Reset Dp_flag3
           Reset Dp_flag4
           Wait 1

           End Select
 End If

Return
'*******************************************************************************

код с общим анодом

Код:
'I2C KLOCK+ALARM
'P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      ' говорим компилятору что у нас микропроцессор Atmega 8
$crystal = 8000000                                          ' говорим компилятору что процессор тактируется от генератора с частотой 8, 000 000 мегагерц
Config Watchdog = 2048                                      'reset after 2048 mSec
'Start Watchdog
$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"                                      ' modified lib
Config Sda = Portc.4 : Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Config Clock = User                                         ' this will dim the bytes automatic
Config Pinb.4 = Input : Portb.4 = 1
Config Pinb.5 = Input : Portb.5 = 1
Config Pinb.7 = Input : Portb.7 = 1
Config Portb = Output : Config Portd = Output               ' конфигурируем порты на выход к которым подключен семисегментник                                       ' ‘
Config 1wire = Portc.0                                      ' на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(8) As Integer , Viv_peremennaya As Integer , Temp_print As Integer , Chasi As Byte , Minuti As Byte , Secundi As Byte , Chasi_alarm As Byte , Minuti_alarm As Byte , Weekday As Byte , Clock_flag As Bit , Dp_flag1 As Bit , Dp_flag2 As Bit , Dp_flag3 As Bit , Dp_flag4 As Bit , Migalka As Integer , Den As Byte , Mesjac As Byte , God As Byte , Set_flag As Byte , Mode_flag As Byte , View_menu As Byte , Alarm_flag As Byte , Stop_alarm As Bit , Nosave_time As Byte       ' задаем переменные
Dim T1 As Integer , T2 As Integer , Byte0 As Byte , Byte1 As Byte

Readeeprom View_menu , 0                                    'читаем  из еепрома состояние вида меню основного режима роботы
Readeeprom Chasi_alarm , 10                                 'читаем  из еепрома во сколько часов должен сработать будильник
Readeeprom Minuti_alarm , 20                                'читаем  из еепрома во сколько минут должен сработать будильник
Readeeprom Alarm_flag , 30                                  'читаем  из еепрома должен ли вообще сработать будильник
If View_menu >= 5 Or View_menu < 0 Then View_menu = 0       ' если был сбой eeprom то возращаем вид меню к установке по умолчанию
A Alias Portd.5 : B Alias Portd.7 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.6 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
Dig1 Alias Portb.3 : Dig2 Alias Portb.2 : Dig3 Alias Portb.1 : Dig4 Alias Portb.0       ' тут вписываем порты к которым подключены общие провода каждой цифры
Speaker Alias Portb.6                                       ' сюда вешаем транзистор с динамиком
For X = 1 To 4                                              ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались ноли
Chislo(x) = 11
Next
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

Do                                                          'Основной режим работы. Отображение времени, числа, температуры.
Times:
If View_menu = 0 Or View_menu = 1 Or View_menu = 2 Or View_menu = 3 Then       ' показываем или не показываем время в основном режиме
'*******************************************************************************
' Запрос по i2c времени и пересчет его в четырех значное число а также мигалка двух средних точек (22:03)
For X = 1 To 40
If View_menu > 3 Then Exit For
Set Clock_flag
Gosub Getdatetime
Stop Timer0
Viv_peremennaya = Chasi * 100
Viv_peremennaya = Viv_peremennaya + Minuti
Start Timer0
Migalka = Secundi Mod 2
If Migalka <> 0 Then
Dp_flag2 = 1
Dp_flag3 = 1
Dp_flag4 = 0
Else
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
If Alarm_flag = 1 Then Dp_flag1 = 1 Else Dp_flag1 = 0
Waitms 80
Next
'*******************************************************************************
End If

If View_menu = 0 Or View_menu = 3 Or View_menu = 4 Then     ' показываем или не показываем температуру в основном режиме
'*******************************************************************************
' Запрос с DS18b20 Температуры, погашение первого числа если температура положительная и зажигания там минуса если отритцательная, либо единици если температура > 99. Зажигание последнего символа в виде буквы С и установка перед ней в верху точки (-22'C)(108'C)(05'C)
Reset Clock_flag
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 сама преобразует его в десятичный вид

Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1

Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Waitms 1800
'*******************************************************************************
End If

If View_menu = 0 Or View_menu = 2 Then                      ' показываем или не показываем дату в основном режиме
'*******************************************************************************
' Запрос текущего числа и месяца и установка точки посредине между числом и месяцем. Пересчет даты в четырех значное число (28.12)
Set Clock_flag
Stop Timer0
Viv_peremennaya = Den * 100
Viv_peremennaya = Viv_peremennaya + Mesjac
Start Timer0
Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 1
Dp_flag4 = 0
Waitms 700
'*******************************************************************************
End If

Loop

'*******************************************************************************
'работа с  ds1307
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
Secundi = Makedec(_sec) : Minuti = Makedec(_min) : Chasi = Makedec(_hour)

   Den = Makedec(_day) : Mesjac = Makedec(_month) : God = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return
'*******************************************************************************

'*************************Вывод на индикатор************************************
Pulse:
Reset Watchdog
Stop Timer0                                                 ' останавливаем таймер 0
Temp_print = Viv_peremennaya
If Clock_flag = 1 Then
For I = 1 To 4                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i) = Temp_print Mod 10                               ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print = Temp_print / 10                                ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next
If Viv_peremennaya < 1000 Then Chislo(4) = 11
End If
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 Set Dp Else Reset Dp
 Set Dig1
 Case 2 :
 If Dp_flag2 = 1 Then Set Dp Else Reset Dp
 Set Dig2
 Case 3 :
 If Dp_flag3 = 1 Then Set Dp Else Reset Dp
 Set Dig3
 Case 4 :
 If Dp_flag4 = 1 Then Set Dp Else Reset 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
')


If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then : Set Stop_alarm : End If
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...)

'If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then Alarm_flag = 0

Return                                                      'возвращаемся на место откуда сюда прислали

Cifri:
' для индикатора с общим минусом
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:

Stop Timer1

If Pinb.7 = 0 Then Gosub Alarm
If Pinb.5 = 0 Then Gosub Set_booton
If Pinb.4 = 0 Then Gosub Mode_booton

Bitwait Pinb.7 , Set
Bitwait Pinb.5 , Set                                        'ждем пока не отпустят кнопку
Bitwait Pinb.4 , Set

If Stop_alarm = 0 Then
If Alarm_flag = 1 Then                                      ' проверяем включен ли будильник
If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then       ' проверяем надо ли играть мелодию будильника
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Waitms 250
Stop Timer0
Portd = 0                                                 ' гасим дисплей
Sound Speaker , 124 , 500                                   'пищим
Start Timer0
Waitms 30
Stop Timer0
Portd = 0                                                 ' гасим дисплей
Sound Speaker , 124 , 500                                   'пищим
Start Timer0
End If
End If
End If
Start Timer1
If Minuti <> Minuti_alarm Then : Stop_alarm = 0 : End If    ' если сейчас не время работы будильника то выключаем флаг временной остановки будильника, для того чтоб через сутки будильник снова зазвенел
Return

Alarm:
If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then : Set Stop_alarm
Elseif Alarm_flag = 1 Then : Alarm_flag = 0 : Else : Alarm_flag = 1 : End If       ' включаем / отключаем будильник (можно только во время когда будильник не должен звонить)

Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1

Writeeeprom Alarm_flag , 30                                 ' записываем в eeprom вкл/откл будильник
Return

'*****************************вывод меню настройки******************************
Set_booton:
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
Set_flag = 1

Reset Clock_flag

Bitwait Pinb.5 , Set                                        ' ждем пока не отпустим кнопку настроек
  Do                                                        ' цикл настройки часов
                                         ' включаем первые две цифры на которых показаны текущие часы суток, второй кнопкой их можно прибавлять
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi Mod 10
    Chislo(4) = Chasi / 10
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Chasi : Set Nosave_time : End If
    If Chasi >= 24 Then Chasi = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set                                        ' ждем пока не отпустят кнопку настроек

  Do                                                        ' цикл настройки минут
                                         ' включаем вторые две цифры с минутами -||-
    Chislo(1) = Minuti Mod 10
    Chislo(2) = Minuti / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Minuti : _sec = 0 : Set Nosave_time : End If
    If Minuti >= 60 Then Minuti = 0
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  If Nosave_time = 1 Then                                   ' смотрим было ли изменение времени, если да то записываем установленное время по i2c
  _hour = Chasi
  _min = Minuti
  Gosub Settime                                             ' устанавливаем по i2c текущее время
  Else
  Reset Nosave_time
  End If

  Do                                                        ' цикл настройки номера месяца
                                          ' включаем первые две цифры с днем месяца -||-
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Den Mod 10
    Chislo(4) = Den / 10
    Reset Dp_flag1
    Reset Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Den : Set Nosave_time : End If
    If Den >= 32 Then Den = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' цикл настройки дня месяца  ' включаем вторые две цифры с номером месяца -||-

    Chislo(1) = Mesjac Mod 10
    Chislo(2) = Mesjac / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Reset Dp_flag1
    Reset Dp_flag2
    Set Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr Mesjac : Set Nosave_time : End If
    If Mesjac >= 13 Then Mesjac = 1
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do                                                        ' включаем первые две цифры с номером года 20 и вторые две, которые можно изменять 10. все изменяется от 2010 до 2099

    Chislo(1) = God Mod 10
    Chislo(2) = God / 10
    Chislo(3) = 0
    Chislo(4) = 2
    Reset Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    Waitms 100
    If Pinb.4 = 0 Then : Incr God : Set Nosave_time : End If
    If God >= 100 Then God = 10
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

 If Nosave_time = 1 Then
_day = Den
_month = Mesjac
_year = God
Gosub Setdate                                               ' устанавливаем по i2c текущую дату не зависимо меняли ее или нет
Else
  Reset Nosave_time
End If


  Do                                                        ' часы будильника
    If Chasi_alarm > 23 Then Chasi_alarm = 0
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi_alarm Mod 10
    Chislo(4) = Chasi_alarm / 10
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Chasi_alarm : Set Nosave_time : End If
     If Chasi_alarm > 23 Then Chasi_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0
Bitwait Pinb.5 , Set

  Do
                                              ' минуты будильника
    If Minuti_alarm > 59 Then Minuti_alarm = 0
    Chislo(1) = Minuti_alarm Mod 10
    Chislo(2) = Minuti_alarm / 10
    Chislo(3) = 11
    Chislo(4) = 11
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Reset Dp_flag4
    If Pinb.4 = 0 Then : Incr Minuti_alarm : Set Nosave_time : End If       ' записываем в eeprom вкл/откл будильник : End If
     If Minuti_alarm > 59 Then Minuti_alarm = 0
    Waitms 100
  Loop Until Pinb.5 = 0


 If Nosave_time = 1 Then : Writeeeprom Chasi_alarm , 10 : Writeeeprom Minuti_alarm , 20 : Reset Nosave_time : End If       ' сохраняем в eeprom часы и минуты будильника
Set_flag = 0                                                ' флаг окончания настройки
Bitwait Pinb.5 , Set
Start Timer1
Goto Times:                                                 ' переход к отображению времени

Return


Mode_booton:                                                ' кнопка mode которая в основном режиме управляет режимом вывода информации
Enable Interrupts : Enable Timer0 : Start Timer0
If Set_flag = 0 Then
Incr View_menu
If View_menu >= 5 Then View_menu = 0
Writeeeprom View_menu , 0
Reset Clock_flag


          Select Case View_menu
           Case 0 :                                         'показываем по кругу Вр_емя, Ч_исло, t' температуру Вр + Ч + t'
           Chislo(1) = 4
           Chislo(2) = 14
           Chislo(3) = 13
           Chislo(4) = 8
           Set Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 1 :                                         ' Вр
           Chislo(1) = 11
           Chislo(2) = 13
           Chislo(3) = 8
           Chislo(4) = 11
           Reset Dp_flag1
           Reset Dp_flag2
           Reset Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 2 :                                         ' Вр + Ч
           Chislo(1) = 4
           Chislo(2) = 11
           Chislo(3) = 13
           Chislo(4) = 8
           Reset Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 3 :                                         ' Вр + t'
           Chislo(1) = 14
           Chislo(2) = 11
           Chislo(3) = 13
           Chislo(4) = 8
           Reset Dp_flag1
           Reset Dp_flag2
           Set Dp_flag3
           Reset Dp_flag4
           Wait 1

           Case 4 :                                         ' t'
           Chislo(1) = 12
           Chislo(2) = 14
           Chislo(3) = 11
           Chislo(4) = 11
           Set Dp_flag1
           Reset Dp_flag2
           Reset Dp_flag3
           Reset Dp_flag4
           Wait 1

           End Select
 End If

Return
'*******************************************************************************

Ps : термодатчик распологайте подальше от МК и транзисторов, они греются, что дает завышение показаний температуры на 2-3 градуса(проверенно тепловизором, мега греется посередине)! можно в базы транзисторов поставить резисторы порядка 1 килоома.

увеличить

увеличить

Отредактировано Pasha (2010-05-16 03:48:36)

+2

2

:cool: С оазрешения автора опубликую на сайте.

0

3

конечно)
куда видео выложить? есть где без регистрации???

0

4

На Ютубе у меня есть регистрация. Присылай на почту radan1970собакаmail.ru, выложу.

0

5

radan http://depositfiles.com/files/1j18ivu9f с мылом проблема

0

6

Добавил сюда: http://bascom.at.ua/publ/1-1-0-29

0

7

Всем привет!
У меня собственно такой вопрос:
не подскажите, как "прикрутить" к этим часам 2 ds18b20?
Вторую неделю бьюсь, а толку никакого.
AN#111 никакого результата не дал.
Заранее спасибо!

0

8

Вместо нижеприведенного куска кода вставляешь код чтения с одного датчика изAN#111
потом выводим на индикатор надпись t1
Chislo(1) = 14
Chislo(2) = 1
Chislo(3) = 11
Chislo(4) = 11
wait 1
выводим значение первой температуры
Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1
wait 3
читаешь второй датчик
потом выводим на индикатор надпись t2
Chislo(1) = 14
Chislo(2) = 2
Chislo(3) = 11
Chislo(4) = 11
wait 1
выводим значение второй температуры температуры
Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1
wait3

Код:
'*******************************************************************************
' Запрос с DS18b20 Температуры, погашение первого числа если температура положительная и зажигания там минуса если отритцательная, либо единици если температура > 99. Зажигание последнего символа в виде буквы С и установка перед ней в верху точки (-22'C)(108'C)(05'C)
Reset Clock_flag
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 сама преобразует его в десятичный вид

Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1

Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Waitms 1800
'*******************************************************************************

Отредактировано Pasha (2010-03-31 13:03:43)

0

9

Давно когдато делал. поидее должно работать

Код:
'программа обработки двух датчиков типа ds18b20
'и вывода показаний температуры на дисплей.
'температура показывается со знаком и десятыми
'градуса цельсия. замер происходит раз в 3 секунды.

'mailton p-a-h-a@yaandex.ru

$regfile = "m32def.dat"
$crystal = 8000000
$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                                         'используем дисплей на 2 строчки по 16 знакомест в каждой

Cursor Off
  Cls                                                       'выключить курсор дисплея
Lcd "HELLO"
Config 1wire = Portc.7                                      'порт, куда садим ногами два датчика типа ds18b20
Wait 5
'Config Timer1 = Timer , Prescale = 64                       'конфигурируем таймер и ставим его делитель 64. таймер будет переполнятся 2 раза в секунду
'On Timer1 Pulse:                                            'при переполнении таймера запустить подпрограмму Pulse
'Enable Interrupts                                           'разрешить прерывания
'Enable Timer1
                                         'разрешить таймер1
'--------задаем переменные------------------
Dim S05 As Byte
Dim W As Word
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Byte0 As Byte
Dim Byte1 As Byte
Dim Signtemperatura As String * 1
Dim T1 As Single
Dim T2 As Integer
Dim Ttemp As Byte
Dim Hh As Byte
Dim Mm As Byte
Dim X As Byte
'-----------считываем 64 битные номера датчиков----------------

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1
Cls
'_________________________основной цикл программы________________________________________________________
Do
'If S05 >= 6 Then                                            'если щетчик таймер насчитал 3 секунды (таймер срабатывает 2 раза в секунду при 8 мГц
'S05 = 0                                                     'обнуляем щетчик таймер
Wait 2
Gosub Convallt                                              'переходим на подпрограмму подачи запросов в датчик температуры
1wverify Dsid1(1)
X = 1                                                       'переменная номера строки дисплея
Gosub Temperature                                           'переходим на подпрограмму подсчета и вывода температуры на дисплей
1wverify Dsid2(1)
X = 2
Gosub Temperature
'End If
  Loop
End
'_________________________________________________________________________________
Convallt:
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44
' Waitms 500
Return                                                      ' возврат в основной цикл на место, откуда пришли
'----------------
Temperature:
If Err = 0 Then
1wwrite &HBE
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
T1 = Byte0 / 16                                             ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16                                             ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
Hh = Fix(t1)                                                'отсекаем от температуры все после запятой
Ttemp = T1 * 10                                             '
Mm = Ttemp Mod 10                                           'берем десятичную часть температуры
Locate X , 1                                                'указываем куда вывести на дисплей
Lcd Signtemperatura ; Hh ; "." ; Mm                         'выводим целую часть потом рисуем точку потом десятую часть температуры
End If
Return
'-----------------
'Pulse:                                                      'подпрограмма обработки переполнения таймера1
'Incr S05                                                    ' S05 = S05+1
'Return

0

10

Привет!
Ни чего не помогло.

Код:
W = 1wirecount()                                            'Поиск всех подключенных датчиков
Chislo(1) = W Mod 10
Chislo(2) = W / 10

На шине не найдено ни одного датчика!
Может кто сталкивался?
Спасибо!

0

11

Это должно определить 2 датчика и на lcd дисплее показать их номера. Тренируйтес
этот код должен стоять перед основной программой. Сначала считал номера датчиков, а потом в теле программы ими пользоватся..

Код:
$regfile = "m32def.dat"
$crystal = 8000000
$lib "lcd4.lbx"                                             'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2                                         'используем дисплей на 2 строчки по 16 знакомест в каждой

Cursor Off
  Cls  
Config 1wire = Portc.7 ' проверь правильный ли порт   
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim W As Word
W = 1wirecount()
Dsid1(1) = 1wsearchfirst() ' считываем номер первого датчика
Do
 Dsid2(1) = 1wsearchnext() ' номер 2го датчика
Loop Until Err = 1
Cls
locate 1, 1
lcd Dsid1(1)
lcd  Dsid2(1) 
end

Отредактировано Pasha (2010-04-03 15:11:06)

0

12

На LCD оба кода работают, а в часах выдает ошибку чтения ID датчиков и не находит ни одного на шине.

Отредактировано max (2010-04-03 19:19:24)

0

13

Так как пока не разобрался 2 18В20, подключил 1 18В20 и 1 1621.
Собственно вопрос:
как сделать регулеровку яркости?
Заранее спасибо!

0

14

о яркости ничего не скажу, а о двух датчиках:
Stop timer0
1wverify Dsid1(1)
start timer0

Копай в этом направлении

Отредактировано Pasha (2010-04-08 19:07:25)

0

15

Делал сейчас измерение температуры двумя датчиками с выводом на два по 3 цифры семисегментника. Действительно были проблемы. Недостаток кода - во время выбора датчика семисегментники на мгновение гаснут

Код:
$regfile = "m8def.dat"                                      ' говорим компилятору что у нас микропроцессор Atmega 8
$crystal = 8000000                                          ' говорим компилятору что процессор тактируется от генератора с частотой 8, 000 000 мегагерц
Ddrb = 255 : Ddrd = Ddrb
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(6) As Byte , Viv_peremennaya(2) As Byte , Temp_print(2) As Byte       ' задаем переменные
Dim Dsid1(8) As Byte , Dsid2(8) As Byte , Byte0 As Byte , Byte1 As Byte , T1 As Byte , T2 As Byte , Signtemperatura(3) As Byte , Xx As Byte

Config 1wire = Portc.0                                      'порт, куда садим ногами два датчика типа ds18b20 ПО ДВУХПРОВОДНОЙ СХЕМЕ. ЦЕНТРАЛЬНЫЙ СЮДА С ПОДТЯЖКОЙ 1 КОМ НА +, А ДВА КРАЙНИХ СОЕДИНИТЬ ВМЕСТЕ И НА МИНУС
Dsid1(1) = 1wsearchfirst()
Do
 Dsid2(1) = 1wsearchnext()
Loop Until Err = 1

Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse :    ' конфигурируем таймер 0 и назначаем подпрограмму которая выполняется при переполнении таймера
Enable Interrupts : Enable Timer0

'_________________________основной цикл программы________________________________________________________
Do
'_________________________________________________________________________________ подготавливаем выводимые цифры
Temp_print(1) = Viv_peremennaya(1)
Temp_print(2) = Viv_peremennaya(2)

For I = 1 To 3                                              ' цикл в котором разбивается переменная на отдельные числа от 0 до 9
Chislo(i + 3) = Temp_print(1) Mod 10                        ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print(1) = Temp_print(1) / 10                          ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Chislo(i) = Temp_print(2) Mod 10                            ' заносим в масив последнюю цифру от числа Temp_print(12345678 mod 10 = 8)
Temp_print(2) = Temp_print(2) / 10                          ' отсекаем последнюю цифру от числа Temp_print (12345678/10=1234567)
Next

If Viv_peremennaya(2) < 100 Then Chislo(3) = 10             ' УБИРАЕМ НОЛИ ПЕРЕД ЧИСЛОМ ЧТОБ БЫЛО НЕ 021 А 21
If Viv_peremennaya(2) < 10 Then Chislo(2) = 10              ' НЕ 07 А 7
If Viv_peremennaya(1) < 100 Then Chislo(6) = 10
If Viv_peremennaya(1) < 10 Then Chislo(5) = 10
If Signtemperatura(1) = 1 Then Chislo(3) = 11               ' СТАВИМ МИНУС В НАЧАЛЕ, ЕСЛИ ТЕМПЕРАТУРА ОТРИДЦАТЕЛЬНАЯ
If Signtemperatura(2) = 1 Then Chislo(6) = 11               ' СТАВИМ МИНУС В НАЧАЛЕ, ЕСЛИ ТЕМПЕРАТУРА ОТРИДЦАТЕЛЬНАЯ
'_________________________________________________________________________________
Wait 3
'_________________________________________________________________________________ меряем температуру
Gosub Convallt                                              'переходим на подпрограмму подачи запросов в датчик температуры

Gosub Pause
1wverify Dsid1(1)
Start Timer0

Gosub Temperature

Viv_peremennaya(1) = T1
Signtemperatura(1) = Signtemperatura(3)                     'переходим на подпрограмму подсчета и вывода температуры на дисплей

Gosub Pause
1wverify Dsid2(1)
Start Timer0

Gosub Temperature

Viv_peremennaya(2) = T1
Signtemperatura(2) = Signtemperatura(3)
'_________________________________________________________________________________

'_________________________________________________________________________________ рисуем слово Error если температура больше 120
If Viv_peremennaya(1) > 120 Or Viv_peremennaya(2) > 120 Then
Chislo(1) = 13
Chislo(2) = 14
Chislo(3) = Chislo(1)
Chislo(4) = Chislo(1)
Chislo(5) = 12
Chislo(6) = 10
Wait 4
End If

Loop
End
'_________________________________________________________________________________
'_________________________________________________________________________________ гасим семисегментник и останавливаем таймер, чтоб нормально замерять температуру
Pause:
Portb = 0 : W = 7
Stop Timer0
Return
'_________________________________________________________________________________
'_________________________________________________________________________________ запрос вычисления температуры
Convallt:
 1wreset                                                    ' reset the bus
 1wwrite &HCC                                               ' skip rom
 1wwrite &H44
 Waitms 750
Return                                                      ' возврат в основной цикл на место, откуда пришли
'_________________________________________________________________________________
'_________________________________________________________________________________ получение температуры
Temperature:
If Err = 0 Then
Stop Timer0
1wwrite &HBE
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()
Start Timer0                                                ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Set Signtemperatura(3)                                      '-
Else
Reset Signtemperatura(3)                                    '+
End If
T1 = Byte0 / 16 : T2 = Byte1 * 16 : T1 = T1 + T2
End If
Return
'_________________________________________________________________________________
'_________________________________________________________________________________ вывод подготовленных цифр в основном цикле на индикатор
Pulse:
Portd = &HFF
Portb = Portb / 2                                           ' сдвигаем порт В, чтоб загорелась следующая цифра
Incr W : If W > 6 Then : W = 1 : Portb = 32 : End If        ' выбираем какую цифру сейчас включать и если все цифры пройдены - включаем первую (Portb = 32)
Portd = Lookup(chislo(w) , Chislo)
Return                                                      ' возвращаемся к выполнению основной программы
'_________________________________________________________________________________
Chislo:
'     0     1     2     3    4    5    6    7     8   9   10""  11-   12E  13r  14o
Data 20 , 215 , 140 , 133 , 71 , 37 , 36 , 151 , 4 , 5 , 255 , 239 , 44 , 238 , 228








'где сидят какие ноги семисигментника
'A Alias Portd.6 : B Alias Portd.5 : C Alias Portd.3 : D Alias Portd.1 : E Alias Portd.0 : F Alias Portd.7 : G Alias Portd.4 : Dp Alias Portd.2       'Тут вписываем порты к которым подключены сегменты индикатора
'Dig1 Alias Portb.5 : Dig2 Alias Portb.4 : Dig3 Alias Portb.3 : Dig4 Alias Portb.2 : Dig5 Alias Portb.1 : Dig6 Alias Portb.0       ' тут вписываем порты к которым подключены общие провода каждой цифры

+1

16

Всем привет!
Покапался в HELPе и сделал так:

Код:
Config 1wire = Portc.0                               ' на эту ножку подключим DS18B20 и подтягивающий резистор на 4,7 ком к + питания

указываем только один раз, а то васик будет ругаться

первый датчик

Код:
   1wreset
   Stop Timer0
   1wwrite &HCC
   1wwrite &H44
   Start Timer0
   Waitms 750
   1wreset
   Stop Timer0
   1wwrite &HCC
   1wwrite &HBE
   Byte0 = 1wread()                                         ' Читаем нулевой байт
   Byte1 = 1wread()                                         ' Читаем первый байт
   Start Timer0
   If Byte1 >= 248 Then          ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - ычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Sign1 = "-"                                    
Else
Sign1 = "+"                                 
End If

второй датчик

Код:
1wreset Pinc , 4
Stop Timer0
1wwrite &HCC , 1 , Pinc , 4                                 ' Выдаем команду чтения ПЗУ
1wwrite &H44 , 1 , Pinc , 4                                 ' Запуск измерения
Start Timer0
Waitms 750                                                  ' Ждем окончания преобразования
1wreset Pinc , 4
Stop Timer0                                                 ': Portd = 255
1wwrite &HCC , 1 , Pinc , 4
1wwrite &HBE , 1 , Pinc , 4                                 ' Команда чтения ОЗУ датчика
B0 = 1wread(1 , Pinc , 4)                                   ' Читаем нулевой байт
B1 = 1wread(1 , Pinc , 4)                                   ' Читаем первый байт
Start Timer0
If B1 >= 248 Then                                           ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
B0 = &HFF - B0
B1 = &HFF - B1
Sign2 = "-"                                   
Else
Sign2 = "+"                               
End If

0

17

max написал(а):

Собственно вопрос:как сделать регулеровку яркости?Заранее спасибо!

Вопрос остался.

0

18

в голове два варианта -
1. самое простое поставить переменный резистор в цепь питания транзисторов
2. вместо таймера 0 юзать таймер1 и в конце прерывания присваивать ему нужное значение. к примеру timer1 = 50000

ну это все догадки....

0

19

Всем привет!

max написал(а):

Собственно вопрос:как сделать регулеровку яркости?Заранее спасибо!

Вопрос остался.

Pasha написал(а):

в голове два варианта -
1. самое простое поставить переменный резистор в цепь питания транзисторов
2. вместо таймера 0 юзать таймер1 и в конце прерывания присваивать ему нужное значение. к примеру timer1 = 50000
           
ну это все догадки....

Или настроить таймер2 на шим и полевым транзистором управлять питанием индикаторов.
Попробую, отпишусь.

0

20

Всем привет!
Надолго потерялся, так как были запарки на работе.
Управлять яркостью индикаторов по времени получилось.
Захотелось подключить фототранзистор для управления яркостью по освещенности,
но тут возникла проблема.

За основу взял эту схему:

http://s006.radikal.ru/i215/1005/17/960075310a6bt.jpg

и исходник обрабатчика прерывания:

Код:
   $regfile = "m8def.dat"                                   'подключаем описание микроконтроллера
   $crystal = 4000000                                       'устанавливаем частоту внутреннего генератора 4Mhz
   Config Pind.3 = Input                                    'задаём конфигурацию PIND.3 как вход
   Config Int1 = Low Level                                  'разрешаем прерывания при низком уровне
   On Int1 Foto2                                            'переход по прерыванию к метке Foto2
   Enable Interrupts                                        'разрешаем все прерывания
   Enable Int0                                              'включаем прерывание на ножке INT0
   Disable Int1                                             'запрещаем прерывание на ножке INT1
'-------------------------------------------------------------------------------
'              подпрограмма обработчика сигнала с фототранзистора
'-------------------------------------------------------------------------------
Foto1:
   Portd = &B00000000
   Enable Int1                                              'включение внешнего прерывания int1
   Goto Ef1                                                 'безусовный переход на метку Ef1
Foto2:
   Portb = &B00000000                                       'установка бит данных порта B
   Portc = &B0000000                                        'установка бит данных порта C
   Portd = &B00000001                                       'установка бит данных порта D
   Waitms 15                                                'задержка 17мс
   Portd.0 = 0                                              'обнуляем порт D
   Waitms 15                                                'задержка 17мс
   Return                                                   'выход из подпрограммы

Только вместо ФТ-2к подключил SFH309PFA.

Код переделал под себя:

Код:
$regfile = "m32def.dat"                                     'подключаем описание микроконтроллера
$crystal = 8000000                                          устанавливаем частоту внутреннего генератора 8 мегагерц
Config Pind.3 = Input                                    'задаём конфигурацию PIND.3 как вход
Config Int1 = Low Level : On Int1 Foto                      'разрешаем прерывания при низком уровне, переход по прерыванию к метке Foto
Enable Interrupts : Enable Int1                                 ' разрешаем прерывания
'-------------------------------------------------------------------------------
'              подпрограмма обработчика сигнала с фототранзистора
'-------------------------------------------------------------------------------
Foto:
Ocr2 = 65
Return                                                      'выход из подпрограммы

А проблема в том, что при "сработке" прерывания яркость снижается, а обратно не возвращается.
Пробывал останавливать таймеры, но тогда на дисплее цифры начинают "бегать".

Подскажите, что делаю не так?

Заранее спасибо!

Отредактировано max (2010-05-14 19:34:48)

0

21

мне кажется что стоит использовать АЦП  в основном цикле. и в зависимости от уровня освещенности плавно менять яркость. Фототранзистор посадить на плюс, последовательно включить резистор посаженный на минус и место соединения фототранзистора и резистора посадить на АЦП. (Ocr2 = gatadc/10) если хочется быстроты реакции то можно использовать таймер 3 и в нем опрашивать фотодатчик.

А ошибка в том что нет действия которое бы приводило к повышению яркости. Зачем использовать вообще прерывание на освещенность??? в основном коде if pinX.Y = 0 then Ocr2 = 65 else Ocr2 = 100..... Но лучше АЦП - плавнее будет а не 2 степени яркости

Отредактировано Pasha (2010-05-15 01:40:45)

0

22

Спасибо!
Буду пробовать.

0

23

Нашел ошибку
строку
' _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
необходимо раскоментировать!!! в исходниках выше исправил! а то по непонятной причине при переходе с 14го числа в 15е рисовало 8е

0

24

Это было сразу исправлено!

0

25

Корпус из зубочисток наклеенных на картон, который наклеенный на металлопрофиль (используется для жесткости в гипсокартоновых конструкциях). Стекло обклеено с двух сторон обычной автомобильной тонировкой. Осталось еще по краям стекла зубочистки наклеить. Все на клее ПВА. Плата и индикаторы приклеены пистолетным клеем.

увеличить

увеличить

Отредактировано Pasha (2010-07-08 23:59:20)

0

26

Pasha
Здравствуйте, извините не нашел другого способа с Вами связаться. Я отправил Вам письмо на яндекс, посмотрите его пожалуйста.

0

27

ребята нужна прошивка с общим катодом на эти часы ...скинте пожалуйста а то есть нех так там с анодом

Отредактировано demon1 (2013-03-17 18:48:48)

0

28

Держи. Код из первого поста.

0

29

большое спасибо буду пробовать

0

30

Пробуй, если что, пиши.

0