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

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

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

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



I2C CLOCK+ALARM

Сообщений 121 страница 150 из 305

121

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

А я на индикатор наклеиваю пленку, для тонирования стекол авто


Аналогично, только использую цветной, прозрачный ракал.

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

0

122

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

А я на индикатор наклеиваю пленку, для тонирования стекол авто.

Для небольших площадей очень неплохой результат получается при использовании "дымчатого" скотча.
Не коричневого, как картонная коробка, а серого.

Можно использовать цветные, благо их сейчас лепят море разных.

+1

123

пытаюсь переписать прошивку так, что бы время выводилось на одну группу индикаторов, а дата\температура на другую. прописал еще 4 порта для анодов, но никак не пойму как выбираются аноды для включения. в подпрограмме Pulse: они просто перебираются по очереди, а как указать что на первые 4 пусть будет дата\температура, а на 5-8 надо выводить время? подскажите, кому не лень

0

124

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

как выбираются аноды для включения. в подпрограмме Pulse: они просто перебираются по очереди, а как указать что на первые 4 пусть будет дата\температура, а на 5-8 надо выводить время? подскажите, кому не лень

Саму программу не листал, но могу предложить разделить п/п Pulse на ххх1 и ххх2.
По сути, сделать две одинаковые п/п, но в одной будут перебираться аноды 1 - 4, а в другой - 5 - 8.

0

125

Nord
я думал этот вариант, но никак не вкурю, откуда она берет данные "что зажигаем"

0

126

Делал в машину вольтметр, термометр, датчик давления масла на одной Mega 8. Используются три трехразрядных семисегментных индикатора. Вот код индикации, ковыряйтесь.

Код

' Индикация

Pulse:
   Stop Timer0
         _print_1 = Channel_1                               '  1й индикатор показывает давление
         _print_2 = Channel_2                               ' 2й индикатор показывает температуру
         _print_3 = Channel_3                               ' 3й индикатор показывает напряжение
      For I = 3 To 1 Step -1                                ' цикл в котором разбивается переменная на 3 числа
          Chislo(i) = _print_1 Mod 10                       ' заносим в масив последнюю цифру от числа Copy_print(123 mod 10 = 3)
          _print_1 = _print_1 / 10                          ' отсекаем последнюю цифру от числа Copy_print (123/10=12)
      Next                                                  ' убираем незначимые нули
         If Channel_1 < 100 Then Chislo(1) = 11             'для 2х значного числа
     If N = 0 Then
     For I = 6 To 4 Step -1                                 ' цикл в котором разбивается переменная на 3 числа
         Chislo(i) = _print_2 Mod 10                        ' Copy_print_sec Mod 10                 ' заносим в масив последнюю цифру от числа _print(123 mod 10 = 3)
         _print_2 = _print_2 / 10                           ' Copy_print_sec = Copy_print_sec / 10              ' отсекаем последнюю цифру от числа Copy_print_sec (123/10=12)
     Next                                                   'убираем незначимые нули
       If Channel_2 < 100 Then Chislo(4) = 11               'для 2х значного числа
        If Channel_2 < 10 Then Chislo(5) = 11               'для однозначного числа
     If Minus_flag = 1 Then Chislo(4) = 10
     If Channel_2 = 0 Then Chislo(4) = 11
    Else
    Chislo(4) = 12 : Chislo(5) = 13 : Chislo(6) = 13
        End If

       For I = 9 To 7 Step -1
         Chislo(i) = _print_3 Mod 10
         _print_3 = _print_3 / 10
         If Channel_3 < 100 Then Chislo(7) = 11
         Next

      Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6 : Reset Dig7 : Reset Dig8 : Reset Dig9       ' Гасим индикаторы перед выводом информации

   Incr W : If W > 9 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 :
            Set Dig1
               H = 1
      Case 2 :
            Set Dig2
               H = 0
      Case 3 :
            Set Dig3
               H = 1
      Case 4 :
            Set Dig4
               H = 1
      Case 5 :
            Set Dig5
               H = 1
      Case 6 :
            Set Dig6
               H = 1
     Case 7 :
            Set Dig7
              H = 1
      Case 8 :
           Set Dig8
             H = 0
      Case 9 :
           Set Dig9
            H = 1
   End Select
   Start Timer0
Return
Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
   Z = Chislo(w) * 7 : Z = Y + Z                            ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 1..2..3, Y это номер сегмента (A=0 B=1 C=2...G=7)
      Z = Lookup(z , Cifri_oa)                              ' выбираем из таблици включить или выключить нужный сегмент   -OA
   Incr Y                                                   'Y это номер сегмента (A=0 B=1 C=2...). Chislo(w) * 7 - переход на начало нужной строки Data.Z = Y + Z - по очереди перебираем сегменты в строке.
Return

