BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение max50 »

Bear2011 писал(а):Может кто подскажет примеры?
Держи.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Реклама
Аватара пользователя
Bear2011
Друг Кота
Сообщения: 13253
Зарегистрирован: Ср апр 06, 2011 09:58:13
Откуда: Кузбасс

Re: BASCOM AVR в вопросах и ответах

Сообщение Bear2011 »

max50

Спасибо :beer:
Реклама
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение max50 »

Не вопрос.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

Парни, ломаю голову видимо над простой задачей. Пишу прогу под бортовой комп с функцие спидометра, расходомера и прочее.
Так вот, хочу чтобы борткомп выводил показания средней скрости за всю поездку. Как это организовать? Получил я реальную скорость, что потом с ней делать? Понимаю что устреднять? но как? Вводить переменную которая увеличивается при каждом измерении и сумировать скорость, потом делить на значние этой переменной и заносить в память через определенне промежутки времени? Может кто примерчик подскажет, я новичек просто.
Реклама
Эиком - электронные компоненты и радиодетали
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение pavel1979 »

а какой датчик на спидометре?как считается скорость?
Реклама
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

скорость считыватеся датчиком холла на корбке-прямоугольные импульсы. 6имп-1метр пути. Но это не суть, будем считать что скорость я получил. Также будем считать, что поездка заканчивается по выключению зажигания, т.е. средняя скорость должна сохранятся либо в этот момент, либо периодически записываться в еепром. По выключению, устнавливаю прерывание по компоратору, оно и записывает в момент пропадания питания. Но все же со средней скростью пока не понятно.
Реклама
Аватара пользователя
Bear2011
Друг Кота
Сообщения: 13253
Зарегистрирован: Ср апр 06, 2011 09:58:13
Откуда: Кузбасс

Re: BASCOM AVR в вопросах и ответах

Сообщение Bear2011 »

Так средняя скорость - это расстояние/время (физика 5-6 класс) :)) Делай счетчик пройденного расстояния и часы. И наверное еще дополнительную кнопку обнуления. Ну и само собой кнопку вычисления этой скорости, хотя возможно получиться сделать - завел двигатель, счетчик обнулился и пошел отсчет времени и пройденного расстояния. Заглушил двигатель - просчитал среднюю скорость
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

вот только как отсчитывать время? оба таймера заняты, один считает скорость, другйо моментальный расход топлива.
Есть еще варианты отсчета времени. Может задать переменную, и увеличивать ее на 1 какждый такт? Только как как ее привязать к реальному времени?
Аватара пользователя
Bear2011
Друг Кота
Сообщения: 13253
Зарегистрирован: Ср апр 06, 2011 09:58:13
Откуда: Кузбасс

Re: BASCOM AVR в вопросах и ответах

Сообщение Bear2011 »

Может в таком случае имеет смысл "прикошачить" м/с часов? Запустил двигатель - считал показания часов и записал в регистр или переменную. Заглушил - снова считал вычислил разницу
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

Да закупил пару модулей часов реального времени, надо будет с ними еще научится работать. Может что и получится
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Думается мне, вариант с RTC самый оптимальный. В любом случае бортовик должен иметь часы, с этими данными можно делать всякие полезные штуки. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

Ну ещё как вариант-
Вы какую-то переменную "скорость" на индикатор выводите-ж. Вот её и складывайте , а потом делите.
Каждый раз как выводите на индикатор, складывайте, увеличивайте счётчик, Досчитали до 255, поделили всё результат в другую переменную. Ту в свою очередь тоже складываем и считаем. Трёх переменных за глаза.
А сохранять автоматом,- если скорость три (к примеру) вывода на экран была "0". На ходу -же зажигание не выключаете!
Все делают ошибки, только мудрецы - новые, а дураки - старые.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение pavel1979 »

я так понимаю расчет скорости идет от таймера,то есть через определенные промежутки времени,пусть будет например 4 сек-сколько она у вас?
добавляем две переменные-допустим S и N,каждый раз когда протикал таймер и идет расчет скорости-добавляем полученную скорость к переменной S,N увеличиваем на единицу,в итоге в переменной S будет сумма замеренных скоростей,а N-количество прибавленных скоростей к переменной S,в любой момент можно отбразить среднюю скорость равная среднеарифметической,то есть S/N
и доб таймер не нужен
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение pavel1979 »

есть ли у кого пример работы с MRF49?в гугле ничего на русском нет!
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

Спасибо! по средней скорости разобрался.
Теперь засада с часами реального времени. Посомотрите пожалуйста мою программу, очень надо. Программу доработал чтобы часы неправильные цифры не выводили и происходит в протеусе какой-то глюк, на экране какие-то цифры несвязные вылазят рядом с отображением времени, часы обнуляются. Посомтрите может опытным глазом что заметите Только дайте им пару минут посчитать, а то сразу вроде все в норме.. Спасибо. Проект прилагаю.
Вложения
расходомер.rar
(52.54 КБ) 181 скачивание
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение max50 »

pavel1979 писал(а):есть ли у кого пример работы с MRF49?
http://www.mcselec.com/index2.php?optio ... ght=rfm12b
http://avrproject.ru/forum/5-279-1
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение pavel1979 »

max50 спасибо,мне помогло,написал простую программу-вроде импульсы идут как надо,все в архиве,буду тестить в железе
Вложения
вроде раб.rar
(53.66 КБ) 165 скачиваний
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение max50 »

