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

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

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

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



I2C CLOCK+ALARM

Сообщений 31 страница 60 из 68

31

попробовал нече кроме точек не разобрать остольное горят 8ки видно что чтото меняеться но незаметно

0

32

Какая схема?

0

33

вот  эта

0

34

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

вот  эта

Где?

0

35

Ну сказал же человек- ЭТА, че не понятно ?  :D

0

36

на первой  странице

0

37

Если один в один, то должна работать. По хорошему нужно свою схему предъявлять.

0

38

один  в один пробовал даже маленький индикатор припаять на 3 вольта так тоже самое..

0

39

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

один  в один

Тогда прошивка нужна с общим анодом.

0

40

пробовал не идет тоже самое

0

41

http://dfiles.ru/files/i8xnr9l3z только что слил прошивку из рабочих часов

Отредактировано Pasha (2013-03-21 23:28:05)

0

42

вопрос епром записывать нужно?\

0

43

Как угодно. Там настройки часов.

0

44

а чт о за 2й документ?

0

45

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

а чт о за 2й документ?

eep на самом деле тебе не нужен. Достаточно переименовать i2c clok в i2c clok.hex, залить его в мегу8, выставить фузы и все должно работать.

0

46

уже который день бьюсь над кодом для индикаторов с ОА. нужна помощь. что я сделал не правильно? там где пересенные с flag поменял set на reset. и представление чисел, как уже написал автор

P  S мне кажется что для ОА код не доделан, ибо так, с шапки код не дружит

Код:
'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
Reset 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 = 2 Then                      ' показываем или не показываем дату в основном режиме
'*******************************************************************************
' Запрос текущего числа и месяца и установка точки посредине между числом и месяцем. Пересчет даты в четырех значное число (28.12)
Reset 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
Set Dig1 : Set Dig2 : Set Dig3 : Set 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
 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

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

Set Clock_flag

Bitwait Pinb.5 , Set                                        ' ждем пока не отпустим кнопку настроек
  Do                                                        ' цикл настройки часов
                                         ' включаем первые две цифры на которых показаны текущие часы суток, второй кнопкой их можно прибавлять
    Chislo(1) = 11
    Chislo(2) = 11
    Chislo(3) = Chasi Mod 10
    Chislo(4) = Chasi / 10
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Set 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
    Set Dp_flag1
    Reset Dp_flag2
    Reset Dp_flag3
    Set 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
    Set Dp_flag1
    Set Dp_flag2
    Reset Dp_flag3
    Set 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
    Set Dp_flag1
    Set Dp_flag2
    Reset Dp_flag3
    Set 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
    Set Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Set 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
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Set 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
    Reset Dp_flag1
    Set Dp_flag2
    Set Dp_flag3
    Set 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
           Reset Dp_flag1
           Set Dp_flag2
           Reset Dp_flag3
           Set Dp_flag4
           Wait 1

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

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

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

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

           End Select
 End If

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

Отредактировано Dimon4ik (2014-03-06 23:19:22)

0

47

Доброго времени суток! Народ, помогите пожалуйста переделать код под свои нужды, а то сам не соображу откуда начинать плясать.

0

48

Здравствуйте. Собрал эти часы, остался доволен. Идут довольно точно. Одно не устраивает: время работы будильника 1 минута. Подскажите, пожалуйста, что изменить в прошивке, чтобы будильник выключался только кнопкой.

0

49

Думаю нужно закоментировать стороку:

If Minuti <> Minuti_alarm Then : Stop_alarm = 0 : End If    ' если сейчас не время работы будильника то выключаем флаг временной остановки будильника, для того чтоб через сутки будильник снова зазвенел

и добавить условие:

Alarm:
if Stop_alarm=1 then
   Reset Stop_alarm
else
   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       ' включаем / отключаем будильник (можно только во время когда будильник не должен звонить)
end if
Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1

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

Return

0

50

Спасибо, но не помогло. Все завязано на условии:

If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then   ' проверяем надо ли играть мелодию будильника

Только условие не соблюдается, будильник перестает пищать. А как это обойти ума не приложу.