Cifri_oa:
' таблица сегментом для индикаторов с общим плюсом      |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 , 0                              '12           "E"
Data 1 , 1 , 1 , 1 , 0 , 1 , 0                              '13           "r"

0

127

Andrusha
ну, попробую. пока понял, что мне нужно два цикла для перебора массива 1-4 и 5-8

0

128

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

Nordя думал этот вариант, но никак не вкурю, откуда она берет данные "что зажигаем"

Надо копать листинг... ;)
Эти данные ("что показываем") формируются в программе.
А уж куда их перенаправить - вот про это я и веду речь.
В зависимости от того, что надо показать и вызываем п/п "что зажигаем".

0

129

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

Надо копать листинг

у меня скорее харакири лопатой получится :)

0

130

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

у меня скорее харакири лопатой получится

С какой страницы темы используется исходник ?
Полистаю на досуге.

Для наводки: начинать копать надо с того места, откуда вызывается п/п Pulse, упомянутая ранее.

0

131

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

0

132

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

начинать копать надо с того места, откуда вызывается п/п Pulse, упомянутая ранее.

она по переполнению таймера всплывает. в явном виде нигде не вызывается.

0

133

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

она по переполнению таймера всплывает. в явном виде нигде не вызывается.

Мозг МК не настолько мудр, чтоб сообразить, что по событию таймера надо вызвать именно эту п/п. ;)
Искать надо строку с событием таймера.

Вот она:

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


Можно в ней указать имя п/п, которая уже будет определять, какие аноды нужно использовать и вызывать соответствующие п/п.

Отредактировано Nord (2017-10-18 20:46:36)

0

134

Nord
ну, таймер останавливается, переменные получают некие значения, потом таймер снова запускается.

0

135

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

с первой. для общего анода.

Тот исходник не рабочий. На первой странице для ОК это рабочий для ОА.

0

136

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

На первой странице для ОК это рабочий для ОА.

ну, да. его и имел ввиду. но костяк программы одинаковый

0

137

sasha_1973

Ссылка, по которой Вы пришли неверная или устаревшая

:(

0

138

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

пытаюсь переписать прошивку так, что бы время выводилось на одну группу индикаторов, а дата\температура на другую. прописал еще 4 порта для анодов, но никак не пойму как выбираются аноды для включения. в подпрограмме Pulse: они просто перебираются по очереди, а как указать что на первые 4 пусть будет дата\температура, а на 5-8 надо выводить время? подскажите, кому не лень


Посмотрите здесь или здесь может, что и пригодится.

_http://bascomavr.ru/viewtopic.php?id=1127_

_http://bascomavr.3bb.ru/viewtopic.php?id=1127_

0

139

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

ну, таймер останавливается, переменные получают некие значения, потом таймер снова запускается.

Таймер просто молодец ! ;)

Выберу время, полистаю поглубже.

0

140

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

Таймер просто молодец !

а то!

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


т.е. как мне видится, все это работает так:
есть циклы времени и других режимов. в каждом останавливается таймер и переменные получают некие значения. потом таймер запускается и по идее наверное должен вызывать свою подпрограмму индикации, иначе как?

0

141

так. пол-дела сделано, осталось уговорить Рокфеллера.
в смысле - температуру вынес на второй индикатор, осталось тудой же дату поместить

0

142

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

так. пол-дела сделано

Запасаемся попкорном и ждем отчета о путях/направлениях решения задачи... ;)

0

143

вторую половину сделал. осталась третья....

0

144

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

вторую половину сделал. осталась третья....

Попкорн вовремя... ;)
"Третья половина"...  o.O :)

0

145

Nord
есть еще четвертая и пятая, но это потом ;)
в смысле - в протеусе вроде зажужжало, но надо проверить в железе, навести красоту и задокументировать :)

+1

146

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

Nordесть еще четвертая и пятая, но это потом в смысле - в протеусе вроде зажужжало, но надо проверить в железе, навести красоту и задокументировать

Ждемс...  :cool:

0

147

пока так:

код

'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

$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 Pinc.6 = Input                                       ': PortC.6 = 1
Config Portb = Output : Config Portd = Output : Config Portc.0 = Output : Config Portc.1 = Output : Config Portc.2 = Output : Config Portc.3 = Output       ' конфигурируем порты на выход к которым подключен семисегментник                                       ' ‘
Config 1wire = Portb.6                                      ' на эту ножку подключим 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
Dim Weekday As Byte , Clock_flag As Byte , 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
Dim Mode_flag As Byte , View_menu As Byte , Nosave_time As Byte       ' задаем переменные
Dim T1 As Integer , T2 As Integer , Byte0 As Byte , Byte1 As Byte

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 : Dig5 Alias Portc.0 : : Dig6 Alias Portc.1 : Dig7 Alias Portc.2 : Dig8 Alias Portc.3       ' тут вписываем порты к которым подключены общие провода каждой цифры