Не за что.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
pavel1979
Мучитель микросхем
Сообщения: 494
Зарегистрирован: Пн авг 12, 2013 19:07:47
Откуда: башкирия мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение pavel1979 »

вот еще нашел http://www.roggenbuck.de/DS1820.html более детально и легче понять
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

Re: BASCOM AVR в вопросах и ответах

Сообщение max50 »

Dnepr_1186 писал(а):Теперь засада с часами реального времени.
На мой взгляд не очень правильно организованна работа с DS1307. Посмотрите мой исходник, может что-нибудь пригодится:
Спойлер

Код: Выделить всё

$regfile = "m32def.dat"                                     'подключаем файл заголовков для контроллера ATmega32
$crystal = 8000000                                          'определяем частоту кварца/внутреннего генератора
$baud = 9600                                                'настройка скорости UART
$hwstack = 64                                               'аппаратный стек
$swstack = 64                                               'програмный стек
$framesize = 200                                            'размер фрейма

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

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1

Cursor Off                                                  'выключить курсор
Cls                                                         'очистить дисплей

Config Rc5 = Pinb.0                                         'на пин b0 подключен TSOP1736

Config Sda = Portb.1                                        'на пин b1 подключена линия Sda
Config Scl = Portb.2                                        'на пин b2 подключена линия Scl

Config Pinb.3 = Output                                      'настройка пина b3 на выход
Mute Alias Portb.3                                          'присваиваем пину b3 имя Mute

Config Pinb.4 = Output                                      'настройка пина b4 на выход
Power_amp Alias Portb.4                                     'присваиваем пину b4 имя Power_amp

Config Pinb.5 = Output                                      'настройка пина b5 на выход
Fan Alias Portb.5                                           'присваиваем пину b5 имя Fan

Config Pinb.6 = Output                                      'настройка пина b6 на выход
Red_led Alias Portb.6                                       'присваиваем пину b6 имя Red_led

Config Pinb.7 = Output                                      'настройка пина b7 на выход
Green_led Alias Portb.7                                     'присваиваем пину b7 имя Green_led

Config Pinc.6 = Output                                      'настройка пина c6 на выход
Yellow_led Alias Portc.6                                    'присваиваем пину c6 имя Yellow_led

Config 1wire = Portc.7                                      'на пин c7 подключен DS18B20

Config Pind.0 = Input                                       'настройка пина d0 на вход
Choice_mode Alias Pind.0                                    'присваиваем пину d0 имя Choice_mode
Set Portd.0                                                 'включить внутренний подтягивающий резистор

Config Pind.1 = Input                                       'настройка пина d1 на вход
Power_on_off Alias Pind.1                                   'присваиваем пину d1 имя Power_on_off
Set Portd.1                                                 'включить внутренний подтягивающий резистор

Config Pind.2 = Input                                       'настройка пина d2 на вход
Sw Alias Pind.2                                             'присваиваем пину d2 имя Sw
Set Portd.2                                                 'включить внутренний подтягивающий резистор

Config Pind.3 = Input                                       'настройка пина d3 на вход(вывод A энкодера)
Valcod_a Alias Pind.3                                       'присваиваем пину d3 имя Valcod_a
Set Portd.3                                                 'включить внутренний подтягивающий резистор
Config Pind.4 = Input                                       'настройка пина d4 на вход(вывод B энкодера)
Valcod_b Alias Pind.4                                       'присваиваем пину d4 имя Valcod_b
Set Portd.4                                                 'включить внутренний подтягивающий резистор                                                '

Config Pind.6 = Input                                       'настройка пина d6 на вход
Mute_on_off Alias Pind.6                                    'присваиваем пину d6 имя Mute_on_off
Set Portd.6                                                 'включить внутренний подтягивающий резистор

Config Pind.7 = Input                                       'настройка пина d7 на вход
Inputss Alias Pind.7                                        'присваиваем пину d7 имя Inputss
Set Portd.7                                                 'включить внутренний подтягивающий резистор

Config Int1 = Falling                                       'настраиваем внешнее прерывание INT1 на срабатывание при изменении из "1" в "0"
On Int1 Valcoder                                            'подпрограмма обработки прерывания Valcoder
Enable Int1                                                 'разрешаем работу прерывания  INT1
Enable Interrupts                                           'разрешаем глобальные прерывания

Config Clock = User                                         'работа с DS1307
Const Ds1307w = &HD0                                        'константа адреса  записи DS1307
Const Ds1307r = &HD1                                        'константа адреса  чтения DS1307
Config Date = Dmy , Separator = .                           'настраиваем способ отображения даты ДДММГГ, разделитель точка

Declare Sub Timbre_disp                                     'подпрограмма вывода значений тембра НЧ и ВЧ на дисплей
Declare Sub Balance                                         'подпрограмма расчета баланса
Declare Sub Vol_disp                                        'подпрограмма перевода цифровых значений громкости в dB
Declare Sub Convertt                                        'подпрограмма преобразования температуры датчика на шине 1wire
'Declare Sub Standby                                         'подпрограмма режима ожидания усилителя
Declare Sub Power_on                                        'подпрограмма основного режима работы усилителя
Declare Sub Setdatetime                                     'подпрограмма установки даты и времени
Declare Sub Month_disp                                      'подпрограмма перевода цифровых значений месяца в названия месяца