Отредактировано Andrusha (2017-03-27 20:43:19)

0

51

Andrusha

выложите код, которым Вы пользуетесь. Я поправлю и выложу результат.

+1

52

ну пробуй это:

If Chasi = Chasi_alarm And Minuti = Minuti_alarm And Pinb.7 = 0 Then : Set Stop_alarm : End If
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

меняем на:

If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then
  If Stop_alarm = 1 Then Stop_alarm = 0
Elseif Stop_alarm = 2 Then
  Stop_alarm = 1
End If
If Stop_alarm = 0 And Pinb.7 = 0 Then Stop_alarm = 2
Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы




тут убираем условие и end if незабудь:

If Stop_alarm = 0 Then
If Alarm_flag = 1 Then                                      ' проверяем включен ли будильник
убираем---->If Chasi = Chasi_alarm And Minuti = Minuti_alarm Then       ' проверяем надо ли играть мелодию будильника

убираем это:

If Minuti <> Minuti_alarm Then : Stop_alarm = 0 : End If    ' если сейчас не время работы будильника то выключаем флаг временной остановки будильника, для того чтоб через сутки будильник снова зазвенел




ну и тут :

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       ' включаем / отключаем будильник (можно только во время когда будильник не должен звонить)

меняем на:

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

Отредактировано Yuriy.pv (2017-03-28 00:20:09)

0

53

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

выложите код, которым Вы пользуетесь. Я поправлю и выложу результат.


Аналогичное предложение.

Как вариант, пройдите пошагово в симуляции, или приезжайте в Киев, пройдёмся вместе.

0

54

Вот код, правда я его подрезал, как мне надо:

Код:
$regfile = "m8def.dat"                                      '  Atmega 8
$crystal = 8000000                                          '  8, 000 000 мегагерц
$lib "mcsbyte.lbx"                                          '       библиотеки
$lib "ds1307clock.lib"
Config Sda = Portc.4 : Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' пины для подключения Ds1307
Const Ds1307r = &HD1
Config Clock = User
Config Pinb.4 = Input : Portb.4 = 1
Config Pinb.3 = Input : Portb.3 = 1
Config Pinb.5 = Input : Portb.5 = 1
Config Portb = Output : Config Portd = Output               ' конфигурируем порты на выход к которым подключен семисегментник
 Portb.2 = 0
 Config Debounce = 50
Config 1wire = Portc.1                                      '  DS18B20
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(4) As Integer , Viv_peremennaya 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 , 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 , N As Bit

Readeeprom Chasi_alarm , 10                                 'читаем  из еепрома во сколько часов должен сработать будильник
Readeeprom Minuti_alarm , 20                                'читаем  из еепрома во сколько минут должен сработать будильник
Readeeprom Alarm_flag , 30                                  'читаем  из еепрома должен ли вообще сработать будильник

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

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:
'*******************************************************************************
' Запрос по i2c времени и пересчет его в четырех значное число а также мигалка двух средних точек (22:03)
For X = 1 To 40
Set Clock_flag
Gosub Getdatetime

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
'*******************************************************************************
Loop
'*******************************************************************************
Mode_booton:
' Запрос с DS18b20 Температуры
 Reset Clock_flag
Disable Interrupts
1wreset
If Err = 1 Then
N = 1
Else
N = 0
End If
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Enable Interrupts
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
Disable Interrupts
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
Enable Interrupts
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
If T1 = 0 Then Chislo(4) = 11
If N = 0 Then
Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1
If T1 < 10 Then Chislo(3) = 11
Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Else
Chislo(1) = 10 : Chislo(2) = 10 : Chislo(3) = 10 : Chislo(4) = 10
 Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
Waitms 1800
Return

'*******************************************************************************
' Запрос текущего числа и месяца и установка точки посредине между числом и месяцем. Пересчет даты в четырех значное число (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

'*******************************************************************************
'работа с  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:
Stop Timer0                                                 ' останавливаем таймер 0
 If Clock_flag = 1 Then