For X = 1 To 8                                              ' присваиваем всем цифрам пустоту, чтоб в момент включения не высвечивались ноли
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
If View_menu > 3 Then Exit For
Clock_flag = 1
Gosub Getdatetime
Stop Timer0
Viv_peremennaya = Chasi * 100
Viv_peremennaya = Viv_peremennaya + Minuti
Start Timer0
Migalka = Secundi Mod 2
If Migalka <> 0 Then
Portb.7 = 1
Else
Portb.7 = 0
End If
Waitms 80
Next
'*******************************************************************************

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

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

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
' эти условие и цикл выводят только время на свой индикатор (цифры 5-8)
If Clock_flag = 1 Then
For I = 5 To 8                                              ' цикл в котором разбивается переменная на отдельные числа от 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
End If
' эти условие и цикл выводят дату на второй  индикатор (цифры 1-4)
If Clock_flag = 2 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 : Reset Dig5 : Reset Dig6 : Reset Dig7 : Reset Dig8
Incr W : If W > 8 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
Case 5 :
Set Dig5
Case 6 :
Set Dig6
Case 7 :
Set Dig7
Case 8 :
Set Dig8
End Select

Start Timer0                                                ' запускаем таймер0
Return                                                      ' возвращаемся к выполнению основной программы

Look:                                                       ' подпрограмма которая определяет нужно ли сейчас гореть сегменту, который вызвал эту подпрограмму
Z = Chislo(w) * 7 : Z = Y + Z                               ' определяем порядковый номер числа из таблици DATA. W - это цифра которую будем выводить 0..1..2..3.......9, Y это номер сегмента (A=0 B=1 C=2...G=7)
Z = Lookup(z , Cifri)                                       ' выбираем из таблици включить или выключить нужный сегмент
Incr Y                                                      'Y это номер сегмента (A=0 B=1 C=2...)

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

Cifri:
' таблица сегментом для семисегментников с общим плюсом      |Chislo(i)| Символ |
Data 0 , 0 , 0 , 0 , 0 , 0 , 1                              '0
Data 1 , 0 , 0 , 1 , 1 , 1 , 1                              '1
Data 0 , 0 , 1 , 0 , 0 , 1 , 0                              '2
Data 0 , 0 , 0 , 0 , 1 , 1 , 0                              '3
Data 1 , 0 , 0 , 1 , 1 , 0 , 0                              '4
Data 0 , 1 , 0 , 0 , 1 , 0 , 0                              '5
Data 0 , 1 , 0 , 0 , 0 , 0 , 0                              '6
Data 0 , 0 , 0 , 1 , 1 , 1 , 1                              '7
Data 0 , 0 , 0 , 0 , 0 , 0 , 0                              '8
Data 0 , 0 , 0 , 0 , 1 , 0 , 0                              '9
Data 1 , 1 , 1 , 1 , 1 , 1 , 0                              '10           "-"
Data 1 , 1 , 1 , 1 , 1 , 1 , 1                              '11           ""
Data 0 , 1 , 1 , 0 , 0 , 0 , 1                              '12           "C"
Data 0 , 0 , 1 , 1 , 0 , 0 , 0                              '13           "P"
Data 1 , 1 , 1 , 0 , 0 , 0 , 0                              '14           "t"

'*******************************************************************************

'*****************************Работа с кнопками*********************************
Bootons:

Stop Timer1

If Pinb.5 = 0 Then Gosub Set_booton

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

Start Timer1

Return

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

Clock_flag = 0

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

  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

Set_flag = 0                                                ' флаг окончания настройки
Bitwait Pinb.5 , Set
Start Timer1
Goto Times:                                                 ' переход к отображению времени

Return

а файл тут напрямую никак не прикрепить? только через файлообменники?

0

148

все, в железе тоже работает. единственно - на основном индикаторе (цифры 5-8) периодически вполнакала мигают выключенные сегменты. а включенные сегменты просто мерцают. попробовать частоту таймера увеличить?

0

149

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

единственно - на основном индикаторе (цифры 5-8) периодически вполнакала мигают выключенные сегменты. а включенные сегменты просто мерцают. попробовать частоту таймера увеличить?

Может попробовать ввести задержки ?
Видимо, где-то вкл/откл пересекаются по времени.

0

150

Nord
да вот да. оно работает-работает, потом некоторое время мерцает, потом снова работает-работает, потом снова мерцает. понять бы, где пересекаются и кто... задержки в программе есть, 80, 1800 и 700мс. эмпирически подбирать - нет гарантии, что не вылезет через час или два. а как рассчитать - я не знаю. если есть время - гляньте код, он стал чуточку короче чем исходный

0