Dim Lsb As Byte                                             'переменная младшего байта DS18B20
Dim Msb As Byte                                             'переменная старшего байта DS18B20
Dim Temp As Byte                                            'переменная температуры
Dim Temp1 As Byte                                           'временная переменная для вычесления температуры
Dim Address As Byte                                         'переменная адреса Rc5
Dim Command As Byte                                         'переменная команды Rc5
Dim Vol As Byte                                             'переменная громкости
Dim Voll As Byte                                            'переменная громкости левого канала
Dim Volr As Byte                                            'переменная громкости правого канала
Dim Vol_disp As String * 5                                  'переменная громкости, выводимая на дисплей
Dim Bal As Byte                                             'переменная баланса
Dim Treble As Byte                                          'переменная тембра ВЧ
'Dim Treble_disp As String * 5                               'переменная тембра ВЧ, выводимая на дисплей
Dim Bass As Byte                                            'переменная тембра НЧ
'Dim Bass_disp As String * 5                                 'переменная тембра НЧ, выводимая на дисплей
Dim Inputs As Byte                                          'переменная номера входа TDA8425
Dim Subaddr As Byte                                         'переменная субадреса TDA8425
Dim Datas As Byte                                           'переменная данных TDA8425
Dim Swfunc As Byte                                          'переменная переключения функций TDA8425
Dim Chr_code As Byte                                        'переменная некоторых символов, хранящихся в памяти ЖКИ
Dim Menu As Byte                                            'переменная меню для энкодера
Dim Timbre As Byte                                          'переменная тембра
Dim Timbre_disp As String * 5                               'переменная тембра, выводимая на дисплей
Dim Choice_timbre As Bit                                    'переменная выбора тембра ВЧ или НЧ
Dim Z As Byte                                               'переменная знакоместа
Dim Mode_disp As String * 7                                 'переменная выбора звучания TDA8425, выводимая на дисплей
Dim Daysmonth As Byte                                       'переменная дней в месяце
Dim Month_disp As String * 8                                'переменная месяца, выводимая на дисплей
Dim Weekday_disp As String * 7                              'переменная дня недели, выводимая на дисплей
Dim Weekday_read As Byte                                    'переменная номера дня недели, считываемая из DS1307
Dim Weekday As Byte                                         'переменная номера дня недели
Dim Press_rc5 As Bit

Deflcdchar 0 , 31 , 31 , 31 , 17 , 31 , 31 , 31 , 31        'инверсный минус
Deflcdchar 1 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 31        'пустое деление шкалы
Deflcdchar 2 , 31 , 19 , 21 , 21 , 19 , 21 , 21 , 31        'инверсная буква R
Deflcdchar 3 , 31 , 23 , 23 , 23 , 23 , 23 , 17 , 31        'инверсная буква L
Deflcdchar 4 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        'знак градусов
Deflcdchar 5 , 32 , 2 , 6 , 26 , 18 , 26 , 6 , 2            'динамик
Deflcdchar 6 , 31 , 32 , 31 , 31 , 31 , 31 , 32 , 31        'полное деление шкалы
Deflcdchar 7 , 31 , 31 , 27 , 17 , 27 , 31 , 31 , 31        'инверсный плюс

Readeeprom Swfunc , 1
If Swfunc = 255 Then
Swfunc = 206
Writeeeprom Swfunc , 1
End If
Subaddr = 8
Datas = Swfunc
Gosub I2c

Readeeprom Vol , 2
If Vol = 255 Then
Vol = 222
Writeeeprom Vol , 2
End If
Subaddr = 0
Datas = Vol
Gosub I2c
Subaddr = 1
Datas = Vol
Gosub I2c

Readeeprom Bal , 3
If Bal = 255 Then
Bal = 4
Writeeeprom Bal , 3
Call Balance
End If

Readeeprom Bass , 4
If Bass = 255 Then
Bass = 246
Writeeeprom Bass , 5
End If
Subaddr = 2
Datas = 0
Gosub I2c

Readeeprom Treble , 5
If Treble = 255 Then
Treble = 246
Writeeeprom Treble , 4
End If
Subaddr = 3
Datas = Treble
Gosub I2c

Pwm1a = 40

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Standby:                                                    'подпрограмма режима ожидания усилителя
'*******************************************************************************
Cls                                                         'очищаем экран ЖКИ

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Do                                                          'начало основного цикла

Call Month_disp                                             'вызываем подпрограмму перевода цифровых значений месяца в названия месяца

Locate 1 , 1                                                'задаем позицию курсора
Lcd Time$                                                   'выводим на ЖКИ время, вызывая подпрограмму чтения времени из DS1307
Locate 2 , 1                                                'задаем позицию курсора
Lcd _day ; " " ; Month_disp                                 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then                                          'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; "    "                                 'выводим на ЖКИ, пробел, 200, значение переменной _year, 4 пробела
Else                                                        'иначе
Lcd " 20" ; _year ; "    "                                  'выводим на ЖКИ, пробел, 20, значение переменной _year, 4 пробела
End If                                                      'конец если

Weekday_read = Dayofweek()                                  'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays)           'преобразовываем номер дня недели в название дня недели
Locate 1 , 10                                               'задаем позицию курсора
Lcd Weekday_disp                                            'выводим на ЖКИ значение переменной Weekday_disp

Gosub Rc5                                                   'переход на подпрограмму опроса Rc5

If Power_on_off = 0 Or Command = 12 Then                    'если Power_on_off = 0 или Command = 12, то
Waitms 100                                                  'подождать 100 мс
Set Power_amp                                               'включить питание усилителя
Call Power_on                                               'идти на подпрограмму основного режима работы усилителя
End If                                                      'конец если

