DEVICE = 16F876A REMINDERS = OFF CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_ON , LVP_OFF , CP_OFF , DEBUG_OFF REMINDERS = ON XTAL = 4 'переменные для установки времени DIM vhour AS BYTE 'variable часы DIM vminut AS BYTE 'минуты DIM vday AS BYTE 'день недели DIM vdate AS BYTE 'число DIM vmonth AS BYTE 'месяц DIM vyear AS BYTE 'год DIM day_lat AS WORD 'Переменная из двух букв - дней недели 'переменные для отправки по RS485 DIM des_h AS BYTE 'десятки часов DIM h AS BYTE 'единицы часов DIM des_m AS BYTE 'десятки минут DIM m AS BYTE 'единицы минут DIM des_tem AS BYTE 'десятки градусов DIM tem AS BYTE 'градусы DIM defis AS BYTE 'Разделительная черта между часами и минутами на ССИ DIM test AS BYTE 'Тестовая переменная DIM cels AS BYTE 'Значок Цельсий DIM mode AS BIT 'Собственно, что выводим на ССИ: 0 - время, 1 - температура DIM count_mode AS BYTE 'счетчик для режима mode (см. выше) DIM address AS BYTE 'Адрес модуля индикации; МИ выводит инфу только в случае совпадения полученного адреса с прошитым. DIM syncro AS BYTE 'Переменная для синхронизации ССОИ и МИ 'переменные, необходимые для округления температуры DIM sot_tem AS BYTE DIM desh_tem AS BYTE 'переменные, считываемые из микросхемы DS1302 DIM rtcyear AS BYTE DIM rtcday AS BYTE DIM rtcmonth AS BYTE DIM rtcdate AS BYTE DIM rtchr AS BYTE DIM rtcmin AS BYTE DIM rtcsec AS BYTE DIM rtccontrol AS BYTE DIM BUF AS BYTE 'Рабочее пространство для команд button DIM adj AS BYTE 'Изменяемый параметр при настройке (используется для проверки допустимых значений) DIM ds AS BIT 'бит присутствия датчика температуры DIM i AS BYTE 'счетчик DIM zvuk AS BIT 'переменная, отвечающая за звуковую индикацию каждого часа (0 - откл.) DIM temp1 AS DWORD 'переменные для вычисления температуры DIM temp2 AS BYTE DIM temp3 AS WORD DIM temp AS WORD DIM deg AS BYTE 'знак температуры (+/-/_) DIM deg_LCD AS BYTE 'знак температуры, выводимый на LCD-дисплей (необходим для нормальной работы в диапазоне -0,4...0,4 градуса, исключая 0,0) DIM degree AS BYTE 'значок градуса для вывода через rs (константа) DIM des_tem_LCD AS BYTE 'Значение десятков градусов для LCD-дисплея DIM tem_LCD AS BYTE 'Значение единиц температур DIM ostatok AS BIT 'Остаток от деления секунд на 2, необходим для мигания тире между мин и сек DIM channels[4] AS BYTE 'Массив с состоянием каналов всех МИ, каждый байт - одно устройство, каждый бит - один канал DIM ch_i AS BYTE 'Переменная для листания каналов, от 0 до 3 DIM channel_bits AS BYTE 'Переменная для перезаписи состояния каналов интересующего МИ DIM ch_no AS BIT 'Состояние интересующего канала ALL_DIGITAL=true 'Все ножки цифровые TRISA=%00010000 TRISB=%11111111 'PORTB на вход (5-кнопочная клавиатура типа "джойстик") TRISC=%00111111 PORTB_PULLUPS=true 'Подтяжка на клавиатуре включена DECLARE LCD_LINES 2 DECLARE LCD_INTERFACE 4 DECLARE LCD_DTPIN PORTC.0 DECLARE LCD_ENPIN PORTC.5 DECLARE LCD_RSPIN PORTC.4 DECLARE RSOUT_PIN PORTC.7 DECLARE RSOUT_MODE INVERTED DECLARE SERIAL_BAUD 600 'DECLARE RSOUT_PACE 10 SYMBOL dq=PORTA.4 'датчик температуры SYMBOL led=PORTA.5 'индикатор наличия датчика SYMBOL din=PORTC.6 'Динамик SYMBOL left=PORTB.1 'Клавиатура (клавиша влево) SYMBOL right=PORTB.3 SYMBOL up=PORTB.0 SYMBOL down=PORTB.4 SYMBOL ok=PORTB.2 SYMBOL RST = PORTB.5 'Выводы DS1302 SYMBOL IO = PORTB.6 SYMBOL SCLK = PORTB.7 CLEAR 'Обнуление переменных RAM '****************************************************************************************************** init: 'инициализация '****************************************************************************************************** DELAYMS 25 LOW RST 'Reset RTC LOW SCLK SOUND din, [110,5,115,5,120,5,110,5,115,5,120,5] PRINT AT 1,1, " LiNTEk Systems " PRINT AT 2,1, " SSOI-4000 " i=0 'Счетчик количества выполенных основных циклов mode=0 ds=1 syncro=242 channels[0]=EREAD 0 'Из EEPROM считываем состояние каналов channels[1]=EREAD 1 channels[2]=EREAD 2 channels[3]=EREAD 3 count_mode=0 mode = 0 deg=" " deg_LCD=" " zvuk = EREAD 4; 'Ячейка включения/выключения звука DELAYMS 3000 GOTO testind '****************************************************************************************************** testind: 'Процедура тестирования индикаторов МИ '****************************************************************************************************** PRINT AT 1,1, " MI-5 Modules " PRINT AT 2,1, " Indicator test " test="Z" 'Тестовая переменная для МИ ch_i=0 FOR address=201 TO 204 'Передаем эту переменную каждому МИ RSOUT syncro 'Байт синхронизации RSOUT address 'По пять штук в одни руки | RSOUT test '<---' RSOUT test RSOUT test RSOUT test RSOUT test RSOUT channels[ch_i] ch_i=ch_i+1 NEXT DELAYMS 3000 PRINT AT 1,1, "Reading sensors" PRINT AT 2,1, " Connecting... " 'rtcmonth=$10 'rtcdate=$26 'rtcday=$7 'rtchr=$2 'rtcmin=$59 'gosub write_ds1302 GOTO main '****************************************************************************************************** main: 'Основной цикл '****************************************************************************************************** '****************************************************************************************************** 'Процедура чтения микросхемы часов '****************************************************************************************************** RST = 1 'подготовка к чтению из мсх DS1302 SHOUT IO,SCLK,LSBFIRST,[$bf] 'Команда к чтению всех восьми регистров SHIN IO,SCLK,LSBPRE,[rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,rtccontrol] RST = 0 'Сброс мсх GOTO DS18B20 '****************************************************************************************************** DS18B20: 'Процедура проверки наличия и считывания информации с датчика температуры '****************************************************************************************************** LOW dq 'проверка наличия датчика DELAYUS 500 INPUT dq DELAYUS 100 ds=dq DELAYUS 400 IF ds=0 THEN ' если 0, то датчик подключен HIGH led OWRITE dq, 1, [$CC, $BE] 'Считываем результат предыдущего измерения (команда Read ScratchPad) OREAD dq, 2,[temp.LOWBYTE, temp.HIGHBYTE] OWRITE dq, 1, [$CC, $44] 'Отправляем запрос на очередное измерение (команда Convert T) GOTO Temp_calc ELSE LOW led 'deg="-" des_tem="-" tem="-" 'degree="-" ENDIF GOTO Print_LCD '****************************************************************************************************** Temp_calc: 'Процедура преобразования температуры '****************************************************************************************************** deg="+" deg_LCD="+" degree="d" IF temp.15=1 THEN 'если температура отрицательная... deg="-" deg_LCD="-" temp1=temp.LOWBYTE^255 temp2=temp.HIGHBYTE^255 temp3.HIGHBYTE=temp2 temp3.LOWBYTE=temp1 temp=TEMP3+1 ELSE deg="+" 'На всякий случай еще раз deg_LCD="+" ENDIF temp1=TEMP*100 temp1=temp1/16 'здесь будет лежать измеренное значение температуры desh_tem=temp1/10//10 'десятая часть градусов tem=temp1/100//10 'единицы tem_LCD=tem des_tem=temp1/1000//10 'десятки des_tem_LCD=des_tem sot_tem=temp1/10000//10 'сотни градусов IF desh_tem>5 OR desh_tem=5 THEN 'округление единиц tem=tem+1 IF tem=10 THEN 'противоглючное при переходе через десятки des_tem=des_tem+1 tem=0 ENDIF ENDIF IF sot_tem>0 THEN 'перегрузка (100 и выше градусов не поддерживается) PRINT AT 2,10, "Over>>>" 'des_tem="F" 'tem="F" ENDIF IF des_tem=0 AND tem=0 AND desh_tem<5 THEN 'если 0 градусов, знак на LED не отображаем deg=" " ENDIF IF des_tem=0 AND tem=0 AND desh_tem=0 THEN 'на LCD не отображаем только в случае 0.0 градусов deg_LCD=" " ENDIF IF des_tem=0 THEN 'Чтобы не выводить незначащий нуль на LED, делаем просто... des_tem=" " ENDIF SELECT des_tem_LCD '...а вот чтобы не выводить незначащий нуль температуры на LCD, приходится вот так извращаться CASE 0 des_tem_LCD=32 CASE 1 des_tem_LCD=49 CASE 2 des_tem_LCD=50 CASE 3 des_tem_LCD=51 CASE 4 des_tem_LCD=52 CASE 5 des_tem_LCD=53 CASE 6 des_tem_LCD=54 CASE 7 des_tem_LCD=55 CASE 8 des_tem_LCD=56 CASE 9 des_tem_LCD=57 CASE " " des_tem_LCD=32 ENDSELECT LOW led GOTO Print_LCD '****************************************************************************************************** Print_LCD: 'Процедура вывода информации на LCD в дежурном режиме '****************************************************************************************************** GOSUB day_later 'Получение буквенного значения дня недели PRINT AT 1,1, HEX2 rtcdate, ".", HEX2 rtcmonth, ".", "20", HEX2 rtcyear, 32, HEX2 rtchr," ",HEX2 rtcmin IF ds=0 THEN PRINT AT 2,1, day_lat.LOWBYTE, day_lat.HIGHBYTE, " ", deg_LCD, des_tem_LCD, DEC1 tem_LCD, ".", DEC1 desh_tem, 223, "C" ELSE PRINT AT 2,1, day_lat.LOWBYTE, day_lat.HIGHBYTE, " TS OFF>" ENDIF GOTO Migator 'defis="-"''' 'goto pisk''' '****************************************************************************************************** Migator: 'Процедура управления миганием дефиса между часами и минутами '****************************************************************************************************** ostatok=i//2 'Собственно остаток от деления, равен 0 - при четных сек, 1 - при нечетных IF ostatok=0 THEN 'При четных секундах тире включено, defis="-" PRINT AT 1,14, ":" ELSE defis=" " 'а при нечетных выключено PRINT AT 1,14, " " ENDIF GOTO pisk ;'****************************************************************************************************** pisk: 'Процедура подачи звукового cигнала в начале каждого часа ;'****************************************************************************************************** zvuk=EREAD 4 'Проверяем, можно ли пищать (включен ли режим писка) IF zvuk=1 THEN IF rtcmin=0 AND rtcsec=0 THEN 'Пищим в начале каждого часа SOUND din, [117,10,114,10,110,45] ENDIF ENDIF INC i '****************************************************************************************************** 'Процедура-счетчик, определяющая, что надо выводить на индикаторы МИ - время или температуру '****************************************************************************************************** IF mode=0 THEN IF i<30 THEN GOTO LED_hour ENDIF IF i=30 THEN IF ds=0 THEN 'Температуру на LCD выводим только при подключенном датчике i=0 mode=1 GOTO LED_temp ENDIF ELSE i=0 mode=0 ENDIF ENDIF IF mode=1 THEN IF i<14 THEN GOTO LED_temp ENDIF IF i=14 THEN i=0 mode=0 GOTO LED_hour ENDIF ENDIF '****************************************************************************************************** LED_hour: 'Процедура подготовки и передачи на МИ информации о времени '****************************************************************************************************** des_h=rtchr/$10//$10 'десятки часов h=rtchr/1//$10 'единицы часов des_m=rtcmin/$10//$10 'десятки минут m=rtcmin/1//$10 'единицы минут syncro=242 'Синхронизация для всех МИ IF mode=0 THEN 'print at 1,16, "*" 'Чтобы видеть, что именно передается на МИ PRINT AT 2,4, 66,112,101,188,199 ch_i=0 FOR address=201 TO 204 RSOUT syncro RSOUT address 'отправка данных по RS-485, сначала передается адрес RSOUT des_h RSOUT h RSOUT defis RSOUT des_m RSOUT m RSOUT channels[ch_i] ch_i=ch_i+1 NEXT ENDIF GOTO ButAsk '****************************************************************************************************** LED_temp: 'Процедура передачи на МИ информации о температуре '****************************************************************************************************** IF mode=1 THEN 'print at 1,16, " " PRINT AT 2,4, 84,101,188,190,46 degree="d" cels="C" syncro=242 'Синхронизация для всех МИ ch_i=0 FOR address=201 TO 204 RSOUT syncro RSOUT address 'отправка данных по RS-485 RSOUT deg RSOUT des_tem RSOUT tem RSOUT degree RSOUT cels RSOUT channels[ch_i] ch_i=ch_i+1 NEXT ENDIF GOTO ButAsk '****************************************************************************************************** ButAsk: 'Процедура опроса клавиатуры в дежурном режиме '****************************************************************************************************** BUTTON ok,0,40,5,BUF,0,main 'проверка клавиши ОК, если нет - опрашиваем DS SOUND din, [117,4, 120,4] 'если да, то PIC'аем DELAYMS 200 GOTO nastr 'переход в настройки 'main0: delayms 100 'считывание времени 10 раз в секунду 'next 'inc count_mode 'Button ok,0,40,5,BUF,0,DSValid 'проверка клавиши ОК 'sound din, [117,4, 120,4] 'если да, то PIC'аем 'goto nastr 'переход в настройки '****************************************************************************************************** 'Меню настроек '****************************************************************************************************** nastr: i=1 'Номер канала vhour=rtchr vminut=rtcmin vdate=rtcdate vmonth=rtcmonth vyear=rtcyear vday=rtcday ch_i=0 FOR address=201 TO 204 RSOUT syncro RSOUT address 'отправка данных по RS-485 RSOUT "H" RSOUT "A" RSOUT "C" RSOUT "T" RSOUT "P" RSOUT channels[ch_i] ch_i=ch_i+1 NEXT PRINT AT 1,1, " Ustan. vremeni " 'установка времени PRINT AT 2,1, "<-Cancel Next->" BUTTON ok,0,40,5,BUF,0,nastr1 SOUND din, [117,4, 120,4] DELAYMS 200 GOTO nastr0 nastr1: BUTTON left,0,40,5,BUF,0,nastr2 SOUND din, [120,4, 117,4] DELAYMS 200 GOTO main nastr2: BUTTON right,0,40,5,BUF,0,nastr SOUND din, [120,4] DELAYMS 200 GOTO nastr3 '---------------------------- nastr3: PRINT AT 1,1, " Ustanovka daty " 'Установка даты PRINT AT 2,1, "<-Back Next->" BUTTON ok,0,40,5,BUF,0,nastr4 SOUND din, [117,4, 120,4] DELAYMS 200 GOTO date nastr4: BUTTON left,0,40,5,BUF,0,nastr5 SOUND din, [120,4] DELAYMS 200 GOTO nastr nastr5: BUTTON right,0,40,5,BUF,0,nastr3 SOUND din, [120,4] DELAYMS 200 GOTO nastr6 '--------------------------------- nastr6: PRINT AT 1,1, " Indicator test " 'Тест индикаторов PRINT AT 2,1, "<-Back Next->" BUTTON ok,0,40,5,BUF,0,nastr7 SOUND din, [117,4, 120,4] DELAYMS 200 GOTO testind nastr7: BUTTON left,0,40,5,BUF,0,nastr8 SOUND din, [120,4] DELAYMS 200 GOTO nastr3 nastr8: BUTTON right,0,40,5,BUF,0,nastr6 SOUND din, [120,4] DELAYMS 200 GOTO nastr9 '------------------------------------- nastr9: PRINT AT 1,1, " System channel " 'Управление системными выходами PRINT AT 2,1, "<-Back Next->" BUTTON ok,0,40,5,BUF,0,nastr10 SOUND din, [117,4, 120,4] DELAYMS 200 address=201 i=1 GOTO channel nastr10: BUTTON left,0,40,5,BUF,0,nastr11 SOUND din, [120,4] DELAYMS 200 GOTO nastr6 nastr11: BUTTON right,0,40,5,BUF,0,nastr9 SOUND din, [120,4] DELAYMS 200 GOTO nastr12 '----------------------------------------- nastr12: PRINT AT 1,1, " Hour sound " 'Включение/выключение звуковой индикации каждого часа PRINT AT 2,1, "<-Back " BUTTON ok,0,40,5,BUF,0,nastr13 SOUND din, [117,4, 120,4] DELAYMS 200 address=201 i=1 GOTO hour_zvuk nastr13: BUTTON left,0,40,5,BUF,0,nastr12 SOUND din, [120,4] DELAYMS 200 GOTO nastr9 '****************************************************************************************************** 'Меню установки времени '****************************************************************************************************** nastr0: PRINT AT 1,1, " ", HEX2 vhour,":",HEX2 vminut, " " PRINT AT 2,1, "<-Cancel Hours->" BUTTON up,0,40,5,BUF,0,hour0 SOUND din, [120,4] DELAYMS 200 INC vhour GOTO hour0 hour0: BUTTON down,0,40,5,BUF,0,hour_prov SOUND din, [120,4] DELAYMS 200 DEC vhour GOTO hour_prov hour_prov: adj=vhour GOSUB var_check vhour=adj IF vhour=$24 THEN vhour=0 ENDIF IF vhour=$99 THEN vhour=$23 ENDIF GOTO hour1 hour1: BUTTON ok,0,40,5,BUF,0,hour2 SOUND din, [117,4, 120,4] DELAYMS 200 rtchr=vhour GOTO potv hour2: BUTTON left,0,40,5,BUF,0,hour3 SOUND din, [120,4, 117,4] DELAYMS 200 GOTO nastr hour3: BUTTON right,0,40,5,BUF,0,nastr0 SOUND din, [120,4] DELAYMS 200 GOTO minut minut: PRINT AT 1,1, " ", HEX2 vhour,":",HEX2 vminut, " " PRINT AT 2,1, "<-Minut Cancel->" BUTTON up,0,40,5,BUF,0,minut0 SOUND din, [120,4] DELAYMS 200 INC vminut GOTO minut0 minut0: BUTTON down,0,40,5,BUF,0,minut_prov SOUND din, [120,4] DELAYMS 200 DEC vminut GOTO minut_prov minut_prov: adj=vminut GOSUB var_check vminut=adj IF vminut=$60 THEN 'максимум - 59 vminut=0 ENDIF IF vminut=$99 THEN 'минимум - 0 vminut=$59 ENDIF GOTO minut1 minut1: BUTTON ok,0,40,5,BUF,0,minut2 SOUND din, [117,4, 120,4] DELAYMS 200 rtcmin=vminut GOTO potv minut2: BUTTON right,0,40,5,BUF,0,minut3 SOUND din, [120,4, 117,4] DELAYMS 200 GOTO nastr minut3: BUTTON left,0,40,5,BUF,0,minut SOUND din, [120,4] DELAYMS 200 GOTO nastr0 potv: PRINT AT 1,1, " ", HEX2 vhour,":",HEX2 vminut, " " PRINT AT 2,1, "<-Cancel OK->" BUTTON right,0,40,5,BUF,0,potv0 SOUND din, [117,4,120,4] DELAYMS 200 rtchr=vhour rtcmin=vminut GOSUB write_ds1302 GOTO main potv0: BUTTON left,0,40,5,BUF,0,potv SOUND din, [120,4, 117,4] DELAYMS 200 GOTO main '****************************************************************************************************** 'Меню установки даты '****************************************************************************************************** date: 'установка дней PRINT AT 1,1, " ", HEX2 vdate,".",HEX2 vmonth,".",HEX2 vyear," ",HEX1 vday, " " PRINT AT 2,1, "<-Cancel Date->" BUTTON up,0,40,5,BUF,0,date1 SOUND din, [120,4] DELAYMS 200 INC vdate GOTO date1 date1: BUTTON down,0,40,5,BUF,0,date_prov SOUND din, [120,4] DELAYMS 200 DEC vdate GOTO date_prov date_prov: 'Проверка и корректировка вводимых значений даты adj=vdate GOSUB var_check vdate=adj IF vdate=$32 THEN vdate=1 ENDIF IF vdate=0 THEN vdate=$31 ENDIF GOTO date2 date2: BUTTON ok,0,40,5,BUF,0,date3 SOUND din, [117,4,120,4] DELAYMS 200 'rtcdate=vdate 'запись в микросхемную переменную 'gosub write_ds1302 GOTO potv_date date3: BUTTON left,0,40,5,BUF,0,date4 SOUND din, [120,4,117,4] DELAYMS 200 GOTO nastr date4: BUTTON right,0,40,5,BUF,0,date SOUND din, [120,4] DELAYMS 200 GOTO month month: 'аналогично месяц, год, часы и минуты PRINT AT 1,1, " ", HEX2 vdate,".",HEX2 vmonth,".",HEX2 vyear," ",HEX1 vday, " " PRINT AT 2,1, "<- Month ->" BUTTON up,0,40,5,BUF,0,month0 SOUND din, [120,4] DELAYMS 200 INC vmonth GOTO month0 month0: BUTTON down,0,40,5,BUF,0,month_prov SOUND din, [120,4] DELAYMS 200 DEC vmonth GOTO month_prov month_prov: adj=vmonth GOSUB var_check vmonth=adj IF vmonth=$13 THEN vmonth=1 ENDIF IF vmonth=0 THEN vmonth=$12 ENDIF GOTO month1 month1: BUTTON ok,0,40,5,BUF,0,month3 SOUND din, [117,4,120,4] DELAYMS 200 'rtcmonth=vmonth GOTO potv_date 'month2: 'Button cancel,0,40,5,BUF,0,month3 'sound din, [117,4,120,4] 'goto date month3: BUTTON right,0,40,5,BUF,0,month4 SOUND din, [120,4] DELAYMS 200 GOTO year month4: BUTTON left,0,40,5,BUF,0,month SOUND din, [120,4] DELAYMS 200 GOTO date year: PRINT AT 1,1, " ", HEX2 vdate,".",HEX2 vmonth,".",HEX2 vyear," ",HEX1 vday, " " PRINT AT 2,1, "<- Year ->" BUTTON up,0,40,5,BUF,0,year0 SOUND din, [120,4] DELAYMS 200 INC vyear GOTO year0 year0: BUTTON down,0,40,5,BUF,0,year_prov SOUND din, [120,4] DELAYMS 200 DEC vyear GOTO year_prov year_prov: adj=vyear GOSUB var_check vyear=adj GOTO year1 year1: BUTTON ok,0,40,5,BUF,0,year3 SOUND din, [117,4,120,4] DELAYMS 200 'rtcyear=vyear GOTO potv_date 'year2: 'Button cancel,0,40,5,BUF,0,year3 'sound din, [117,4,120,4] 'goto date year3: BUTTON left,0,40,5,BUF,0,year4 SOUND din, [120,4] DELAYMS 200 GOTO month year4: BUTTON right,0,40,5,BUF,0,year SOUND din, [120,4] DELAYMS 200 GOTO day day: PRINT AT 1,1, " ", HEX2 vdate,".",HEX2 vmonth,".",HEX2 vyear," ",HEX1 vday, " " PRINT AT 2,1, "<- Day " BUTTON up,0,40,5,BUF,0,day0 SOUND din, [120,4] DELAYMS 200 INC vday GOTO day0 day0: BUTTON down,0,40,5,BUF,0,day_prov SOUND din, [120,4] DELAYMS 200 DEC vday GOTO day_prov day_prov: adj=vday GOSUB var_check vday=adj IF vday=8 THEN vday=1 ENDIF IF vday=0 THEN vday=7 ENDIF GOTO day1 day1: BUTTON ok,0,40,5,BUF,0,day3 SOUND din, [117,4,120,4] DELAYMS 200 'rtcday=vday GOTO potv_date 'day2: 'Button cancel,0,40,5,BUF,0,day3 'sound din, [117,4,120,4] 'goto date day3: BUTTON left,0,40,5,BUF,0,day SOUND din, [120,4] DELAYMS 200 GOTO year potv_date: PRINT AT 1,1, " ", HEX2 vdate,".",HEX2 vmonth,".",HEX2 vyear," ",HEX1 vday, " " PRINT AT 2,1, "<-Cancel OK->" BUTTON right,0,40,5,BUF,0,potv_date0 SOUND din, [117,4,120,4] DELAYMS 200 rtcdate=vdate rtcmonth=vmonth rtcyear=vyear rtcday=vday GOSUB write_ds1302 GOTO main potv_date0: BUTTON left,0,40,5,BUF,0,potv_date SOUND din, [120,4, 117,4] DELAYMS 200 GOTO main '****************************************************************************************************** 'Процедура сопоставления буквенных значений дням недели '****************************************************************************************************** day_later: SELECT rtcday CASE 1 day_lat.LOWBYTE=$A8 day_lat.HIGHBYTE=$48 CASE 2 day_lat.LOWBYTE=$42 day_lat.HIGHBYTE=$54 CASE 3 day_lat.LOWBYTE=$43 day_lat.HIGHBYTE=$50 CASE 4 day_lat.LOWBYTE=$AB day_lat.HIGHBYTE=$54 CASE 5 day_lat.LOWBYTE=$A8 day_lat.HIGHBYTE=$54 CASE 6 day_lat.LOWBYTE=$43 day_lat.HIGHBYTE=$A0 CASE 7 day_lat.LOWBYTE=$42 day_lat.HIGHBYTE=$43 ENDSELECT RETURN '****************************************************************************************************** 'Процедура записи установленного времени и даты в микросхему '****************************************************************************************************** write_ds1302: rtcsec=0 'date_ds=6 RST = 1 ' Ready for transfer SHOUT IO,SCLK,LSBFIRST,[$8e,0] ' Enable write RST = 0 ' Reset RTC RST = 1 ' Ready for transfer ' Write all 8 RTC registers in burst mode SHOUT IO,SCLK,LSBFIRST,[$be,rtcsec,rtcmin,rtchr,rtcdate,rtcmonth,rtcday,rtcyear,0] RST = 0 ' Reset RTC RETURN '****************************************************************************************************** 'Процедура фильтрации буквенных hex-значений при листании устанавливаемой величины '****************************************************************************************************** var_check: 'С if'ами код получается чуть меньше (2961 против 3025 байт) SELECT adj 'убираем буквы при прокрутке (hex) CASE $9a 'максимум - 99 adj=0 CASE $ff 'минимум - 0 adj=$99 CASE $a adj=$10 CASE $f adj=$9 CASE $1a adj=$20 CASE $1F adj=$19 CASE $2a adj=$30 CASE $2F adj=$29 CASE $3a adj=$40 CASE $3F adj=$39 CASE $4a adj=$50 CASE $4F adj=$49 CASE $5a adj=$60 CASE $5F adj=$59 CASE $6a adj=$70 CASE $6F adj=$69 CASE $7a adj=$80 CASE $7F adj=$79 CASE $8a adj=$90 CASE $8F adj=$89 CASE $9F adj=$99 ENDSELECT RETURN '****************************************************************************************************** 'Меню выбора модуля индикации при работе с сиcтемными каналами '****************************************************************************************************** 'channel: 'print at 1,1, "AD", dec3 address, 32, "CH", ch_no 'print at 2,1, "1 2 3 4 *-Exit" 'Button left,0,40,5,BUF,0,sel_1 'sound din, [117,4,120,4] 'delayms 200 'address=201 'ch_i=0 'goto ch_IO 'sel_1: 'Button up,0,40,5,BUF,0,sel_2 ' sound din, [117,4,120,4] ' delayms 200 ' address=202 'ch_i=1 'goto ch_IO 'sel_2: 'Button right,0,40,5,BUF,0,sel_3 ' sound din, [117,4,120,4] ' delayms 200 ' address=203 ' ch_i=2 ' goto ch_IO 'sel_3: 'Button down,0,40,5,BUF,0,sel_4 ' sound din, [117,4,120,4] ' delayms 200 ' address=204 'ch_i=3 'goto ch_IO 'sel_4: 'Button ok,0,40,5,BUF,0,channel ' sound din, [120,4,117,4] ' delayms 200 ' goto nastr '****************************************************************************************************** 'Меню работы с сиcтемными каналами '****************************************************************************************************** channel: channels[0]=EREAD 0 channels[1]=EREAD 1 channels[2]=EREAD 2 channels[3]=EREAD 3 SELECT address CASE 201 ch_i=0 CASE 202 ch_i=1 CASE 203 ch_i=2 CASE 204 ch_i=3 ENDSELECT PRINT AT 1,1, "AD", DEC3 address, 32, "CH", DEC1 i PRINT AT 2,1, "<- Address ->" channel_bits=channels[ch_i] ch_no=GETBIT channel_bits,i-1 IF ch_no=0 THEN PRINT AT 1,10, " OFF" ELSE PRINT AT 1,10, " ON" ENDIF BUTTON ok,0,40,5,BUF,0,channel_0 SOUND din, [117,4, 120,4] DELAYMS 200 ch_no=ch_no^255 LOADBIT channel_bits,i-1,ch_no EWRITE ch_i,[channel_bits] channels[ch_i]=EREAD ch_i RSOUT syncro RSOUT address 'отправка данных по RS-485 IF ch_no=0 THEN RSOUT "O" RSOUT "F" RSOUT "F" RSOUT " " RSOUT i RSOUT channels[ch_i] ENDIF IF ch_no=1 THEN RSOUT "O" RSOUT "n" RSOUT " " RSOUT " " RSOUT i RSOUT channels[ch_i] ENDIF GOTO channel channel_0: BUTTON left,0,40,5,BUF,0,channel_1 SOUND din, [120,4, 117,4] DELAYMS 200 'i=1 GOTO nastr channel_1: BUTTON up,0,40,5,BUF,0,channel_2 SOUND din, [120,4] DELAYMS 200 INC address IF address=205 THEN address=201 ENDIF GOTO channel channel_2: BUTTON down,0,40,5,BUF,0,channel_3 SOUND din, [120,4] DELAYMS 200 DEC address IF address=200 THEN address=204 ENDIF GOTO channel channel_3: BUTTON right,0,40,5,BUF,0,channel SOUND din, [120,4] DELAYMS 200 GOTO channel_20 channel_20: SELECT address CASE 201 ch_i=0 CASE 202 ch_i=1 CASE 203 ch_i=2 CASE 204 ch_i=3 ENDSELECT PRINT AT 1,1, "AD", DEC3 address, 32, "CH", DEC1 i PRINT AT 2,1, "<- Channel ->" channel_bits=channels[ch_i] ch_no=GETBIT channel_bits,i-1 IF ch_no=0 THEN PRINT AT 1,10, " OFF" ELSE PRINT AT 1,10, " ON" ENDIF BUTTON ok,0,40,5,BUF,0,channel_21 SOUND din, [117,4, 120,4] DELAYMS 200 ch_no=ch_no^255 LOADBIT channel_bits,i-1,ch_no EWRITE ch_i,[channel_bits] channels[ch_i]=EREAD ch_i RSOUT syncro RSOUT address 'отправка данных по RS-485 IF ch_no=0 THEN RSOUT "O" RSOUT "F" RSOUT "F" RSOUT " " RSOUT i RSOUT channels[ch_i] ENDIF IF ch_no=1 THEN RSOUT "O" RSOUT "n" RSOUT " " RSOUT " " RSOUT i RSOUT channels[ch_i] ENDIF GOTO channel_20 channel_21: BUTTON left,0,40,5,BUF,0,channel_22 SOUND din, [120,4] DELAYMS 200 'i=1 GOTO channel channel_22: BUTTON up,0,40,5,BUF,0,channel_23 SOUND din, [120,4] DELAYMS 200 INC i IF i=9 THEN i=1 ENDIF GOTO channel_20 channel_23: BUTTON down,0,40,5,BUF,0,channel_24 SOUND din, [120,4] DELAYMS 200 DEC i IF i=0 THEN i=8 ENDIF GOTO channel_20 channel_24: BUTTON right,0,40,5,BUF,0,channel_20 SOUND din, [120,4] DELAYMS 200 GOTO channel_30 channel_30: PRINT AT 1,1, "All Channels OFF" PRINT AT 2,1, "<-Back " BUTTON ok,0,40,5,BUF,0,channel_31 SOUND din, [117,4,120,4] DELAYMS 200 EWRITE 0, [%00000000] EWRITE 1, [%00000000] EWRITE 2, [%00000000] EWRITE 3, [%00000000] channel_bits=%00000000 GOTO channel channel_31: BUTTON left,0,40,5,BUF,0,channel_30 SOUND din, [120,4] DELAYMS 200 GOTO channel_20 '****************************************************************************************************** 'Меню включения/выключения звуковой индикации каждого часа '****************************************************************************************************** hour_zvuk: zvuk=EREAD 4 IF zvuk=0 THEN PRINT AT 1,1, " Hour_zvuk= OFF " PRINT AT 2,1, "<-Back ON->" ELSE PRINT AT 1,1, " Hour_zvuk= ON " PRINT AT 2,1, "<-Back OFF->" ENDIF BUTTON right,0,40,5,BUF,0,hour_zvuk_0 SOUND din, [117,4,120,4] DELAYMS 200 zvuk=zvuk^255 EWRITE 4.0, [zvuk] GOTO hour_zvuk hour_zvuk_0: BUTTON left,0,40,5,BUF,0,hour_zvuk SOUND din, [120,4,117,4] DELAYMS 200 GOTO nastr