Chislo(4) = Chasi / 10
Chislo(3) = Chasi Mod 10
Chislo(2) = Minuti / 10
Chislo(1) = Minuti Mod 10

If Chasi < 10 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.3 = 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.3 = 0 Then Gosub Alarm
If Pinb.5 = 0 Then Gosub Set_booton
If Pinb.4 = 0 Then Gosub Mode_booton

Bitwait Pinb.3 , 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 10
 Set Portb.2                                                'пищим
Waitms 10
Reset Portb.2
Waitms 10
 Set Portb.2                                                'пищим
Waitms 10
Reset Portb.2
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

0

55

я бы сделал так:

Код:
$regfile = "m8def.dat"                                      '  Atmega 8
$crystal = 8000000                                          '  8, 000 000 ìåãàãåðö
$lib "mcsbyte.lbx"                                          '       áèáëèîòåêè
$lib "ds1307clock.lib"
Config Sda = Portc.4 : Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' ïèíû äëÿ ïîäêëþ÷åíèÿ Ds1307
Const Ds1307r = &HD1
Config Clock = User
Config Pinb.4 = Input : Portb.4 = 1
Config Pinb.3 = Input : Portb.3 = 1
Config Pinb.5 = Input : Portb.5 = 1
Config Portb = Output : Config Portd = Output               ' êîíôèãóðèðóåì ïîðòû íà âûõîä ê êîòîðûì ïîäêëþ÷åí ñåìèñåãìåíòíèê
 Portb.2 = 0
 Config Debounce = 50
Config 1wire = Portc.1                                      '  DS18B20
Dim W As Byte , Z As Byte , Y As Byte , I As Byte , X As Byte , Chislo(4) As Integer , Viv_peremennaya 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 , 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 , N As Bit , Alarmforever As Bit

Readeeprom Chasi_alarm , 10                                 '÷èòàåì  èç ååïðîìà âî ñêîëüêî ÷àñîâ äîëæåí ñðàáîòàòü áóäèëüíèê
Readeeprom Minuti_alarm , 20                                '÷èòàåì  èç ååïðîìà âî ñêîëüêî ìèíóò äîëæåí ñðàáîòàòü áóäèëüíèê
Readeeprom Alarm_flag , 30                                  '÷èòàåì  èç ååïðîìà äîëæåí ëè âîîáùå ñðàáîòàòü áóäèëüíèê

A Alias Portd.5 : B Alias Portd.2 : C Alias Portd.4 : D Alias Portb.6 : E Alias Portd.0 : F Alias Portd.1 : G Alias Portd.3 : Dp Alias Portb.7       'Òóò âïèñûâàåì ïîðòû ê êîòîðûì ïîäêëþ÷åíû ñåãìåíòû èíäèêàòîðà
Dig4 Alias Portd.6 : Dig3 Alias Portd.7 : Dig2 Alias Portb.0 : Dig1 Alias Portb.1       ' òóò âïèñûâàåì ïîðòû ê êîòîðûì ïîäêëþ÷åíû îáùèå ïðîâîäà êàæäîé öèôð

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:
'*******************************************************************************
' Çàïðîñ ïî i2c âðåìåíè è ïåðåñ÷åò åãî â ÷åòûðåõ çíà÷íîå ÷èñëî à òàêæå ìèãàëêà äâóõ ñðåäíèõ òî÷åê (22:03)
For X = 1 To 40
Set Clock_flag
Gosub Getdatetime

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
'*******************************************************************************
Loop
'*******************************************************************************
Mode_booton:
' Çàïðîñ ñ DS18b20 Òåìïåðàòóðû
 Reset Clock_flag