If Command = 15 Then Pwm1a = 210 Else Pwm1a = 40

If Sw = 0 Then                                              'если Sw = 0, то
Waitms 100                                                  'подождать 100 мс
Call Setdatetime                                            'идти на подпрограмму установки даты и времени
End If                                                      'конец если

If Swfunc.5 = 1 Then                                        'если бит 5 Swfunc = 1, то
Reset Mute                                                  'выключить режим Mute
Swfunc.5 = Not Swfunc.5                                     'значение бита 5 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

Loop                                                        'конец основного цикла

End                                                         'конец программы

Sub Setdatetime                                             'подпрограмма установки даты и времени
'*******************************************************************************
Menu = 0

Pwm1a = 200

Set Red_led                                                 'включаем красный светодиод питания

Reset Green_led                                             'выключаем зеленый светодиод питания

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Month_disp                                             'вызываем подпрограмму перевода цифровых значений месяца в названия месяца

Locate 1 , 1                                                'задаем позицию курсора
If _hour < 10 Then                                          'если значение переменной _hour < 10 то,
Lcd "0" ; _hour ; ":"                                       'выводим на ЖКИ 0, значение переменной _hour, двоеточие
Else                                                        'иначе
Lcd _hour ; ":"                                             'выводим на ЖКИ значение переменной _hour, двоеточие
End If                                                      'конец если
If _min < 10 Then                                           'если значение переменной _min < 10 то,
Lcd "0" ; _min ; ":"                                        'выводим на ЖКИ 0, значение переменной _min, двоеточие
Else                                                        'иначе
Lcd _min ; ":"                                              'выводим на ЖКИ значение переменной _min, двоеточие
End If                                                      'конец если
Lcd "00"                                                    'выводим на ЖКИ 00
Locate 2 , 1                                                'задаем позицию курсора
Lcd _day ; " " ; Month_disp                                 'выводим на ЖКИ значение переменной _day, пробел, значение переменной Month_disp
If _year < 10 Then                                          'если значение переменной _year < 10 то,
Lcd " 200" ; _year ; "    "                                 'выводим на ЖКИ пробел, 200, значение переменной _year, 4 пробела
Else                                                        'иначе
Lcd " 20" ; _year ; "    "                                  'выводим на ЖКИ пробел, 20, значение переменной _year, 4 пробела
End If                                                      'конец если

Weekday_read = Dayofweek()                                  'считываем номер дня недели из DS1307
Weekday_disp = Lookupstr(weekday_read , Weekdays)           'преобразовываем номер дня недели в название дня недели
Locate 1 , 10                                               'задаем позицию курсора
Lcd Weekday_disp                                            'выводим на ЖКИ значение переменной Weekday_disp

If Sw = 0 Then                                              'если Sw = 0, то
Waitms 100                                                  'подождать 100 мс
Incr Menu                                                   'увеличить значение переменной Menu на 1
End If                                                      'конец если

If Menu = 6 Then                                            'если значение переменной Menu = 6, то
Gosub Standby                                               'идти на подпрограмму режима ожидания усилителя
End If                                                      'конец если

Loop                                                        'конец основного цикла

End Sub                                                     'конец подпрограммы

Sub Power_on                                                'подпрограмма основного режима работы усилителя
'*******************************************************************************
Menu = 7

Pwm1a = 200

Reset Red_led                                               'выключаем красный светодиод питания

Set Green_led                                               'включаем зеленый светодиод питания

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Convertt                                               'переход на подпрограмму преобразования температуры

Call Vol_disp                                               'переход на подпрограмму перевода цифровых значений громкости в dB

Call Balance                                                'переход на подпрограмму расчета баланса

If Temp => 38 Then                                          'если значение переменной Temp => 38, то
Set Fan                                                     'включить вентилятор охлаждения
Elseif Temp = 31 Then                                       'иначе если значение переменной Temp = 31, то
Reset Fan                                                   'выключить вентилятор охлаждения
End If                                                      'конец если

Locate 2 , 11                                               'задаем позицию курсора
Lcd "T=" ; Temp ; Chr(4) ; "C "                             'выводим на ЖКИ T=, значение переменной Temp, знак градусов, C, пробел

Locate 1 , 1                                                'задаем позицию курсора
Lcd "Bx."                                                   'выводим на ЖКИ Вх.

Locate 2 , 1                                                'задаем позицию курсора
Lcd "Ўp."                                                   'выводим на ЖКИ Гр.

Locate 2 , 5                                                'задаем позицию курсора
Lcd Vol_disp                                                'выводим на ЖКИ значение переменной Vol_disp

Select Case Swfunc                                          'выбираем из значений переменной Swfunc
Case 206 : Inputs = 1                                       'если значение переменной Swfunc = 206, то Inputs = 1(вход 1)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук включен
Case 207 : Inputs = 2                                       'если значение переменной Swfunc = 207, то Inputs = 2(вход 2)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук включен
Case 222 : Inputs = 1                                       'если значение переменной Swfunc = 222, то Inputs = 1(вход 1)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук включен
Case 223 : Inputs = 2                                       'если значение переменной Swfunc = 223, то Inputs = 2(вход 2)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук включен
Case 238 : Inputs = 1                                       'если значение переменной Swfunc = 238, то Inputs = 1(вход 1)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук выключен
Case 239 : Inputs = 2                                       'если значение переменной Swfunc = 239, то Inputs = 2(вход 2)
Mode_disp = "Cїepeo "                                       'Mode_disp = Стерео(режим стерео), звук выключен
Case 254 : Inputs = 1                                       'если значение переменной Swfunc = 254, то Inputs = 1(вход 1)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук выключен
Case 255 : Inputs = 2                                       'если значение переменной Swfunc = 255, то Inputs = 2(вход 2)
Mode_disp = "окружение"                                     'Mode_disp = Пр. ст.(режим пространственное стерео), звук выключен
End Select                                                  'закончить выбор

Locate 1 , 5                                                'задаем позицию курсора
Lcd Inputs                                                  'выводим на ЖКИ значение переменной Inputs

Locate 1 , 7                                                'задаем позицию курсора
Lcd Mode_disp                                               'выводим на ЖКИ значение переменной Mode_disp

If Inputss = 0 Then                                         'если Inputss = 0 , то
Waitms 100                                                  'подождать 100 мс
Swfunc.0 = Not Swfunc.0                                     'значение бита 0 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

If Swfunc.5 = 1 Then                                        'если бит 5 Swfunc = 1, то
Waitms 100                                                  'подождать 100 мс
Locate 1 , 15                                               'задаем позицию курсора
Lcd Chr(5) ; "x"                                            'выводим на ЖКИ символ динамика, x
Set Mute                                                    'включить режим Mute
Else                                                        'иначе
Locate 1 , 15                                               'задаем позицию курсора
Lcd "  "                                                    'выводим на ЖКИ 2 пробела
Reset Mute                                                  'выключить режим Mute
End If                                                      'конец если

If Choice_mode = 0 Then                                     'если Inputss = 0 , то
Waitms 100                                                  'подождать 100 мс
Swfunc.4 = Not Swfunc.4                                     'значение бита 4 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

Gosub Rc5                                                   'переход на подпрограмму опроса Rc5

If Mute_on_off = 0 Or Command = 13 Then                     'если Mute_on_off = 0 или Command = 13, то
Waitms 100                                                  'подождать 100 мс
Swfunc.5 = Not Swfunc.5                                     'значение бита 5 Swfunc изменить на противоположное
Subaddr = 8
Datas = Swfunc
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425
Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM
End If                                                      'конец если

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Volume                                                'идти на подпрограмму
End If                                                      'конец если

If Power_on_off = 0 Or Command = 12 Then                    'если Power_on_off = 0 или Command = 12, то
Waitms 100                                                  'подождать 100 мс
Reset Fan                                                   'выключить вентилятор охлаждения
Reset Power_amp                                             'включить питание усилителя
Gosub Standby                                               'идти на подпрограмму режима ожидания усилителя
Cls                                                         'очищаем экран ЖКИ
End If                                                      'конец если

If Command = 32 Then                                        'если Command = 32
If Vol < 255 Then Incr Vol                                  'и если значение переменной Vol < 255, то увеличить значение переменной Vol на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Vol > 220 Then Decr Vol                                  'и если значение переменной Vol > 220, то уменьшить значение переменной Vol на 1
End If                                                      'конец если

Loop                                                        'конец основного цикла

End Sub                                                     'конец подпрограммы

Volume:
'*******************************************************************************
Menu = 8

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Locate 1 , 1                                                'задаем позицию курсора
Lcd "ЎpoјєocїД"                                             'выводим на ЖКИ надпись Громкость
Locate 1 , 12                                               'задаем позицию курсора
Lcd Vol_disp                                                'выводим на ЖКИ значение переменной Vol_disp

Locate 2 , 2                                                'задаем позицию курсора
Lcd Chr(0)                                                  'выводим на ЖКИ инверсный минус
Locate 2 , 15                                               'задаем позицию курсора
Lcd Chr(7)                                                  'выводим на ЖКИ инверсный плюс

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Vol < 255 Then Incr Vol                                  'и если значение переменной Vol < 255, то увеличить значение переменной Vol на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Vol > 220 Then Decr Vol                                  'и если значение переменной Vol > 220, то уменьшить значение переменной Vol на 1
End If                                                      'конец если

Call Vol_disp                                               'переход на подпрограмму перевода цифровых значений громкости в dB

Call Balance                                                'переход на подпрограмму расчета баланса

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Balance_disp                                          'идти на подпрограмму вывода шкалы баланса
End If                                                      'конец если

Select Case Vol                                             'выбираем из значений переменной Vol, выводим на ЖКИ шкалу громкости
Case 220 : Locate 2 , 3
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 221 To 223 : Locate 2 , 3
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 224 To 226 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 227 To 229 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 230 To 232 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 233 To 235 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 236 To 238 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 239 To 241 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 242 To 244 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 245 To 247 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1)
Case 248 To 250 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1)
Case 251 To 253 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1)
Case 254 To 255 : Locate 2 , 3
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
End Select                                                  'закончить выбор

Loop                                                        'конец основного цикла