Disable Interrupts
1wreset
If Err = 1 Then
N = 1
Else
N = 0
End If
1wwrite &HCC                                                ' Âûäàåì êîìàíäó ÷òåíèÿ ÏÇÓ
1wwrite &H44                                                ' Çàïóñê èçìåðåíèÿ
Enable Interrupts
Waitms 750                                                  ' Æäåì îêîí÷àíèÿ ïðåîáðàçîâàíèÿ
1wreset
Disable Interrupts
1wwrite &HCC
1wwrite &HBE                                                ' Êîìàíäà ÷òåíèÿ ÎÇÓ äàò÷èêà
Byte0 = 1wread()                                            ' ×èòàåì íóëåâîé áàéò
Byte1 = 1wread()                                            ' ×èòàåì ïåðâûé áàéò
Enable Interrupts
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
If T1 = 0 Then Chislo(4) = 11
If N = 0 Then
Chislo(1) = 12
Chislo(2) = T1 Mod 10
Chislo(3) = T1 / 10
If T1 > 99 Then Chislo(4) = 1
If T1 < 10 Then Chislo(3) = 11
Dp_flag1 = 1
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
Else
Chislo(1) = 10 : Chislo(2) = 10 : Chislo(3) = 10 : Chislo(4) = 10
 Dp_flag1 = 0
Dp_flag2 = 0
Dp_flag3 = 0
Dp_flag4 = 0
End If
Waitms 1800
Return

'*******************************************************************************
' Çàïðîñ òåêóùåãî ÷èñëà è ìåñÿöà è óñòàíîâêà òî÷êè ïîñðåäèíå ìåæäó ÷èñëîì è ìåñÿöåì. Ïåðåñ÷åò äàòû â ÷åòûðåõ çíà÷íîå ÷èñëî (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

'*******************************************************************************
'ðàáîòà ñ  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:
Stop Timer0                                                 ' îñòàíàâëèâàåì òàéìåð 0
 If Clock_flag = 1 Then
Chislo(4) = Chasi / 10
Chislo(3) = Chasi Mod 10
Chislo(2) = Minuti / 10
Chislo(1) = Minuti Mod 10

If Chasi < 10 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.3 = 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.3 = 0 Then Gosub Alarm
If Pinb.5 = 0 Then Gosub Set_booton
If Pinb.4 = 0 Then Gosub Mode_booton

Bitwait Pinb.3 , 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       ' ïðîâåðÿåì íàäî ëè èãðàòü ìåëîäèþ áóäèëüíèêà
'88888888
   Alarmforever = 1
End If
'88888888
End If
End If
Start Timer1
If Minuti <> Minuti_alarm Then : Stop_alarm = 0 : End If    ' åñëè ñåé÷àñ íå âðåìÿ ðàáîòû áóäèëüíèêà òî âûêëþ÷àåì ôëàã âðåìåííîé îñòàíîâêè áóäèëüíèêà, äëÿ òîãî ÷òîá ÷åðåç ñóòêè áóäèëüíèê ñíîâà çàçâåíåë
'88888888
If Alarmforever = 1 Then
   Gosub Salarm
End If
'88888888
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       ' âêëþ÷àåì / îòêëþ÷àåì áóäèëüíèê (ìîæíî òîëüêî âî âðåìÿ êîãäà áóäèëüíèê íå äîëæåí çâîíèòü)
'88888888
Alarmforever = 0
'88888888
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
'88888888
Salarm:
   Enable Interrupts : Enable Timer0 : Start Timer0 : Stop Timer1
   Waitms 10
    Set Portb.2                                                'ïèùèì
   Waitms 10
   Reset Portb.2
   Waitms 10
    Set Portb.2                                                'ïèùèì
   Waitms 10
   Reset Portb.2
Return
'88888888


по указателю 88888888 мои правки

0

56

Спасибо, но не работает. Будильник срабатывает один раз и все. И перестают работать кнопки.

0

57

Мой вариант проверяли?

0

58

Еще нет. Этот вариант быстрее и проще проверить. Просто скомпиллировал и все. Но за сегодня проверю.

0

59

Andrusha

Если будет время, попробуйте залить вот этот hex. Я его собрал из предложенного мной кода, но своим BASCOM'ом.

Ссылка на файл

0

60

coder в Вашем коде после прошествия одной минуты работы будильника начинают мигать цифры втакт с писком буззера. Что-то с TIMER0 не так.

Yuriy.pv Ваш код в Протеусе работает. На днях проверю в железе, потом отпишусь.
БОЛЬШОЕ ВСЕМ СПАСИБО.

0