Sub Vol_disp                                                'подпрограмма перевода цифровых значений громкости в dB
'*******************************************************************************
Select Case Vol                                             'выбираем из значений переменной Vol, переводим в dB
Case 220 : Vol_disp = "-64dB"
Case 221 : Vol_disp = "-62dB"
Case 222 : Vol_disp = "-60dB"
Case 223 : Vol_disp = "-58dB"
Case 224 : Vol_disp = "-56dB"
Case 225 : Vol_disp = "-54dB"
Case 226 : Vol_disp = "-52dB"
Case 227 : Vol_disp = "-50dB"
Case 228 : Vol_disp = "-48dB"
Case 229 : Vol_disp = "-46dB"
Case 230 : Vol_disp = "-44dB"
Case 231 : Vol_disp = "-42dB"
Case 232 : Vol_disp = "-40dB"
Case 233 : Vol_disp = "-38dB"
Case 234 : Vol_disp = "-36dB"
Case 235 : Vol_disp = "-34dB"
Case 236 : Vol_disp = "-32dB"
Case 237 : Vol_disp = "-30dB"
Case 238 : Vol_disp = "-28dB"
Case 239 : Vol_disp = "-26dB"
Case 240 : Vol_disp = "-24dB"
Case 241 : Vol_disp = "-22dB"
Case 242 : Vol_disp = "-20dB"
Case 243 : Vol_disp = "-18dB"
Case 244 : Vol_disp = "-16dB"
Case 245 : Vol_disp = "-14dB"
Case 246 : Vol_disp = "-12dB"
Case 247 : Vol_disp = "-10dB"
Case 248 : Vol_disp = " -8dB"
Case 249 : Vol_disp = " -6dB"
Case 250 : Vol_disp = " -4dB"
Case 252 : Vol_disp = "  0dB"
Case 253 : Vol_disp = " +2dB"
Case 254 : Vol_disp = " +4dB"
Case 255 : Vol_disp = " +6dB"
End Select                                                  'закончить выбор

End Sub                                                     'конец подпрограммы

Balance_disp:                                               'подпрограмма вывода шкалы баланса
'*******************************************************************************
Menu = 9

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Locate 1 , 1                                                'задаем позицию курсора
Lcd " a»aЅc"                                                'выводим на ЖКИ надпись Баланс
Locate 1 , 12
Lcd Bal

Locate 2 , 3                                                'задаем позицию курсора
Lcd Chr(3)                                                  'выводим на ЖКИ инверсную букву L
Locate 2 , 14                                               'задаем позицию курсора
Lcd Chr(2)                                                  'выводим на ЖКИ инверсную букву R

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Bal < 8 Then Incr Bal                                    'и если значение переменной Bal < 8 , то увеличить значение переменной Bal на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Bal > 0 Then Decr Bal                                    'и если значение переменной Bal > 0, то уменьшить значение переменной Bal на 1
End If                                                      'конец если

Call Balance                                                'переход на подпрограмму расчета баланса

Select Case Bal                                             'выбираем из значений переменной Bal, выводим на ЖКИ шкалу баланса
Case 0 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)
Case 1 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(6)
Case 2 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(1) ; Chr(6) ; Chr(6)
Case 3 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(1) ; Chr(6) ; Chr(6) ; Chr(6)
Case 4 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 5 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 6 : Locate 2 , 4
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 7 : Locate 2 , 4
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
Case 8 : Locate 2 , 4
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(200) ; Chr(201) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)
End Select                                                  'закончить выбор

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Treble                                                'идти на подпрограмму
End If                                                      'конец если

Loop                                                        'конец основного цикла

Treble:
'*******************************************************************************
Menu = 10

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Timbre_disp                                            'переход на подпрограмму вывода значений тембра НЧ и ВЧ на дисплей

Set Choice_timbre                                           'выставляем битовую переменную Choice_timbre

Locate 1 , 1                                                'задаем позицию курсора
Lcd "TeјІp B«"                                              'выводим на ЖКИ надпись Тембр ВЧ

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then                                        'если Command = 32
If Treble < 250 Then Incr Treble                            'и если значение переменной Treble < 250 , то увеличить значение переменной Treble на 1
End If                                                      'конец если

If Command = 33 Then                                        'если Command = 33
If Treble > 242 Then Decr Treble                            'и если значение переменной Treble > 242, то уменьшить значение переменной Treble на 1
End If                                                      'конец если

Subaddr = 3
Datas = Treble
Gosub I2c                                                   'идти на подпрограмму записи значений в TDA8425

Gosub Writerom                                              'идти на подпрограмму записи значений в EEPROM

If Sw = 0 Or Command = 59 Then                              'если Sw = 0 или Command = 59, то
Waitms 100                                                  'подождать 100 мс
Gosub Bass                                                  'идти на подпрограмму
End If

Loop                                                        'конец основного цикла

Bass:
'*******************************************************************************
Menu = 11

Cls                                                         'очищаем экран ЖКИ

Do                                                          'начало основного цикла

Call Timbre_disp                                            'переход на подпрограмму вывода значений тембра НЧ и ВЧ на дисплей

Reset Choice_timbre                                         'сбрасываем битовую переменную Choice_timbre

Locate 1 , 1                                                'задаем позицию курсора
Lcd "TeјІp H«"                                              'выводим на ЖКИ надпись Тембр НЧ

Gosub Rc5                                                   'перехоод на подпрограмму опроса RC-5

If Command = 32 Then
If Bass < 251 Then Incr Bass
End If

If Command = 33 Then
If Bass > 242 Then Decr Bass
End If

Subaddr = 2
Datas = Bass
Gosub I2c

Gosub Writerom

If Bass < 251 Then
Locate 2 , 13                                               'задаем позицию курсора
Lcd Chr(1)
End If

If Bass = 251 Then
Timbre_disp = "+15dB"
Locate 2 , 13                                               'задаем позицию курсора
Lcd Chr(6)
End If

If Command = 59 Then
Waitms 10
Gosub Power_on
End If

If Sw = 0 Then
Waitms 10
Gosub Power_on
End If

Loop

Sub Timbre_disp
'*******************************************************************************
Locate 1 , 12                                               'задаем позицию курсора
Lcd Timbre_disp                                             'выводим на ЖКИ значение переменной Timbre_disp

Locate 2 , 4                                                'задаем позицию курсора
Lcd Chr(0)                                                  'выводим на ЖКИ инверсный минус

If Choice_timbre = 1 Then
Timbre = Treble
Z = 13
Locate 2 , 14                                               'задаем позицию курсора
Lcd " "
Else
Timbre = Bass
Z = 14
End If

Locate 2 , Z                                                'задаем позицию курсора
Lcd Chr(7)                                                  'выводим на ЖКИ инверсный плюс

Select Case Timbre
Case 242 : Timbre_disp = "-12dB"
Locate 2 , 5
Lcd Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 243 : Timbre_disp = " -9dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 244 : Timbre_disp = " -6dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 245 : Timbre_disp = " -3dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 246 : Timbre_disp = "  0dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 247 : Timbre_disp = " +3dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 248 : Timbre_disp = " +6dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1) ; Chr(1)       '; Chr(1)
Case 249 : Timbre_disp = " +9dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(1)       '; Chr(1)
Case 250 : Timbre_disp = "+12dB"
Locate 2 , 5
Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6) ; Chr(6)       '; Chr(1)
End Select

End Sub

Sub Month_disp                                              'подпрограмма перевода цифровых значений месяца в названия месяца
'*******************************************************************************
Select Case _month

Case 1 : Month_disp = "ЗЅіapЗ"                              'января
Daysmonth = 31
Case 2 : Month_disp = "дeіpa»З"                             'февраля
Daysmonth = _year And &H03                                  'проверяем на високосный год
If Daysmonth = 0 Then                                       'если год високосный (переменная Daysmonth = 0)
Daysmonth = 29                                              'то переменная Daysmonth = 29
Else                                                        'иначе
Daysmonth = 28                                              'переменная Daysmonth = 28
End If
Case 3 : Month_disp = "јapїa"                               'марта
Daysmonth = 31
Case 4 : Month_disp = "aѕpe»З"                              'апреля
Daysmonth = 30
Case 5 : Month_disp = "јaЗ"                                 'мая
Daysmonth = 31
Case 6 : Month_disp = "ёЖЅЗ"                                'июня
Daysmonth = 30
Case 7 : Month_disp = "ёЖ»З"                                'июля
Daysmonth = 31
Case 8 : Month_disp = "aіґycїa"                             'августа
Daysmonth = 31
Case 9 : Month_disp = "ceЅїЗІpЗ"                            'сентября
Daysmonth = 30
Case 10 : Month_disp = "oєїЗІpЗ"                            'октября
Daysmonth = 31
Case 11 : Month_disp = "ЅoЗІpЗ"                             'ноября
Daysmonth = 30
Case 12 : Month_disp = "гeєaІpЗ"                            'декабря
Daysmonth = 31

End Select
End Sub

Sub Balance
'*******************************************************************************
Voll = 0
Volr = 0
If Bal < 5 Then                                             'если Bal < 5, то преобладает левый баланс
Volr = Bal * 3                                              'вычисляем значение уменьшения
Volr = 15 - Volr                                            'громкости для правого канала
Volr = Vol - Volr                                           'рассчитываем значение для правого канала
Subaddr = 1                                                 'отправляем его в TDA
Datas = Volr
Gosub I2c
Elseif Bal = 5 Then                                         'если B = 5 , то в обоих каналах одинаковая громкость
Voll = Vol
Volr = Vol
Subaddr = 0                                                 'отправляем его в TDA
Datas = Vol
Gosub I2c
Subaddr = 1
Datas = Vol
Gosub I2c
Elseif Bal > 5 Then                                         'если Bal > 5 , то преобладает правый баланс
Voll = Bal - 5                                               'вычисляем значение уменьшения
Voll = Voll * 3                                             'громкости для левого канала
Voll = Vol - Voll                                           'рассчитываем значение для левого канала
Subaddr = 0                                                 'отправляем его в TDA
Datas = Voll
Gosub I2c
End If

End Sub

Valcoder:                                                   'подпрограмма обработки прерывания INT1
'*******************************************************************************
Select Case Menu
Case 1 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _year < 50 Then Incr _year                               'то если  переменная _year не достигла значения 50 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _year > 9 Then Decr _year                                'то если  переменная _year не достигла значения 9 уменьшаем ее на 1
End If
Case 2 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _month < 12 Then Incr _month                             'то если  переменная _month не достигла значения 12 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _month > 1 Then Decr _month                              'то если  переменная _month не достигла значения 1 уменьшаем ее на 1
End If
Case 3 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _day < Daysmonth Then Incr _day                          'то если  переменная _day не достигла значения переменной Daysmonth увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _day > 1 Then Decr _day                                  'то если  переменная _day не достигла значения 1 уменьшаем ее на 1
End If
Gosub Setdate                                               'перехоод на подпрограмму записи даты в DS1307
Gosub Getdatetime                                           'перехоод на подпрограмму чтения данных из DS1307
Case 4 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _hour < 23 Then Incr _hour                               'то если  переменная _hour не достигла значения 23 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _hour > 0 Then Decr _hour                                'то если  переменная _hour не достигла значения 0 уменьшаем ее на 1
End If
Case 5 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If _min < 59 Then Incr _min                                 'то если  переменная _min не достигла значения 59 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If _min > 0 Then Decr _min                                  'то если  переменная _min не достигла значения 0 уменьшаем ее на 1
End If
_sec = 0
Gosub Settime                                               'перехоод на подпрограмму записи времени в DS1307
Gosub Getdatetime                                           'перехоод на подпрограмму чтения данных из DS1307
Case 8 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If Vol < 255 Then Incr Vol                                  'то если  переменная Vol не достигла значения 255 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Vol > 220 Then Decr Vol                                  'то если  переменная Vol не достигла значения 220 уменьшаем ее на 1
End If
Case 9 : If Valcod_b = 1 Then                               'если на линии B лог "1"
If Bal < 8 Then Incr Bal                                    'то если  переменная Bal не достигла значения 8 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Bal > 0 Then Decr Bal                                    'то если  переменная Bal не достигла значения 0 уменьшаем ее на 1
End If
Case 10 : If Valcod_b = 1 Then                              'если на линии B лог "1"
If Treble < 250 Then Incr Treble                            'то если  переменная Treble не достигла значения 250 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Treble > 242 Then Decr Treble                            'то если  переменная Treble не достигла значения 242 уменьшаем ее на 1
End If
Case 11 : If Valcod_b = 1 Then                              'если на линии B лог "1"
If Bass < 251 Then Incr Bass                                'то если  переменная Bass  не достигла значения 251 увеличиваем ее на 1
Else                                                        'если на линии B лог "0"
If Bass > 242 Then Decr Bass                                'то если  переменная Bass  не достигла значения 242 уменьшаем ее на 1
End If
End Select

Return                                                      'возврат из подпрогрммы

Getdatetime:                                                'подпрограмма чтения данных из DS1307
'*******************************************************************************
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307

  I2cstart                                                  '  I2C START
  I2cwbyte Ds1307r                                          ' константа адрес чтения  DS1307
  I2crbyte _sec , Ack                                       ' чтение значения СЕКУНД
  I2crbyte _min , Ack                                       ' чтение значения МИНУТ
  I2crbyte _hour , Ack                                      ' чтение значения ЧАСА
  I2crbyte Weekday , Ack                                    ' чтение значения НЕДЕЛИ
  I2crbyte _day , Ack                                       ' чтение значения ДНЯ
  I2crbyte _month , Ack                                     ' чтение значения МЕСЯЦА
  I2crbyte _year , Nack                                     ' чтение значения ГОДА
  I2cstop                                                   'I2C STOP
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)       'преобразуем все переменные в десятичный вид
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)       'преобразуем все переменные в десятичный вид
Return                                                      'возврат из подпрогрммы

Setdate:                                                    'подпрограмма записи даты в DS1307
'*******************************************************************************
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 4                                                ' начальный адрес в DS1307
  I2cwbyte _day                                             ' запись ДЕНЬ
  I2cwbyte _month                                           ' запись МЕСЯЦ
  I2cwbyte _year                                            ' запись ГОД
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Settime:                                                    'подпрограмма записи времени в DS1307
'*******************************************************************************
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)       'преобразуем все переменные в двоичный вид
  I2cstart                                                  ' I2C START
  I2cwbyte Ds1307w                                          ' константа адрес записи DS1307
  I2cwbyte 0                                                ' начальный адрес в DS1307
  I2cwbyte _sec                                             ' запись СЕКУНД
  I2cwbyte _min                                             ' запись МИНУТ
  I2cwbyte _hour                                            ' запись ЧАСА
  I2cstop                                                   'I2C STOP
Return                                                      'возврат из подпрогрммы

Sub Convertt
'*******************************************************************************
1wreset                                                     'сбросить шину 1wire
1wwrite &HCC                                                'выдаем команду чтения ПЗУ датчика
1wwrite &H44                                                ' Convert T
'Waitms 750
1wreset                                                     'сбросить шину 1wire
1wwrite &HCC                                                'выдаем команду чтения ПЗУ датчика
1wwrite &HBE                                                'команда чтения ОЗУ датчика
Lsb = 1wread()                                              'читаем младший байт
Msb = 1wread()                                              'читаем старший байт
Temp = Lsb / 16                                             'сдвигаем младший байт вправо на 4 бита
Temp1 = Msb * 16                                            'сдвигаем старший байт влево на 4 бита
Temp = Temp + Temp1                                         'формирмируем результам
End Sub

Rc5:
'*******************************************************************************
Getrc5(address , Command)                                   'считать код RC-5
'If Address = 0 Then                                         'если адрес = 0,
Command = Command And &B01111111                            'то наложить маску
'End If
Return                                                      'возврат из подпрогрммы

I2c:                                                        'подпрограмма записи значений в TDA8425
'*******************************************************************************
I2cstart
I2cwbyte 130
I2cwbyte Subaddr
I2cwbyte Datas
I2cstop
Return                                                      'возврат из подпрогрммы

Writerom:                                                   'подпрограмма записи значений в EEPROM
'*******************************************************************************
Writeeeprom Swfunc , 1
Writeeeprom Vol , 2
Writeeeprom Bal , 3
Writeeeprom Bass , 4
Writeeeprom Treble , 5
Return                                                      'возврат из подпрогрммы

Weekdays:
'*******************************************************************************
Data "ЁoЅeг. "                                              'Понед.
Data "BїopЅёє"                                              'Вторник
Data "Cpeгa  "                                              'Среда
Data "«eїіepґ"                                              'Четверг
Data "ЁЗїЅёеa"                                              'Пятница
Data "CyІІoїa"                                              'Суббота
Data "Bocєp. "                                              'Воскр.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Ответить

Вернуться в «AVR»