Текст
                    ПУСТЬ ЭТА КНИГА ПРИНЕСЕТ ВАМ УДАЧУ!
Н. и. Заец
Радиолюбительские
конструкции
на Р1С-мпкроконтроллерах
91
SBN 5-98003-078-6
785980 030780
Алгоритмы работы программ
Подробные комментарии
к исходным текстам
Справочные данные

Серия «СОЛОН — радиолюбителям», выпуск 22 Н. И. Заец Радиолюбительские конструкции на PIC-микроконтроллерах С алгоритмами работы программ и подробными комментариями к исходным текстам СОЛОН-Пресс Москва 2003
УДК 621.31 ББК 32.96-04 316 316 Заец Н. И. Радиолюбительские конструкции на Р1С-микроконтроллерах. С алгоритмами работы программ и подробными комментариями к исходным текстам. — М.: СОЛОН-Пресс, 2003. — 368 с.: ил. — (Серия «СОЛОН — радио- любителям», выпуск 22) ISBN 5-98003-078-6 В книге представлено 20 описаний радиолюбительских устройств различного назначения: часы, таймеру, автоматы, программатор и многие другие, выполнен- ные на микроконтроллере PIC16F84A. Впервые книга с различными устройства- ми на PIC-микроконтроллере предназначается для радиолюбителей с любым уровнем подготовленности. Даже те, кто не знаком с программированием микро- контроллеров, смогут без труда повторить любое устройство. Радиолюбители, имеющие опыт работы с программированием, могут изменить программы под свои цели. Для этого в книге даны алгоритмы работы и исходные тексты про- грамм с подробными комментариями. Автор также делится опытом программирования и работы с ассемблером MPLAB и программатором PonyProg2000. УДК 621.31 ББК 32.96-04 Книги издательства «СОЛОН-Пресс» можно заказать наложенным платежом по фиксиро- ванной цене. Оформить заказ можно одним из двух способов: 1) выслать открытку или письмо по адресу: 123242, Москва, а/я 20; 2) передать заказ по электронной почте по адресу: magazin@solon-r.ru. При оформлении заказа следует правильно и полностью указать адрес, по которому должны быть высланы книги, а также фамилию, имя и отчество получателя. Желательно указать допол- нительно свой телефон и адрес электронной почты. Через Интернет Вы можете в любое время получить свежий каталог издательства «СО- ЛОН-Пресс». Для этого надо послать пустое письмо на робот-автоответчик по адресу: ' katalog@solon-r.ru. Получать информацию о новых книгах нашего издательства Вы сможете, подписавшись на рассылку новостей по электронной почте. Для этого пошлите письмо по адресу: news@solon-r.ru. В теле письма должно быть написано слово SUBSCRIBE. ISBN 5-98003-078-6 © Макет и обложка «СОЛОН-Пресс», 2003 © Заец Н. И., 2003
Безвременно погибшей дочери Ольге посвящаю Предисловие Можно уверенно констатировать, что разработка радиоэлектронных устройств в любительской практике переходит на новый, более высокий уро- вень. Это стало возможным благодаря бурному развитию большого ряда мик- роконтроллеров с различным набором встроенных устройств. Если для любите- лей сидеть с паяльником еще 5 лет назад микроконтроллер представлялся чем-то экзотичным и непонятным, то сейчас появляется все больше разрабо- ток самого неожиданного применения. Возник интерес радиолюбителей не просто к копированию понравившейся конструкции, но и к изменению про- граммы для своих целей. Да оно и понятно, ведь микроконтроллер можно за- программировать под требования любого пользователя. А для того чтобы изме- нить в программе хоть одну строчку, необходимы элементарные знания про- граммирования. Не в меньшей степени необходимы знания ассемблера и программатора. Китайская мудрость гласит, что если вы хотите отправиться в далекий путь, то сделайте хотя бы первый шаг. Надеюсь, что для некоторых этим первым шагом окажется данная книга. Как это получилось у меня? Очень хотелось сделать часы. С часов начина- лось увлечение логикой еще в те времена, когда дешифраторы делались на дио- дах, а индикаторами служили стеклянные лампочки с маркировкой ИН1. Было “прочитано все, что писал журнал «Радио» о микроконтроллерах, проверен ин- тернет и запущены письма разработчикам с просьбой о помощи. В журнале «Радио» полезными и своевременными оказались статьи А. Долгий, которые вйходили в 2001 и 2002 году. В интернете удалось набрать несколько работ с исходными текстами программ на микроконтроллерах. Комментарии к исход- ным текстам были, как правило, на английском языке, а наши машинные пе- реводчики делают перевод так, что трудно понять, кто куда и зачем пошел. Разработчики публикаций в журнале «Радио» и других журналах на мой «глас вопиющего» скромно промолчали, хотя на некоторых сайтах есть предложение о помощи. Консультация журнала сослалась на то, что программы являются интеллектуальной собственностью и не подлежат распространению. Я пони- маю, например, собственность программы, которая вместо тысячи циклов управляется за сотню. Но объявлять собственностью 2 + 2 просто смешно. Правда, молчание некоторых авторов удалось вскоре раскрыть, путешествуя по интернету. Дело в том, что их работы один к одному «содраны» у зарубежных авторов. Причем не только схемы не изменены, но и исходные тексты (некото- рые все же удалось добыть) программ скопированы на английском языке. Ма- ло того, некоторые программы оказались нерабочими. Видно, при копирова- нии произошла ошибка. Плохо ребята учились «сдирать» в школе. Учитывая «обширную» помощь, начинал с азбуки изучения команд и устройства микроконтроллера. Оказалось, что я больше времени потратил в 1 3
Предисловие поисках помощи. А программы писать ОЧЕНЬ просто. Конечно, у меня был давно забытый опыт программирования на ассемблере с прошивкой перфокарт для БЭСМ в родном Казанском университете, но ведь то была машина в три этажа, а здесь микросхема с 18 выводами. Первый блин, как и положено ему быть, получился комом, но он РАБОТАЛ! Все эти команды жили своей жизнью и делали то, что я хотел. На ваш читательский суд этот «блин» выно- сится под названием «Часы с тремя будильниками». Сейчас я вижу и ошибки, и неточности, и излишества в этой программе, но исправлять их не собираюсь. Почему? Потому, что я сам практически учился, и сейчас еще учусь, по чужим программам. А больший интерес вызывает программа, улучшенная тобой лич- но. Изучайте, улучшайте, дерзайте! Учитывая то, что я писал о «помощи» коллег, я дал себе слово: никаких тайн в программах исходных текстов. Разве, что если программа может пред- ставлять коммерческий интерес. Дело житейское. И еще, помогать всем, кто в этом нуждается (в разумных пределах). Сам факт выхода этой книги можно рассматривать как одну из форм помощи начинающим радиолюбителям. В этой книге я старался дать самые подробные комментарии к каждой строчке программы, чтобы было понятно даже человеку, который неуверенно знает команды. Потом я просто влюбился в микроконтроллеры. Пишешь программу, в го- лове уже завихрения, думаешь, что это в последний раз. Но стоит закончить работу, как возникают новые идеи, и судорожно присаживаешься к компьюте- ру, чтобы их опробовать. А это опять бессонные ночи работы и несравненное чувство радости, когда программа дружественно замигает светодиодами. Да и как не влюбиться, если вместо десятка микросхем достаточно одной. Вместо листа текстолита достаточно маленького кусочка. А если вы ошиблись в своей разработке на дискретных элементах, то надо новые микросхемы, новую плату и уйму времени. А с микроконтроллерами достаточно изменить программу, в крайнем случае, перерезать один проводник на плате, и готово другое устрой- ство. Справедливости ради следует заметить, что многие из представленных ра- бот в этой книге сделаны по просьбе читателей моей страницы в интернете http://www.radic.newmail.ru и журнала «Схемотехника». По письмам читателей, за что я им очень благодарен, были исправлены некоторые ошибки. Все мы живые люди, а не ошибается только тот, кто ничего не делает. Почему мною выбраны микроконтроллеры фирмы Microchip? Простое сравнение команд и перечень свойств различных типов микроконтроллеров фирмы ATMEL и Microchip показывает, что последние проигрывают. Проиг- рывают и по цене. Но, имея большой выбор микросхем, легко заблудиться в выборе нужной. Имея большой список команд, легко пропустить нужную команду. Как все компьютеры работают по двум значениям 0 и 1, так же мень- шим числом команд можно сделать изящные программы. Более высокую стои- мость компенсирует поразительная живучесть микросхем. Стиль написания программы более понятен и прост в микроконтроллерах PIC. Неплохой инст- румент отладки программ. Возможно, сыграла свою роль госпожа случайность, поскольку мне удалось дешево приобрести несколько корпусов микроконтрол- леров. Все это и определило мой выбор. Разбирая чужие программы, я понял, что без алгоритма работы программы трудно понять последовательность действий. Поэтому к каждой программе, 4
Предисловие описанной в этой книге, имеется алгоритм работы. Конечно, невозможно по- дробно нарисовать алгоритм для сложной программы, но укрупненный алго- ритм уже дает представление о ее работе. Итак, на ваш суд я выношу два десятка программ вместе со схемами устройств и печатными платами. Для кого эта книга? Для радиолюбителей, ко- торые хотят просто повторить хорошую схему, но впервые сталкиваются с мик- роконтроллерами. Для радиолюбителей, которые знают, что такое микроконт- роллер, и хотели бы повторить схему с некоторыми изменениями ее функций. Для радиолюбителей, которые хотят научиться программировать микроконт- роллеры без ошибок, на ошибках других. Книга не предназначена для опытных программистов, которые в своих программах используют сложные алгоритмы. Здесь даны только простые наборы команд. Вообще «чистому» программисту трудно делать электронные устройства, поэтому часто встречаем в публикациях по две фамилии. Электронщикам надо самим учиться программировать. Осо- бенно если учесть, что будущее за микроконтроллерами. Основное свойство всех программ в этой книге — это работоспособность. А для «чистых» программистов хорошая программа — это изящество, возведен- ное в степень искусства. Увы! Искусством в этой книге может служить разве что начертание схем и печатных плат, да и то потому, что выполнены они при помощи графических программ. К достоинствам устройств, которые представлены в этой книге, можно от- нести применение отечественных индикаторов. В настоящее время, как прави- ло, для организации индикации в устройствах на микроконтроллерах применя- ются жидкокристаллические дисплеи со встроенными драйверами. Но они еще недостаточно распространены в нашей стране, а их стоимость многим радио- любителям не по карману. Отдельно выделен интересный ряд устройств, вы- полненных на точечных светодиодах. В приложении дается список команд и описание регистров микроконтрол- леров Р1С,среднего семейства. Это сделано для того, чтобы при изучении про- грамм не держать под рукой еще одну книгу со справочными данными. Пред- ставлены также прошивки микроконтроллеров для устройств, описанных в данной книге. Конечно, прошивки лучше иметь в электронном виде, но если у вас нет своего компьютера, то можно попроситься к другу, чтобы запрограм- мировать микроконтроллер. В этом случае могут понадобиться «бумажные» версии прошивок. Если вы впервые сталкиваетесь с микроконтроллерами, то советую начи- нать чтение книги со статьи «Рекомендации». В этой статье обобщен опыт ра- боты с микроконтроллерами, ассемблером и программатором. Даны советы на- чинающим программистам. Отзывы, замечания, предложения по данной книге с благодарностью приму по адресу saes@mail.ru. 5
Устройства с цифровой индикацией Часы с тремя будильниками Многие радиолюбители начинали свое увлечение со сборки электронных часов. Кто на транзисторах, кто на дискретных счетчиках и специализирован- ных микросхемах. В настоящее время часы можно собрать на одной специали- зированной микросхеме. Время не стоит на месте, и появились разработки на микроконтроллерах. Эти часы, как правило, состоят из одной микросхемы и модуля LCD-дисплея. Отечественных модулей с шиной 12С пока нет в прода- же, а импортные труднодоступны и дороги. В этой работе мною была сделана попытка разработать часы на микроконтроллере с возможностью универсаль- ной индикации на отечественных индикаторах. Надеюсь, что кто-то начнет свое увлечение микроконтроллерами именно с этих часов. Преимущество микроконтроллеров перед дискретными микросхемами в возможности задавать любую конфигурацию часов в зависимости от ваших по- требностей. И если ваши потребности быстро изменяются, то так же быстро можно изменить программу микроконтроллера, не изменяя конструкции часов. По крайней мере, это касается многократно перепрограммируемых микроконт- роллеров с ЭППЗУ типа PIC16F84A, на котором сделаны предлагаемые часы. Часы имеют следующие возможности: • выход с микроконтроллера в коде 1-2-4-8 для сегментов и разрядов, что по- зволяет использовать любые, имеющиеся в наличии, семисегментные инди- каторы с соответствующими дешифраторами; • три будильника с раздельной установкой и включением; • коррекция суточного хода до ±28 секунд; • установка по сигналам точного времени; • резервное питание; >' • потенциальный выход для включения исполнительного устройства (телеви- зор, приемник, свет...) при срабатывании будильника; • индикация с секундами; • индикация с днями недели; • индикация с номером включенного будильника; • гашение индикации на установленное время. Потребляемый часами ток в режиме резервного питания (2,8 В) — 128 мкА, от 4,5 В — 0,5 мА, при напряжении питания 6 В и светодиодах АЛСЗЗЗГ — 100 мА. Принципиальная схема часов дана на рис. 1. Выходы RA0—RA2 микроконт- роллера DD2 имеют положительную логику и предназначены для дешифратора с двоично-десятичного в позиционный код номера разряда. Выходы RBI—RB4 также имеют положительную логику и предназначены для дешифратора с дво- ично-десятичного в семисегментный код. С выхода RBO (GAU) на вход 6 де- шифратора DD3 поступает импульс для организации гашения цифры при вы- 6
Часы с тремя будильниками Рис. 1. Часы с будильником боре разряда установки и во время прерывания. Если не сделать гашения циф- ры во время отработки внутреннего прерывания микроконтроллера, то на это время цифра будет ярко вспыхивать. Длительность отработки прерывания раз- лична при разных режимах и максимально достигает 170 циклов (20 мс). Хотя это мало (около 1/50) по сравнению с количеством циклов от прерывания к прерыванию, равным 8192, однако визуально заметно подергивание всех цифр при смене секунд. Еще один неприятный эффект в часах на микроконтроллере связан с невозможностью одновременной подачи выходных кодов во все раз- ряды. Минимальная разность между загрузками портов составляет два цикла. Если сначала изменять значение цифры, а потом разряд, то на доли секунды значение старшего разряда будет высвечиваться в младшем. Этих неприятных моментов можно избежать, если поставить кварц на большую частоту. Этот ва- риант мною не рассматривался из-за частых отключений электроэнергии. При работе с низкочастотным кварцем микроконтроллер потребляет малый ток от резервного питания. Поэтому можно обойтись миниатюрными дисковыми эле- ментами питания. При работе на резервном питании индикация выключена, но звонок будильника будет работать, если поставить 3 элемента. При вклю- ченном питании звонок будильника работает во время нечетных секунд, а ин- дикация в это время гасится. Прерывистый сигнал частотой около 1 кГц более неприятный, чём монотонный. Назначение управляющих кнопок: SB1 — включение-выключение будильников; SB2 — установка, +1 в выбранный разряд; SB3 — выбор разряда установки; SB4 — выбор режима установки. 7
Устройства с цифровой индикацией Приоритет считывания управляющих кнопок, если случайно нажаты две кнопки, такой: режим — разряд — установка. Режим установки высвечивается в нулевом, младшем разряде (на месте еди- ниц секунд). Во время установки режима в первом разряде высвечивается ма- ленькая буква «с», светятся сегменты D, Е, G. Значение режимов установки следующее: О — установка часов, минут и обнуление; 1 —3 — установка и индикация соответствующих будильников; 4 — установка и индикация гашения и установка дней недели; 5 — (при любых значениях разряда установки) индикация часов, минут, се- кунд; 6 — работа часов с днями недели в первом разряде (в нулевом разряде светится «с»); 7 — установка и индикация коррекции и знака коррекции. При нажатии SB3 происходит мигание выбранного разряда установки. Ми- гание разряда чередуется с частотой около 2 Гц, а смена разряда — 1 Гц. При выборе разрядов 2—5 происходит установка в выбранных разрядах. При выборе нулевого разряда происходит индикация всех установок часов, выбранных ре- жимом. А при нулевом режиме происходит обнуление часов, минут, секунд. При мигающем первом разряде и выборе 4 и 6 режима происходит индикация дней недели в этом разряде, а в нулевом разряде светится «с». Для устранения мигания разрядов у выбора установки имеется 6 фиктивный разряд. В этом ре- жиме происходит повседневная работа часов. Кнопка установки запараллелена с кнопкой включения будильника. Поско- льку установка происходит только в единицах часов и минут с частотой 1 Гц, то установка в 59 минут займет 59 секунд. Чтобы это не было утомительно, можно для установки воспользоваться кнопкой с фиксацией — включения будильника. Режим гашения индикации необходимо включать, например, тогда, когда вы уходите на работу. Установка и индикация гашения производится при чет- вертом режиме. При выборе 4 и 5 разрядов устанавливается время начала гаше- ния в часах. При выборе 2 и 3 разрядов устанавливается время окончания га- шения. Индикация начала и окончания гашения будет при выборе 1 или 6 раз- рядов. Необходимо помнить, что число начала гашения должно быть меньше числа окончания гашения. Началом гашения не может быть число 00. Режим гашения работает при включенной кнопке будильника. Если отжать кнопку во время гашения, индикация включится. При включенном режиме гашения бу- дильник не работает. Если значения начала и окончания гашения равны, то га- шение не происходит. При выборе седьмого режима работы часы переходят в режим коррекции. Индикация на табло: с0-00-с7. При выборе мигающего разряда во втором или третьем разряде, происходит установка коррекции в секундах. Максимальная величина коррекции 28 секунд. При выборе 4 или 5 разряда устанавливается знак коррекции в четвертом разряде. 1 — знак отрицательный, 0 — знак поло- жительный. Коррекция осуществляется в 00 часов 00 минут 30 секунд. Значе- ние коррекции при работающих часах можно посмотреть, выбрав нулевой или первый разряд. 8
Часы с тремя будильниками После любой установки необходимо выбрать режим (5) индикации Ч-М-С, а потом устанавливать режим будильника или другой режим индикации. Печатные платы даны на рисунках 2, 3, 4. Платы разрабатывались так, что- бы под микросхемы и светодиоды можно было поставить панельки. Питание часов осуществляется от адаптера. Резервное питание 2—3 элемента типа А10—А13. Пенал для элементов легко сделать из корпуса одноразового (5 мл) шприца. Кнопки без фиксации импортные мембранного типа, кнопка с фикса- цией тоже импортная, миниатюрная. Светодиоды с общим анодом легко заменить на светодиоды с общим като- дом. Для этого необходимо заменить микросхему КР514ЙД2 на микросхему КР514ИД1. Вывод 3 микросхемы К1561КП2 подать на минус питания. У тран- зисторов VT1—VT 6 поменять местами эмиттер и коллектор и на эмиттер по- дать минус питания. При этом печатная плата требует небольшой доработки. Резисторы R4—R9 при любом варианте подбираются по лучшей яркости свече- ния светодиодов. Если резисторы убрать, то наблюдается небольшой нагрев транзисторов. Рис. 2. Часы с будильником. Печатная плата Рис. 3. Часы с будильником. Расположение элементов на плате Рис. 4. Печатная плата линейки светодиодов с общим анодом /9
Устройства с цифровой индикацией Выходной потенциал на исполнительное устройство (EXE) можно исполь- зовать для включения мелодичного звонка, построенного на микросхемах типа УМС7, УМС8. Часы изготавливались как прикроватные для индикации в темное время су- ток. Поэтому корпус сделан плоским в настенном варианте. Я сделал корпус из пластмассы коробок лазерных дисков. Внутри прозрачная пластмасса оклеена бумагой под цвет обоев; Если протравить корпус изнутри серной кислотой, то получится красивый белый муар. Алгоритм программы часов показан на рис. 5. Все установки и вычисления производятся в начале прерывания. Сначала прибавляется 1 в регистр секунд, а V Ч Ч ч 0. Установка часов 1.Уст. часов 1 буд. 2.Уст. часов 2 буд. З.Уст. часов 3 буд. 4.Уст. начала гаш. 5.4асы с секундами 6.Часы с днями недели 7. Уст. знака коррекця 0. Установка минут 1.Уст. минут 1 буд. 2.Уст. минут 2 буд. З.Уст. минут 3 буд. 4. Уст. окончашя гаш. 5.Часы с секундами б.Часы с днями недели 7.Уст. коррекдо секунд О.Резерв 1 .Работа: часы с 1 буд. 2 .Работа: часы со 2 буд. З .Работа: часы с 3 буд. 4 .Индмсаця гашены 5.Часы с секундами 6.Часы с днями недели 7.Иццжа1*1я коррею>« О.Обнулен® мии сек. ГИцфкащя 1 буд. 2.Иццжащя 2 буд. З.Индиса1*н 3 буд. 4.Уст. дней недели 5.Часы с секундами б.Часы с днями недели 7.Иццжа1*1я коррекци Рис. 5. Алгоритм программы часов 10
Часы с тремя будильниками потом анализируется состояние нажатых кнопок установки. Если кнопки не нажаты, программа переходит к мультиплексору и выбирает по номерам в ре- гистрах АТТ и CAT соответствующую установку. Отработав установку, про- грамма возвращается в режим индикации. Все алгоритмы установки, как пра- вило, имеют линейный вид, и для примера на рис. 6 показан алгоритм установ- ки часов. С левой стороны прямоугольников стоят цифры, обозначающие номер блока подпрограмм, где находится данная подпрограмма. Поэтому все алгоритмы программ установки можно проследить в цифровом выражении. Для удобства чтения перепишем все блоки подпрограмм по их номерам. 1. Проверка нажатых кнопок установки. 2. Выбор разряда установки (мигающего разряда). 3. Выбор режима установки. 4. Куда пойти = мультиплексор. 5. Обнуление минут и секунд. 6. Вызов подпрограмм счета при установке. 7. Смена индикации при смене режима. 8. Установка минут (CAT = 2,3) и времени окончания гашения. 9. Установка часов (CAT = 4,5) и времени начала гашения. 10. Коррекция, установка и индикация. 11. Завершение прерывания. 12. Пп. гашения всех разрядов индикации. 13. Пп. индикации с выходом в 2-10 коде и звонка будильника. 14. Сравнение регистров будильника и часов. 15. Включение звонка. 16. Пп. перекодировки с 2 в 2-10 код. 17. Сохранение и восстановление значений регистров при прерывании. 18. Счет и перекодировка регистров Ч-М-С-Д. 19. Введение коррекции со знаком. 131 цикл Рис. 6. Алгоритм программы установки часов 11
Устройства с цифровой индикацией Количество циклов указано за время всего прерывания. В скобках указаны номера выбранного разряда (С) и режима установки (А). Установка минут. (С2,3; АО), 123 цикла. 17-1-2-18-2-4-6-18-16-18-6-18-16-18-6-11-17. Установка часов. (С4,5; АО), 131 цикл. 17-1-2-18-2-4-6-7-18-16-18-6-7-18-16-18-7-6-11-17. Обнуление минут и секунд. (СО, АО), 91 цикл. 17-1-2-18-2-4-5-7-18-16-18-7-5-11-17. Установка часов будильников. (С4,5; А1-3), 158 циклов. 17-1-2-18-2-4-9-18-16-18-9-7-18-16-18-7-18-16-18-7-11-17. Установка минут будильников. (С2,3; А1-3), 152 цикла. 17-1-2-18-2-4-8-18-16-18-8-7-18-16-18-7-18-16-18-7-11-17. Работа: часы с будильником. (С1,6;А1-3), 61 цикл. 17-1-2-18-2-4-14-11-17. Установка начала гашения. (С4,5; А4), 152 цикла. 17-1-2-18-2-4-9-7-18-16-18-7-18-16-18-7-11-17. Установка окончания гашения. (С2,3; А4), 152 цикла. 17-1-2-18-2-4-8-9-18-16-18-9-8-7-18-16-18-7-18-16-18-7-11-17. Индикация гашения. (Cl,6; А4), 112 циклов. 17-1-2-18-2-4-7-18-16-18=7-18-16-18-7-11-17. Установка дней недели. (СО, А4), 126 циклов. 17-1-2-18-2-4-6-18-6-7-18-16-18-7-6=7-18-16-18-7-6-11-17. Работа: часы с секундами. (CO-6, А5), 170 циклов. 17-1-2-18-2-4-7-18-16-18-7-18-16-18-7-18-16-18-7-11-17. Работа: часы с днями недели. (CO-6, А6), 120 циклов. 17-1-2-18-2-4-7-18-16-18-7-18-16-18-7-11-17. Установка коррекции. (С2,3; А7), 95 циклов. 17-1-2-18-2-4-10-18-16-18-10-11-17. Установка знака коррекции. (С4,5; А7), 95 циклов. 17-1-2-18-2-4-10-18-16-18-10-11-17. Индикация коррекции. (СО, 1,6; А7), 84 цикла. 17-1-2-18-2-4-10-18-16-18-10-11-17. Индикация будильников. (СО, А1-3), 109 циклов. 17-1-2-18-2-4-7-18-16-18-7-18-16-18-7-11-17. Число циклов можно считать приблизительным, т.к. подсчет производился со значениями в регистрах до десяти. При больших значениях программа пере- кодировки (16) будет выполняться несколько раз, поэтому увеличится число циклов. ; ЧАСЫ С ТРЕМЯ БУДИЛЬНИКАМИ, ГАШЕНИЕМ ИНДИКАЦИИ ; И ВОЗМОЖНОСТЬЮ УНИВЕРСАЛЬНОЙ ИНДИКАЦИИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = CHASU.ASM ; ДАТА ИЗМЕНЕНИЯ: 08-07-02. 12
Часы с тремя будильниками ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. t ♦include pl6f84a.inc ’ __CONFIG 3FF0H ИСПОЛЬЗУЕТСЯ ЧАСОВОЙ КВАРЦ ЧАСТОТОЙ 32768 ГЦ. КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 32, ЧТО ВМЕСТЕ С TMR0 (256) И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ, ДАЕТ НА ВЫХОДЕ ТАЙМЕРА 1 СЕКУНДУ (4x32x256=32768) . ДЕЛЕЖ1 13ИГОГА» INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR TIMER0 EQU 01H ; TMR0 OPTIONR EQU 01H /OPTION (RP0=D PC EQU 02H ;СЧЕТЧИК КОМАНД • STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВУВОДА PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ЧАСОВ. SEC1 EQU ОСН /СЕКУНДЫ СЧЕТЧИКА MINI EQU 0DH /МИНУТЫ СЧЕТЧИКА HOU1 EQU 0EH ;ЧАСЫ СЧЕТЧИКА / ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. FLAG EQU OFH ; 0—> ВКЛЮЧЕНИЕ ЗВОНКА.. ; l-> ВКЛЮЧЕНИЕ СЧЕТЧИКА 30 СЕК. в' 0-0-0 Ч-М-С. ; 2-> ОРГАНИЗАЦИЯ ГАШЕНИЯ ВО ВРЕМЯ УСТАНОВКИ И РАБОТЫ БУДИЛЬНИКА. ; 4-> НЕРАВЕНСТВО ЗНАЧЕНИЙ УСТАНОВОК В РЕГИСТРАХ ГАШЕНИЯ. ; 5-> НАЧАЛОСЬ ГАШЕНИЕ ИНДИКАТОРОВ ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. S_LOW EQU 01 OH /ЕДИНИЦЫ СЕКУНД ИНДИКАЦИИ S_HIGH EQU 011H /ДЕСЯТКИ СЕКУНД ИНДИКАЦИИ M_LOW EQU 012H /ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ M_HIGH EQU 013H /ДЕСЯТКИ МИНУТ ИНДИКАЦИИ H_LOW EQU 014H /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ H_HIGH EQU 015H /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ COUI EQU 016H /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ ; РЕГИСТРЫ: УСТАНОВКИ, БУДИЛЬНИКОВ, КОРРЕКЦИИ, ГАШЕНИЯ. DAY1 EQU 017Н /СЧЕТЧИК ДНЕЙ НЕДЕЛИ АТТ EQU 018Н * /ПРИЗНАК (АТРИБУТ) УСТАНОВКИ (РЕЖИМ) GAU EQU 019Н /РЕГИСТР СЧЕТЧИКА 30 СЕК ALA1M EQU 01ВН /БУДИЛЬНИК 1, МИНУТЫ 13
Устройства с цифровой индикацией ALA2M EQU 01CH ;2 ALA3M EQU 01DH ;3 ANOD EQU 01EH /АНОД, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ(0-5) SEGD EQU 01FH /СЕГМЕНТЫ, ДЕСЯТИЧНОЕ ЗНАЧ. (2-10 КОД) CAT EQU 020H /УСТАНОВКА ’РАЗРЯДА МИГАНИЯ COR EQU 023H /РЕГИСТР УСТАНОВКИ КОРРЕКЦИИ W TEMP EQU 024H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ STATUS TEMP EQU 025H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ DSMH EQU 026H /БАЙТ АДРЕСАЦИИ В ПП. LSMH EQU 027H /МЛАДШИЙ БАЙТ В ПОДПРОГРАММЕ HSMH EQU 028H /СТАРШИЙ БАЙТ В ПП. FSR TEMP . EQU 029H /ВРЕМЕННЫЙ ДЛЯ FSR CORNEG EQU 02 AH /ЗНАК КОРРЕКЦИИ, БИТ-0 NEGCOR EQU 02BH ' /ВРЕМЕННЫЙ ДЛЯ ОТРИЦАТЕЛЬНОЙ КОРРЕКЦИИ ALA1H EQU 02DH /БУДИЛЬНИК 1, ЧАСЫ ALA2H EQU 02EH /2 ALA3H EQU 02FH /3 ALAUM EQU ОЗОН /РЕГИСТР МИНУТ В ПП. ALAUH EQU 031H /РЕГИСТР ЧАСОВ В ПП. GACHH EQU 032H /РЕГИСТР НАЧАЛА ГАШЕНИЯ GACHM EQU 033H /РЕГИСТР ОКОНЧАНИЯ ГАШЕНИЯ ; ПУСК. t ORG 0 GOTO INIT ORG 4 GOTO COUNT ; ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'00000100' /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100, MOVWF OPTION_REGA80H /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ. MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА MOVWF INTCON MOVLW B'00011000' / RA0-RA2-HA ВЫХОД, RA3,RA4-BXOfl MOVWF TRISAA80H MOVLW B'10000000' / RB0-RB6-HA ВЫХОД, НВ7-ВХОД MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. BCF PORTB,6 /СБРОСИМ БИТЫ БУДИЛЬНИКА BCF PORTB,5 /БИТ EXE CLRF CORNEG /СБРАСЫВАЕМ ФЛАГ ЗНАКА КОРРЕКЦИИ, CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SEC1 CLRF MINI CLRF HOU1 CLRF S_LOW CLRF S_HIGH CLRF M_LOW CLRF M_HIGH CLRF H_LOW . 1Л
Часы с тремя будильниками CLRF H_HIGH CLRF HSMH CLRF LSMH CLRF ATT CLRF GAU CLRF COR CLRF COUI CLRF ALA1M CLRF ALA1H CLRF ALA2M CLRF ALA2H CLRF ALA3M CLRF ALA3H CLRF GACHH CLRF GACHM MOVLW .1 /УСТАНАВЛИВАЕМ НОМЕР MOVWF CAT /МИГАЮЩЕГО РАЗРЯДА MOVWF DAY1 /И ДНИ НЕДЕЛИ 1. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. KEY BTFSS FLAG,4 KEYF /ЕСЛИ СРАВНЕНИЕ ВЫПОЛНЕНО, /ТО ПРОПУСКАЕМ, ИНАЧЕ ИДЕМ СРАВНИВАТЬ. GOTO KEYO BTFSC PORTB,7 /ВКЛЮЧЕН ЛИ ВЫБОР РЕЖИМА УСТАНОВКИ? GOTO ATTK /ДА. BTFSC FLAG,1 /ЕСЛИ ПОЛНОЧЬ НАСТУПИЛА,- GOTO KEYC /ИДЕМ СЧИТАТЬ 30 СЕКУНД, GOTO CATK /ИНАЧЕ ИДЕМ СРАВНИВАТЬ РАЗРЯД УСТАНОВКИ. KEYF MOVFW GACHH /ВЫЧТЕМ ИЗ РЕГИСТРА ОКОНЧАНИЯ ГАШЕНИЯ SUBWF GACHM,0 /ЗНАЧЕНИЕ РЕГИСТРА НАЧАЛА ГАШЕНИЯ. BZ KEYO /ЕСЛИ ИХ ЗНАЧЕНИЯ РАВНЫ, ВОЗВРАЩАЕМСЯ. BSF FLAG,4 /ИНАЧЕ УСТАНАВЛИВАЕМ ФЛАГ НЕРАВЕНСТВА. GOTO KEYO /ВОЗВРАТ К ПОИСКУ НАЖАТЫХ КЛАВИШ. KEYC INCF GAU, 1 /ВКЛЮЧАЕМ СЧЕТЧИК MOVLW .30 /30 СЕК SUBWF GAU, 0 /И СРАВНИВАЕМ. BTFSC ( STATUS,Z /ЕСЛИ НЕ РАВНО 0, ПРОПУСКАЕМ CALL CORN /ИЛИ ИДЕМ КОРРЕКТИРОВАТЬ СЕКУНДЫ. _________________________ — — —— —— —- —— — —— / 2. ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАЮЩЕГО РАЗРЯДА). CATK CALL SI /ЧАСЫ НЕ ОСТАНАВЛИВАЮТСЯ: ПРИБАВИМ СЕКУНДУ. BTFSS PORTA,3 /ЕСЛИ НЕ ВКЛЮЧЕН ВЫБОР РАЗРЯДА, GOTO CATKU /ИДЕМ ВЫБИРАТЬ РЕЖИМ, INCF CAT, 1 /ИНАЧЕ +1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. MOVFW CAT * /6 РАЗРЯД ФИКТИВНЫЙ, ЧТОБЫ УБРАТЬ МИГАНИЕ С SUBLW .7 /ИНДИКАТОРА. /НЕ БОЛЕЕ 6, 15
Устройства с цифровой индикацией BZ САТКО /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; ОТ НОМЕРА ВЫБРАННОГО РАЗРЯДА ЗАВИСИТ НАПРАВЛЕНИЕ. CATKU MOVFW CAT ;КУДА ПОЙТИ ПРИ ADDWF PC, 1 /УСТАНОВКЕ: GOTO ATTIN ;ИНДИКАЦИЯ GOTO ATTB ;РАБОТА, GOTO ATTUM /УСТАНОВКА МИНУТ, GOTO ATTUM /УСТАНОВКА МИНУТ, GOTO ATTUH /УСТАНОВКА ЧАСОВ, GOTO ATTUH /УСТАНОВКА ЧАСОВ, GOTO ATTB /РАБОТА. CATKO CLRF CAT /ОБНУЛЕНИЕ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ ; 3. ВЫБОР РЕЖИМА УСТАНОВКИ. АТТК /ВО ВРЕМЯ УСТАНОВКИ ЧАСЫ НЕ ОСТАНАВЛИВАЮТСЯ, CALL SI /ПРИ ПЕРЕХОДЕ В МИНУТЫ ПРОПУСК УСТАНОВКИ 1 СЕК MOVLW .10 /ГОРИТ РАЗРЯД "с" MOVWF S_HIGH /В РЕГИСТРЕ ИНДИКАЦИИ ДЕСЯТКОВ СЕКУНД. INCF ATT, F /УВЕЛИЧИВАЕМ ЧИСЛО АТРИБУТА. MOVFW ATT /ВЫСВЕТИМ ЧИСЛО РЕЖИМА (АТТ) В ' MOVWF S_LOW /РЕГИСТРЕ ИНДИКАЦИИ ЕДИНИЦ СЕКУНД. SUBLW .8 /ИНДИКАЦИЯ РАЗРЕШЕНА ДО 7 ЦИФРЫ (0-7) . BNZ ATTGO /ЕСЛИ НЕ РАВНО НУЛЮ, ИДЕМ. CLRF ATT /ИНАЧЕ ОБНУЛЯЕМ АТРИБУТ CLRF S_LOW /И РЕГИСТР ЕДИНИЦ СЕКУНД ИНДИКАЦИИ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; 4. КУДА ПОЙТИ = МУЛЬТИПЛЕКСОР. ATTUM MOVFW ATT /КУДА ПОЙТИ? ПРИ УСТАНОВКЕ САТ=2,3 ADDWF PC, 1 /ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO MINIM /УСТАНОВКА МИНУТ. GOTO ALAKB1M /УСТАНОВКА МИНУТ 1 БУДИЛЬНИКА. GOTO ALAKB2M /УСТАНОВКА МИНУТ 2 БУДИЛЬНИКА. GOTO ALAKB3M /УСТАНОВКА МИНУТ 3 БУДИЛЬНИКА. GOTO GACHK /УСТАНОВКА ВРЕМЕНИ ОКОНЧАНИЯ ГАШЕНИЯ GOTO ATTK5 /РАБОТА: ЧАСЫ С СЕКУНДАМИ. GOTO HID /РАБОТА: ЧАСЫ С ДНЯМИ НЕДЕЛИ. GOTO ATTK7 /УСТАНОВКА КОРРЕКЦИИ СЕКУНД В СУТКИ. ATTUH MOVFW ATT /КУДА ПОЙТИ? САТ=4,5 ADDWF PC, 1 /ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO HOU1H /УСТАНОВКА ЧАСОВ. GOTO ALAKB1H /УСТАНОВКА ЧАСОВ 1 БУДИЛЬНИКА. 16
Часы с тремя будильниками GOTO ALAKB2H /УСТАНОВКА ЧАСОВ 2 БУДИЛЬНИКА. GOTO ALAKB3H /УСТАНОВКА ЧАСОВ 3 БУДИЛЬНИКА. GOTO GACHN /УСТАНОВКА ВРЕМЕНИ НАЧАЛА ГАШЕНИЯ. GOTO ATTK5 /РАБОТА: ЧАСЫ С СЕКУНДАМИ. GOTO HID /РАБОТА: ЧАСЫ С ДНЯМИ НЕДЕЛИ. GOTO ATNEG /СМЕНА ЗНАКА КОРРЕКЦИИ. ATTB MOVFW ATT /КУДА ПОЙТИ? САТ=1,б ADDWF PC, 1 /ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO ATTGO /РЕЗЕРВ, ЗАВЕРШАЕМ. ‘ GOTO FREK1 /РАБОТА: ПРОВЕРКА 1 БУДИЛЬНИКА. GOTO FREK2 /РАБОТА: ПРОВЕРКА 2 БУДИЛЬНИКА. GOTO FREK3 /РАБОТА: ПРОВЕРКА 3 БУДИЛЬНИКА. GOTO GACHIN /ИНДИКАЦИЯ ВРЕМЕНИ ГАШЕНИЯ (НАЧАЛО-КОНЕЦ) GOTO ATTK5 /РАБОТА: ЧАСЫ С СЕКУНДАМИ. GOTO HID /РАБОТА: ЧАСЫ С ДНЯМИ НЕДЕЛИ. GOTO ATT IК /ИНДИКАЦИЯ КОРРЕКЦИИ. ATT IN ' MOVFW ATT /КУДА ПОЙТИ? САТ=0 ADDWF P.C, 1 /ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO ATTOO /ОБНУЛЕНИЕ ЧАСОВ. GOTO FRIN1 /ИНДИКАЦИЯ 1 БУДИЛЬНИКА. GOTO FRIN2 /ИНДИКАЦИЯ 2 БУДИЛЬНИКА. GOTO FRIN3 /ИНДИКАЦИЯ 3 БУДИЛЬНИКА. GOTO DAY ID /УСТАНОВКА ДНЕЙ НЕДЕЛИ. GOTO ATTK5 /РАБОТА: ЧАСЫ С СЕКУНДАМИ.. GOTO HID /РАБОТА: ЧАСЫ С ДНЯМИ НЕДЕЛИ. GOTO ATT IК /ИНДИКАЦИЯ КОРРЕКЦИИ. ; 5.ОБНУЛЕНИЕ МИНУТ И СЕКУНД. АТТОО BTFSS PORTA,4 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ GOTO ATTGO / НЕТ. CLRF SEC1 /ДА, ОБНУЛЯЕМ ДЛЯ УСТАНОВКИ ЧАСОВ CLRF MINI /ПО СИГНАЛАМ ТОЧНОГО ВРЕМЕНИ CALL HIN /И ВЫСВЕЧИВАЕМ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; 6. ВЫЗОВ ПОДПРОГРАММ СЧЕТА ПРИ УСТАНОВКЕ. MINIM BTFSS PORTA,4 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ GOTO ATTGO / НЕТ. MOVLW .10 ;ДА. MOVWF S HIGH /ОБНОВЛЯЕМ ИНДИКАЦИЮ ВЫБРАННОГО MOVFW ATT /РЕЖИМА УСТАНОВКИ MOVWF S_LOW /В МЛАДШЕМ РАЗРЯДЕ. CALL M1M /+1 В РЕГИСТР МИНУТ. CALL HIH /НА ИНДИКАЦИЮ ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. HOU1H J* BTFSS PORTA,4 /АНАЛОГИЧНО ДЛЯ ЧАСОВ. GOTO ATTGO Г 17
Устройства с цифровой индикацией MOVLW .10 t MOVWF S_HIGH f MOVFW ATT f MOVWF S_LOW CALL H1H ;+1 В РЕГИСТР ЧАСОВ. CALL HIN ;НА ИНДИКАЦИЮ МИНУТ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ DAY ID BTFSS PORTA,4 /АНАЛОГИЧНО ДЛЯ ДНЕЙ. GOTO ATTGO t MOVLW .10 г MOVWF S_HIGH t MOVFW ATT f MOVWF S_LOW CALL DI /+1 В РЕГИСТР ДНЕЙ. CALL HIN /НА ИНДИКАЦИЮ МИНУТ CALL HIH /И ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ • = ====== = == = = = = =======: = == = = ==== = == = = == = = = = == = SS = = = =; = =::s: = = = =:=: = = s= = ; 7. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА. • ================================================ FRIN1 MOVLW .10 /ПРИ ИНДИКАЦИИ ВЫСВЕЧИВАЕТСЯ: MOVWF S_HIGH /"С" В ПЕРВОМ РАЗРЯДЕ И MOVFW ATT /НОМЕР РЕЖИМА УСТАНОВКИ MOVWF S_LOW /В МЛАДШЕМ РАЗРЯДЕ MOVFW ALA1M /ИНДИКАЦИЯ 1 БУДИЛЬНИКА. CALL MID /ИНДИКАЦИЯ МИНУТ. MOVFW ALA1H CALL H1U /ИНДИКАЦИЯ ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. FRIN2 MOVLW .10 /АНАЛОГИЧНО ДЛЯ ВТОРОГО БУДИЛЬНИКА. MOVWF S_HIGH / MOVFW ATT Г MOVWF S_LOW MOVFW ALA2M /ИНДИКАЦИЯ 2 БУДИЛЬНИКА. CALL M1U /ИНДИКАЦИЯ МИНУТ. MOVFW ALA2H CALL H1U /ИНДИКАЦИЯ ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. FRIN3 MOVLW .10 /АНАЛОГИЧНО ДЛЯ ТРЕТЬЕГО БУДИЛЬНИКА MOVWF S_HIGH Г MOVFW ATT г MOVWF S_LOW MOVFW ALA3M /ИНДИКАЦИЯ 3 БУДИЛЬНИК^. CALL M1U /ИНДИКАЦИЯ МИНУТ. MOVFW ALA3H CALL H1U /ИНДИКАЦИЯ ЧАСОВ. GOTO ATTGO ;ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. HIN MOVFW MINI 18
Часы с тремя будильниками HIH CALL RETURN MOVFW CALL RETURN M1U HOU1 H1U /ИНДИКАЦИЯ МИНУТ. /ИНДИКАЦИЯ ЧАСОВ. HID /ИНДИКАЦИЯ С ДНЯМИ НЕДЕЛИ В ПЕРВОМ РАЗРЯДЕ. MOVFW DAY1 /РЕГИСТР ДНЕЙ MOVWF S HIGH /ВЫСВЕЧИВАЕМ В ПЕРВОМ РАЗРЯДЕ. MOVLW . 10 MOVWF ' S LOW /НУЛЕВОЙ РАЗРЯД - "с". » CALL HIN /ОБНОВЛЯЕМ ИНДИКАЦИЮ МИНУТ CALL HIH /И ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. АТТК5 /РАБОТА: ЧАСЫ С СЕКУНДАМИ. CALL SIU /ВЫСВЕТИМ СЕКУНДЫ. CALL HIN /ОБНОВЛЯЕМ ИНДИКАЦИЮ МИНУТ CALL HIH ;И ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GACHIN /ИНДИКАЦИЯ УСТАНОВЛЕННОГО ГАШЕНИЯ. MOVLW .10 /ПРИ ИНДИКАЦИИ MOVWF S HIGH /ВЫСВЕЧИВАЕТСЯ MOVFW ATT /НОМЕР РЕЖИМА УСТАНОВКИ. MOVWF S LOW MOVFW GACHH /НАЧАЛО ГАШЕНИЯ CALL H1U /ВЫСВЕЧИВАЕТСЯ В РАЗРЯДАХ ЧАСОВ. MOVFW GACHM /ОКОНЧАНИЕ ГАШЕНИЯ CALL M1U /ВЫСВЕЧИВАЕТСЯ В РАЗРЯДАХ МИНУТ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. / 8. УСТАНОВКИ МИНУТ (CAT=2 ,3) И ВРЕМЕНИ ОКОНЧАНИЯ ГАШЕНИЯ. — ” —r—— ALAKUM /ПП. СЧЕТА УСТАНОВКИ МИНУТ БУДИЛЬНИКОВ. MOVFW ATT /ВЫСВЕТИЛИ НОМЕР MOVWF S LOW /РЕЖИМА УСТАНОВКИ В НУЛЕВОМ РАЗРЯДЕ. MOVLW .10 /В ПЕРВОМ РАЗРЯДЕ MOVWF S HIGH /СВЕТИТСЯ "с’’. pioVFW ALAUM /ЗАГРУЗИМ РЕГИСТР МИНУТ УСТАНОВКИ. ADDLW -3BH ;-59 BZ RUM /СРАВНИТЬ НА 0, ЕСЛИ РАВНО - ОБНУЛИТЬ, INCF ALAUM,1 /ИНАЧЕ ПРИБАВИТЬ. MUR MOVFW ALAUM CALL M1U /ВЫСВЕТИЛИ. RETURN RUM CLRF ALAUM /ОБНУЛЕНИЕ. GOTO MUR 9 •=== = = : = = = = = = = = = tsessrsrsssssssssssrxssrsrsx ======= ALAKB1M BTFSS PORTA,4 /УСТАНОВКА РАЗРЕШЕНА ПРИ НАЖАТОЙ КНОПКЕ 4* /УСТАНОВКИ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ALA1M /ЗАПИСЬ МИНУТ 1 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ ' 19
Устройства с цифровой индикацией MOVWF CALL ALAUM ALAKUM /РЕГИСТР МИНУТ БУДИЛЬНИКА. ;+1 В РЕГИСТР МИНУТ. . MOVFW ALAUM /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA1M /В РЕГИСТР МИНУТ 1 БУДИЛЬНИКА. GOTO FRIN1 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ALAKB2M BTFSS PORTA,4 /УСТАНОВКА РАЗРЕШЕНА ПРИ НАЖАТОЙ КНОПКЕ GOTO ATTGO /УСТАНОВКИ. /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ALA2M /ЗАПИСЬ МИНУТ 2 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ MOVWF ALAUM /РЕГИСТР МИНУТ БУДИЛЬНИКА. CALL. ALAKUM /+1 В РЕГИСТР МИНУТ. MOVFW ALAUM /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA2M /В РЕГИСТР МИНУТ 2 БУДИЛЬНИКА. GOTO FRIN2 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ALAKB3M BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ УСТАНОВКИ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ALA3M /ЗАПИСЬ МИНУТ 3 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ MOVWF ALAUM /РЕГИСТР МИНУТ БУДИЛЬНИКА. CALL ALAKUM /+1 В РЕГИСТР МИНУТ. MOVFW ALAUM /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA3M /В РЕГИСТР МИНУТ 3 БУДИЛЬНИКА. GOTO FRIN3 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ; УСТАНОВКА ВРЕМЕНИ ОКОНЧАНИЯ ГАШЕНИЯ. GACHK BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ УСТАНОВКИ. , GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. MOVFW GACHM /ЗАГРУЗКА ЗНАЧЕНИЯ РЕГИСТРА ОКОНЧАНИЯ ГАШЕНИЯ MOVWF ALAUH /ВО ВРЕМЕННЫЙ РЕГИСТР ЧАСОВ ПП.. CALL ALAKUH /+1 В РЕГИСТР ЧАСОВ. MOVFW ALAUH /ИЗ ВРЕМЕННОГО РЕГИСТРА ЧАСОВ ПП. MOVWF GACHM /В РЕГИСТР ОКОНЧАНИЯ ГАШЕНИЯ. GOTO GACHIN /И НА ИНДИКАЦИЮ ЗНАЧЕНИЯ ГАШЕНИЯ. 1 1 1 vo 1 1 • 1 1 1 УСТАНОВКИ ЧАСОВ CAT=4,5 И ВРЕМЕНИ НАЧАЛА ГАШЕНИЯ. ALAKUH /ПП. СЧЕТА УСТАНОВКИ ЧАСОВ БУДИЛЬНИКОВ. MOVFW ATT /ВЫСВЕТИЛИ НОМЕР MOVWF S LOW /РЕЖИМА УСТАНОВКИ В НУЛЕВОМ РАЗРЯДЕ. MOVLW .10 /В ПЕРВОМ РАЗРЯДЕ MOVWF S HIGH /СВЕТИТСЯ "с". MOVFW ALAUH /ЗАГРУЗКА ЗНАЧЕНИЯ ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H /- 23 BZ RUH /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА ОБНУЛЕНИЕ. INCF ALAUH,1 /ПРИБАВИТЬ 1 В ЧАСЫ. HUR MOVFW ALAUH CALL RETURN H1U /ВЫСВЕТИЛИ. RUH CLRF ALAUH /ОБНУЛИЛИ. GOTO HUR / 20
Часы с тремя будильниками ALAKB1H BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ, MOVFW ALA1H /ЗАПИСЬ ЧАСОВ 1 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ MOVWF ALAUH ' /РЕГИСТР ЧАСОВ БУДИЛЬНИКА. CALL ALAKUH /+1 В РЕГИСТР ЧАСОВ. MOVFW ALAUH /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA1H /В РЕГИСТР ЧАСОВ 1 БУДИЛЬНИКА. GOTO ALAKB2H FRIN1 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ALA2H /ЗАПИСЬ ЧАСОВ 2 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ MOVWF ALAUH /РЕГИСТР ЧАСОВ БУДИЛЬНИКА. CALL ALAKUH /+1 В РЕГИСТР ЧАСОВ. MOVFW ALAUH /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA2H /В РЕГИСТР ЧАСОВ 2 БУДИЛЬНИКА. GOTO FRIN2 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ALAKB3H BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ALA3H /ЗАПИСЬ ЧАСОВ 3 БУДИЛЬНИКА ВО ВРЕМЕННЫЙ MOVWF ALAUH /РЕГИСТР ЧАСОВ БУДИЛЬНИКА. CALL ALAKUH /+1 В РЕГИСТР ЧАСОВ. MOVFW ALAUH /ВЫГРУЖАЕМ ИЗ ВРЕМЕННОГО РЕГИСТРА MOVWF ALA3H /В РЕГИСТР ЧАСОВ 3 БУДИЛЬНИКА. GOTO FRIN3 /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ; УСТАНОВКА ВРЕМЕНИ НАЧАЛА ГАШЕНИЯ. GACHN BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ УСТАНОВКИ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW GACHH /ЗАПИСЬ -ЗНАЧЕНИЯ РЕГИСТРА НАЧАЛА ГАШЕНИЯ MOVWF ALAUH /ВО ВРЕМЕННЫЙ РЕГИСТР ЧАСОВ ПП.. CALL ALAKUH /+1 В РЕГИСТР ЧАСОВ. MOVFW ALAUH /ИЗ ВРЕМЕННОГО РЕГИСТРА ЧАСОВ ПП. MOVWF GACHH /В РЕГИСТР НАЧАЛА ГАШЕНИЯ. GOTO GACHIN /ВЫСВЕЧИВАЕМ РЕЗУЛЬТАТ. ; 10. КОРРЕКЦИЯ, УСТАНОВКА И ИНДИКАЦИЯ. АТТК7 " BTFSS PORTA,4 GOTO ATTGO MOVFW ATT MOVWF S_LOW MOVLW .10 MOVWF S_HIGH INCF COR,1 MOVLW .2 9 SUBWF COR, 0» BZ ATTO /УСТАНОВКА КОРРЕКЦИИ ХОДА ЧАСОВ. /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ. /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. Г г г /+1 В РЕГИСТР КОРРЕКЦИИ. /ЗНАЧЕНИЕ КОРРЕКЦИИ НЕ БОЛЕЕ 28 СЕК. /ЕСЛИ МЕНЬШЕ, ИДЕМ СВЕТИТЬ. /ЕСЛИ БОЛЬШЕ, ОБНУЛЯЕМ. 21
Устройства с цифровой индикацией ATTIK /ИНДИКАЦИЯ ЗНАЧЕНИЙ КОРРЕКЦИИ И ЗНАКА. MOVFW ATT MOVWF S_LOW MOVLW .10 . ,.с„ MOVWF H_HIGH /ИНДИКАЦИЯ В 5 РАЗРЯДЕ (ДЕСЯТКИ ЧАСОВ) MOVWF S_HIGH /И В ПЕРВОМ РАЗРЯДЕ. MOVFW CORNEG /ЗНАК КОРРЕКЦИИ ВЫСВЕЧИВАЕТСЯ MOVWF H_LOW /В РАЗРЯДЕ ЕДИНИЦ ЧАСОВ. MOVFW COR /ИНДИКАЦИЯ' ЗНАЧЕНИЯ КОРРЕКЦИИ . CALL M1U /ВЫСВЕЧИВАЕТСЯ В РАЗРЯДАХ МИНУТ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ATNEG /УСТАНОВКА ЗНАКА КОРРЕКЦИИ. BTFSS PORTA,4 /УСТАНОВКА ПРИ НАЖАТОЙ КНОПКЕ. GOTO ATTGO /ЕСЛИ КНОПКА НЕ НАЖАТА, ЗАВЕРШАЕМ ПРЕРЫВАНИЕ MOVFW ATT /ОБНОВЛЯЕМ ЗНАЧЕНИЕ РЕЖИМА УСТАНОВКИ. MOVWF S_LOW 9 MOVLW .10 9 MOVWF S_HIGH BTFSC CORNEG, 0 /ЕСЛИ ЗНАК КОРРЕКЦИИ® 0, ПРОПУСКАЕМ, GOTO ATNEG1 /ИНАЧЕ ИДЕМ МЕНЯТЬ ЗНАК НА ПРОТИВОПОЛОЖНЫЙ. JSF CORNEG, 0 /УСТАНОВИМ ЗНАК: 1= ЗНАК МИНУС.' GOTO ATTIK /ВЫСВЕТИМ. ATNEG1 BCF CORNEG,0 /0= ЗНАК ПЛЮС. GOTO ATTIK ;ВЫСВЕТИЛИ. ATTO CLRF COR /ОБНУЛИЛИ. GOTO ATTIK /ВЫСВЕТИЛИ. • = = === ========= = = = = = = = =S= ===== = = S==== = = = X3 ; 11. ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. i - - - ATTGO BTFSC INTCON,2 /ЕСЛИ НЕТ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА, GOTO RETCONT /ТО ПРОПУСКАЕМ, ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. GOTO COUZIKL1 /ИЛИ ИДЕМ НА ИНДИКАЦИЮ. ; 12. ПП. ГАШЕНИЯ ВСЕХ РАЗРЯДОВ ИНДИКАЦИИ. GACHZIKL MOVLW B'00011111' /ЗАПИСЬ 1 В РАЗРЯД ГАШЕНИЯ. MOVWF PORTB MOVWF PORTA /ЗАПИСЬ 1 ВО ВСЕ РАЗРЯДЫ 514ИД2 ГАСИТ СЕГМЕНТЫ BTFSS PORTA,4 /ЕСЛИ КНОПКА УСТАНОВКИ НЕ НАЖАТА, GOTO COUZIKL1 /ИДЕМ НА ИНДИКАЦИЮ, BTFSS FLAG,5 /ИЛИ ПРОВЕРЯЕМ УСТАНОВКУ ФЛАГА ГАШЕНИЯ. GOTO COUZIKL1 /ЕСЛИ ФЛАГ ГАШЕНИЯ СБРОШЕН, ИДЕМ НА ИНДИКАЦИЮ. BSF INTCON,7 /УСТАНАВЛИВАЕМ БИТРАЗРЕШЕНИЯ ПРЕРЫВАНИЯ. GOTO GACHZIKL /ПРИ СБОЕ МОЖНО НИКОГДА НЕ ВЫЙТИ ИЗ ЦИКЛА. ; 13’. ПП. ИНДИКАЦИИ С ВЫХОДОМ В ДВОИЧНО-ДЕСЯТИЧНОМ КОДЕ И ЗВОНКА БУДИЛЬНИКА. • =============================================±============================ COUZIKLO /СРАВНЕНИЕ НА ВКЛЮЧЕНИЕ ГАШЕНИЯ - КАЖДЫЙ ЦИКЛ. BTFSS PORTA,4 /ЕСЛИ КНОПКА УСТАНОВКИ НЕ НАЖАТА, / 22
Часы с тремя будильниками GOTO COUZIKL1 /ИДЕМ НА ИНДИКАЦИЮ. BTFSC FLAG,5 /ЕСЛИ ФЛАГ ГАШЕНИЯ ВКЛЮЧЕН, GOTO GACHZIKL /ГАСИМ ИНДИКАЦИЮ. COUZIKL1 CLRF ANOD /ОБНУЛЯЕМ РЕГИСТР АНОДА. MOVLW 010H /ЗАПИСЬ НОМЕРА РЕГИСТРА ЕДИНИЦ СЕКУНД MOVWF SEGD /В РЕГИСТР СЕГМЕНТОВ ДЛЯ КОСВЕННОЙ АДРЕСАЦИИ. GOTO COUZ /ИДЕМ СЧИТАТЬ ЦИКЛЫ ИНДИКАЦИИ. ZIKL INCF ANOD,1 /+1 В РЕГИСТР АНОДА (КАТОДА). MOVLW B'000001101 ' /ЗАПИСЬ ЧИСЛА 6., ‘ SUBWF ANOD,0 /ЗНАЧЕНИЕ АНОДА МОЖЕТ БЫТЬ НЕ БОЛЕЕ 5. BZ COUZIKLO /ЕСЛИ РАВНО 6, ИДЕМ ОБНУЛЯТЬ COUZ INCF COUI,1 /+1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. MOVLW .100- /МОЖНО ПОСТАВИТЬ .100 И МИГАНИЕ БУДЕТ ЧАЩЕ. SUBWF COUI,0 /ВЫЧЛИ. BZ COUZ1 /ЕСЛИ РАВНО 0, ПОЙДЕМ УСТАНАВЛИВАТЬ БИТ ГАШЕНИЯ MOVFW ANOD /СРАВНИМ НОМЕР АНОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT,0 /РАЗРЯДА МИГАНИЯ. BNZ COUZIKL2 /ПЕРЕХОД, ЕСЛИ НЕ НОЛЬ. GOTO COUZ3 /ИНАЧЕ ИДЕМ ОПРЕДЕЛЯТЬ БИТ ГАШЕНИЯ. COUZ1 CLRF COUI /ОБНУЛИЛИ СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. BTFSC FLAG,2 /ПРОПУСТИТЬ, ЕСЛИ 0. GOTO COUZ2 /ИНАЧЕ ИДЕМ СБРАСЫВАТЬ БИТ. BSF FLAG,2 /УСТАНОВКА БИТА ГАШЕНИЯ В 1. GOTO COUZ3 /ОПРЕДЕЛЯЕМ БИТ ГАШЕНИЯ. COUZ2 BCF FLAG,2 /УСТАНОВКА БИТА ГАШЕНИЯ В 0 COUZ3 BCF STATUS,0 /ОЧИСТИМ. BTFSC FLAG,2 /ЕСЛИ БИТ ГАШЕНИЯ РАВЕН 0, ПРОПУСКАЕМ. . . BSF STATUS,0 /УСТАНОВИТЬ БИТ В 1, ПРИ СДВИГЕ 0 БИТ ПЕРЕХОДИТ В 1. BTFSC FLAG,0 /ЕСЛИ БИТ ЗВОНКА =0, ПРОПУСТИТЬ. GOTO INDAL /ПОЩЛИ ЗВОНИТЬ GOTO INDC /ИЛИ СВЕТИТЬ. COUZIKL2 BCF STATUS,0 /ОЧИСТИМ БИТ GOTO INDC /И ИДЕМ СВЕТИТЬ. INDAL /ОРГАНИЗАЦИЯ ЗВОНКА БУДИЛЬНИКА. BSF PORTB,5 /УСТАНАВЛИВАЕМ БИТ ЗВОНКА В 1 BTFSS SEC1,0 /ЕСЛИ БИТ РАВЕН 1, ПРОПУСКАЕМ ;(ЗВОНОК ЗВОНИТ ПРИ НЕЧЕТНЫХ СЕКУНДАХ). GOTO INDC /ПОШЛИ НА ИНДИКАЦИЮ ПРИ ЧЕТНЫХ СЕКУНДАХ. BCF PORTB,5 /УСТАНАВЛИВАЕМ В 0 БИТ ЗВОНКА. BSF PORTB,0 /УСТАНОВИМ ГАШЕНИЕ ИНДИКАТОРА. GOTO INDAL /ЗАЦИКЛИВАЕМСЯ НА 1 СЕКУНДУ. INDC MOVFW SEGD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ СЕГМЕНТА MOVWF FSR * /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. RLF INDF,0 /СДВИГАЕМ ВЛЕВО, ВЫРАВНИВАЯ ВЫХОДНОЙ РЕГИСТР С MbVWF PORTB /ВЫХОДНЫМИ РАЗРЯДАМИ ПОРТА TRISB И 23
Устройства с цифровой индикацией MOVFW ANOD /ЗАГРУЖАЕМ НОМЕР АНОДА MOVWF PORTA /В ПОРТ А. BTFSC FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 1, BSF PORTB,6 /ТО УСТАНОВИМ ПОТЕНЦИАЛ НА RB6 (EXE). INCF SEGD,F /+1 В РЕГ. СЕГМЕНТА. BSF INTCON,7 /УСТАНАВЛИВАЕМ БИТ РАЗРЕШЕНИЯ ПРЕРЫВАНИЯ. GOTO ZIKL /ПРИ СБОЕ МОЖНО НИКОГДА НЕ ВЫЙТИ ИЗ ИНДИКАЦИИ ; 14. СРАВНЕНИЕ РЕГИСТРОВ БУДИЛЬНИКА И ЧАСОВ. FREK1 MOVLW .10 /ОБНОВЛЕНИЕ ИНДИКАЦИИ MOVWF , S_HIGH /ВЫБРАННОГО MOVFW ’ ATT /РЕЖИМА РАБОТЫ. MOVWF S_LOW BCF FLAG,0 /СБРАСЫВАЕМ ФЛАГ ЗВОНКА (ЕСЛИ БЫЛ = 1) MOVFW ALA1H /ЗАГРУЖАЕМ РЕГИСТР ЧАСОВ 1 БУДИЛЬНИКА, SUBWF HOU1,0 /ВЫЧИТАЕМ ЕГО ИЗ РЕГИСТРА ЧАСОВ. BZ FREK1M /ЕСЛИ НОЛЬ, ИДЕМ СРАВНИВАТЬ МИНУТЫ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. FREK1M MOVFW ALA1M /ЗАГРУЖАЕМ МИНУТЫ 1 БУДИЛЬНИКА. SUBWF MINI,0 /СРАВНИВАЕМ С РЕГИСТРОМ МИНУТ. BZ ALARM /ЕСЛИ НОЛЬ, ИДЕМ ЗВОНИТЬ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. FREK2 MOVLW .10 /ОБНОВЛЕНИЕ ИНДИКАЦИИ MOVWF S_HIGH /ВЫБРАННОГО MOVFW ATT /РЕЖИМА РАБОТЫ. MOVWF S_LOW BCF FLAG,0 /СБРАСЫВАЕМ ФЛАГ ЗВОНКА (ЕСЛИ БЫЛ = 1) MOVFW ALA2H /ЗАГРУЖАЕМ РЕГИСТР ЧАСОВ 2 БУДИЛЬНИКА. SUBWF HOU1,0 /ВЫЧИТАЕМ ЕГО ИЗ РЕГИСТРА ЧАСОВ. BZ FREK2M /ЕСЛИ НОЛЬ, ИДЕМ СРАВНИВАТЬ МИНУТЫ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. FREK2M MOVFW ALA2M /ЗАГРУЖАЕМ МИНУТЫ 2 БУДИЛЬНИКА. SUBWF MINI,0 /СРАВНИВАЕМ С РЕГИСТРОМ МИНУТ. BZ ALARM /ЕСЛИ НОЛЬ, ИДЕМ ЗВОНИТЬ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. FREK3 MOVLW .10 /ОБНОВЛЕНИЕ ИНДИКАЦИИ MOVWF S_HIGH /ВЫБРАННОГО MOVFW ATT /РЕЖИМА РАБОТЫ. MOVWF S_LOW t BCF FLAG,0 /СБРАСЫВАЕМ ФЛАГ ЗВОНКА (ЕСЛИ БЫЛ = 1) MOVFW ALA3H /ЗАГРУЖАЕМ РЕГИСТР ЧАСОВ 3 БУДИЛЬНИКА. SUBWF HOU1,0 /ВЫЧИТАЕМ ЕГО ИЗ РЕГИСТРА ЧАСОВ. BZ FREK3M /ЕСЛИ НОЛЬ, ИДЕМ СРАВНИВАТЬ МИНУТЫ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. 24
Часы с тремя будильниками FREK3M MOVFW ALA3M /ЗАГРУЖАЕМ МИНУТЫ 3 БУДИЛЬНИКА SUBWF MINI,0 /СРАВНИВАЕМ С РЕГИСТРОМ МИНУТ. BZ ALARM /ЕСЛИ НОЛЬ, ИДЕМ ЗВОНИТЬ, GOTO ATTGO /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. / 15. ВКЛЮЧЕНИЕ ЗВОНКА.' ALARM BTFSS PORTA,4 ; :ПРИ ОТЖАТОЙ КНОПКЕ ЗВОНОК НЕ РАБОТАЕТ GOTO ATTGO ; :ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. BSF FLAG,0 /ИНАЧЕ УСТАНОВИМ ФЛАГ ЗВОНКА = 1. GOTO ATTGO ; ?НА ИНДИКАЦИИ СРАБАТЫВАЕТ ГЕНЕРАТОР. / 16. ПП. ПЕРЕКОДИРОВКИ С 1 1 1 1 1 1 1 • 1 1 г—. 1 1 О 1 1 г-Н | 1 1 1 1 см 1 1 1 1 1 1 1 1 1 1 1 СМ 1 1 — 1 1 1 1 t=t 1 1 О 1 1 1 1 1 1 О 1 1 г-1 1 1 1 1 1 см 1 1 1 । m । 1 о 1 Сн 1 о 1 д 1 CU 1 < 1 д 1 S । m । BINDECH MOVLW .10 /10 >w. BDH BSF STATUS,0 , /ОБНУЛЕНИЕ БИТА "С" РЕГИСТРА STATUS. SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH. BNC BINDECL , /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH ;ПОВТОРИТЬ. BINDECL MOVF DSMH,0 ADDLW .10 /Ю+W >W. * MOVWF RETURN LSMH ' , /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. ; 17. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. COUNT MOVWF W_TEMP /СОХРАНЕНИЕ 'ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP BSF PORTB,0 /ГАШЕНИЕ ЦИФРЫ ПРИ ПРЕРЫВАНИИ. GOTO KEY /НА ОПРОС КЛАВИАТУРЫ. RETCONT /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА /(РАЗРЕШАЕМ ПРЕРЫВАНИЯ). MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR / FSR, MOVFW W_TEMP /W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 18. СЧЕТ И ПЕРЕКОДИРОВКА РЕГИСТРОВ Ч-М-С-Д. S1 MOVFW .SEC1 /ЗАГРУЗКА ЗНАЧЕНИЙ СЕКУНД В РАБ. РЕГИСТР. 25
Устройства с цифровой индикацией ADDLW -ЗВН ;ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА О, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml, INCE SEC1,F /ИНАЧЕ ПРИБАВИТЬ 1 В РЕГИСТР СЕКУНД. RETURN / ПЕРЕКОДИРОВКА 2_2-10 И ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. S1U MOVFW SEC1 /SEC I >W. MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. ПЕРЕКОДИРОВКИ. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF S_LOW /W > S_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ СЕКУНД/ MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF S_HIGH /W > S_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ СЕКУНД CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП.. CLRF LSMH /ОБНУЛЕНИЕ МЛ. РЕГ. ПП.. RETURN 9 ; ОБНУЛЕНИЕ. Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. CLRF S_LOW /ОБНУЛЕНИЕ ЕДИНИЦ СЕКУНД. CLRF S_HIGH /ОБНУЛЕНИЕ ДЕСЯТКОВ СЕКУНД. / +1 В РЕГИСТР МИНУТ. М1М MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1 INCF MIN1,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /MINI >W. / ПЕРЕКОДИРОВКА 2_2-10 И ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ M1U MOVWF DSMH CALL BINDECH MOVFW LSMH MOVWF M_LOW MOVFW HSMH MOVWF M_HIGH CLRF HSMH CLRF LSMH RETURN / ОБНУЛЕНИЕ. Hl CLRF MINI CLRF M_LOW CLRF M_HIGH / +1 В РЕГИСТР ЧАСОВ. ,-W >DSMH. /ПЕРЕХОД В ПП. ПЕРЕКОДИРОВКИ. /LSMH >W ВРЕМЕННЫЙ. ,-W > M_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ. /HSMH >W ВРЕМЕННЫЙ. /W > M_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ. /ОБНУЛЕНИЕ СТ. РЕГ. ПП.. /ОБНУЛЕНИЕ МЛ. РЕГ. ПП.. 9 /ОБНУЛЯЕМ РЕГИСТР МИНУТ. /ОБНУЛЯЕМ ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. /ОБНУЛЯЕМ ДЕСЯТКИ МИНУТ ИНДИКАЦИИ.
Часы с тремя будильниками Н1Н MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. BTFSC FLAG,5 /ЕСЛИ ГАШЕНИЕ НЕ НАЧАЛОСЬ, GOTO H1FK /ПРОПУСКАЕМ, ИНАЧЕ ИДЕМ СРАВНИВАТЬ'ОКОНЧАНИЕ ;ГАШЕНИЯ. MOVFW HOU1 /СРАВНИВАЕМ НАЧАЛО ГАШЕНИЯ. SUBWF GACHH,0 /ЕСЛИ ГАШЕНИЕ НАЧАЛОСЬ, BZ H1F /ИДЕМ УСТАНАВЛИВАТЬ ФЛАГ ГАШЕНИЯ, GOTO H1H1 . /ИНАЧЕ ИДЕМ УВЕЛИЧИВАТЬ ЧАСЫ. H1FK MOVFW • HOU1 /СРАВНИВАЕМ РЕГИСТР ЧАСОВ С SUBWF GACHM,0 /РЕГИСТРОМ ОКОНЧАНИЯ ГАШЕНИЯ. 7 BZ Hl FOO /ЕСЛИ ОНИ РАВНЫ, ИДЕМ СБРАСЫВАТЬ ФЛАГИ, GOTO H1H1 /ИНАЧЕ ИДЕМ УВЕЛИЧИВАТЬ ЧАСЫ. H1FOO BCF FLAG,5 /СБРАСЫВАЕМ ФЛАГИ ГАШЕНИЯ BCF FLAG,4 GOTO H1H1 /И ИДЕМ УВЕЛИЧИВАТЬ ЧАСЫ. H1F BSF FLAG,5 . /УСТАНАВЛИВАЕМ ФЛАГ НАЧАЛА ГАШЕНИЯ. Н1Н1 MOVFW HOU1 ,-HOU >W. ПЕРЕКОДИРОВКА 2_2-10 И ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. H1U MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП.. MOVFW LSMH ;LSMH >W ВРЕМЕННЫЙ. MOVWF H_LOW /W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF H_HIGH /W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП.. CLRF LSMH /ОБНУЛЕНИЕ МЛ. РЕГ. ПП.. RETURN 9 H10 . CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF H LOW /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF HJHIGH /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. BSF FLAG,1 /УСТАНОВКА БИТА ОТСЧЕТА 30 СЕК. ; +1 В РЕГИСТР ДНЕЙ НЕДЕЛИ. DI INCF DAY1,F /+1 К ДНЯМ НЕДЕЛИ. DIN — MOVFW DAY1 ;РЕЗУЛЬТАТ ВЫСВЕЧИВАЕМ. DO MOVWF S_HIGH /ВО 2 РАЗРЯДЕ. 27
Устройства с цифровой индикацией SUBLW B'000010001 ;СРАВНИМ HE БОЛЕЕ 7? BZ DAY /ЕСЛИ РАВНО, ИДЕМ УСТАНАВЛИВАТЬ В 1, /ЕСЛИ НЕТ - ПРОПУСКАЕМ. RETURN Г DAY MOVLW 01H /УСТАНОВКА В 1 MOVWF DAY1 /ДНЕЙ НЕДЕЛИ (0- ДНЯ НЕТ). CALL DO /НА ИНДИКАЦИЮ. GOTO ATTGO 1 ; 19. ВВЕДЕНИЕ КОРРЕКЦИИ CO ЗНАКОМ. CORN BTFSS CORNEG,0 /ПРОПУСТИТЬ, ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ (=1) GOTO CORN1 /ИНАЧЕ ИДЕМ УВЕЛИЧИВАТЬ ЗНАЧЕНИЕ СЕКУНД. MOVFW COR /ЗАГРУЖАЕМ УСТАНОВОЧНЫЙ РЕГИСТР КОРРЕКЦИИ MOVWF NEGCOR /ПЕРЕПИСЫВАЕМ ВО ВРЕМЕННЫЙ РЕГИСТР. NEGF NEGCOR,0 /ИЗМЕНИМ ЗНАК ЧИСЛА И ПРИБАВИМ ADDWF SEC1,1 /К СЕКУНДАМ. BCF FLAG,1 /СБРОСИМ ФЛАГ 30 СЕК. CLRF GAU /СБРОСИМ СЧЕТЧИК 30 СЕК. CALL SIU /ВЫСВЕТИМ НОВОЕ ЗНАЧЕНИЕ. GOTO ATTGO CORN1 MOVFW COR /ПРИБАВИМ ПОЛОЖИТЕЛЬНУЮ КОРРЕКЦИЮ ADDWF SEC1,1 /К СЕКУНДАМ. CALL SIU /ВЫСВЕТИМ НОВОЕ ЗНАЧЕНИЕ. BCF FLAG,1 /СБРОСИМ ФЛАГ 30 СЕК. GOTO ATTGO END Часы с будильником — шахматные часы В настоящее время в продаже имеется множество электронных часов с раз- личными функциями. Однако шахматных часов в продаже нет, поэтому шах- матисты вынуждены пользоваться механическими конструкциями советских времен. Эта разработка должна восполнить имеющийся пробел. Шахматные часы сделаны на основе часов с будильником [3] и имеют 8 раз- рядов индикации (2 х 4) на светодиодах с общим катодом. В режиме часов све- тятся четыре правых разряда, а в режимах установки и шахмат светятся все во- семь разрядов. Значения времени игры можно записать в энергонезависимую память и считывать необходимое значение перед началом игры. Предусмотрена раздель- ная установка значений правых и левых часов в режиме шахмат (в дальнейшем для упрощения будем писать: правых и левых шахмат). Часы можно использо- вать также как таймер с двойным отсчетом, то есть сначала использовать время правых часов, а затем левых. Часы обладают следующими возможностями: • работа в режиме часов с индикацией часов и минут в правых четырех раз- рядах; 28
Часы с будильником — шахматные часы • работа в режиме часов с будильником; • ручная установка часов по сигналам точного времени; • есть резервное питание; • выход включения звонка, который можно также использовать для вклю- чения мощной нагрузки; • работа в режиме шахмат с восьмиразрядной индикацией; • общая установка правых и левых шахмат до значения 129 минут; • раздельная установка правых и левых шахмат (для дачи «форы»); • запись во Flash-память 64 значений времени игры; • выборка из памяти любого записанного значения времени игры; • звуковая сигнализация окончания времени игры. Часы запрограммированы на микроконтроллере PIC16F84A, имеющем не- большой размер, малое энергопотребление и хорошие функциональные воз- можности. Программу не трудно перевести на однократно программируемые микроконтроллеры (ОТР), которые имеют прерывания по переполнению тай- мера (TMR0) и входу. Алгоритм работы программы показан на рис. 7. После инициализации программы включается предделитель с коэффици- ентом деления 32 и таймер с коэффициентом деления 256. Таким образом, общий коэффициент деления (с учетом машинного цикла, равного четы- рем) равен 32 х 256 х 4 = 32768. То есть таймер будет переполняться через интервал времени в одну секунду. По переполнению таймера происходит прерывание работы программы. Все определения нажатых кнопок установки^ и работы происходят во время прерывания. После окончания прерывания включается индикация. Индикация установок перегружена условиями на выбор разряда мигания и установкой запятой, поэтому 8 разрядов светодио- дов светятся с мерцанием (частота около 30 Гц). В режиме часов работает 4 разряда светодиодов, частота индикации увеличивается до 40 Гц и мерца- ния не наблюдается. Чтобы избежать мерцания светодиодов при индикации в режиме работы шахмат, существует еще одна программа индикаций без дополнительных условий переходов. Все программы установок заканчиваются восстановлением значений реги- стров после прерывания. Эти связи в алгоритме работы программы не показа- ны. Кроме того, не показано, что все установки и включения происходят после нажатия кнопки «Установка». В режиме индикации нажатия кнопки «Установ- ка» не требуется, а индикация появляется после выбора соответствующего ре- жима и разряда. На рис. 8 приведена принципиальная схема часов. Выводы микроконт- роллера DD2 RBO—RB6 используются для включения сегментов светодио- дов. Во время прерывания выводы RBO—RB3 используются как входы для опроса состояния кнопок установки. Вывод RB7 используется как вход с прерыванием для постоянного считывания кнопки запуска правых или ле- вых часов. На выводах RAO—RA3 появляется двоично-десятичный код като- дов светодиодов. Этот код преобразуется в позиционный код микросхемой DD1 дешифратора К555ИД7. Вывод RA3 используется для индикации запя- той. На выводе RA4 прявляется уровень логического ноля для срабатывания звукового сигнала. Этот вывод можно применить для включения сильноточ- ной нагрузки по сигналу будильника, естественно, используя соответствую- 29
Устройства с цифровой индикацией V_________________V______________V ______________ч О.Обнулеше шахмат 1,Уст. минут будильшка 2.Ивдикашя будильняса З.Уст. часов будильняса 4. Работ а с вкл. будильн При любом разряде работа в режиме часов О.Уст. минут трав, шах 1,Уст. минут лев. шах 2.Уст. адреса зашей З.Зашеь в ПЗУ 4.Уст. адр. считывали 5.Считывание зашей 6.Инцисашя шахмат 7.Уст. мнут шах общ, 8.Включение шахмат О.Обнуление мин. сек. 1-Устанэвка минут 2. Оби. счет, считывания З.Установка часов 4.Обн счетчика зашей Рис. 7. Алгоритм программы шахматных часов щую схему включения с самоблокировкой. Используемый звуковой излуча- тель типа НСМ1206х имеет встроенный генератор с частотой около 2 кГц. Поэтому управление его включением упрощается до подачи напряжения на выводы излучателя. Светодиоды HL1, HL2 индицируют переключение правых-левых шахмат и устанавливаются возле соответствующих групп цифровых светодиодов. 30
Часы с будильником — шахматные часы НСМ1206х DD1 К555ВД7 HG1 +4,5 В KBbIB16DDl * KBUB8DD1 -,4,5 В ZQ1 32768 Гц Рис. 8. Шахматные часы Назначение кнопок управления: SA1 — «Старт-стоп» — кнопка пуска и останова работы шахмат; SA2 — «Режим» — кнопка выбора режима работы; SA3 — «Разряд» — кнопка выбора разряда установки; SA4 — «Установка» — кнопка установки выбранного значения; SA5 — «R-L» — кнопка переключения правых-левых шахмат. Выбор режима установки индицируется запятой в правых четырех разрядах. Выбор разряда индицируется миганием соответствующего разряда с частотой 2...3 Гц. При нажатии кнопок сегменты, к выходам которых подключены кноп- ки, горят с меньшей яркостью. Выполняемые часами функции при выборе режима и разряда показаны в нижней части рис. 8. После включения питания устанавливается индикация правых разрядов с режимом «О» и разрядом «1». Это, согласно алгоритму, соот- ветствует установке минут часов. Для перевода часов в режим восьмиразрядной индикации необходимо переключить запятую на первый разряд или при запя- той в нулевом разряде выбрать мигающим второй (четвертый) разряд. Если поставить запятую во второй разряд, индикация переключится на че- тыре разряда в режим часов при любом значении мигающего разряда. При вы- бранном режиме работы в третьем разряде происходит работа и установка бу- дильника. Звуковой сигнал, сработавший в режиме будильника, отключается переведением запятой (кнопкой «Режим») в нулевой разряд. При этом вклю- чатся восемь разрядов установки, но дальнейшее переведение запятой до вто- 31
Устройства с цифровой индикацией рого разряда приводит к включению четырех разрядов режима часов. На следу- ющий день будильник сработает в то же время, если выбирать режим работы ча- сов с будильником. . В режиме первого разряда часы индицируют все, что касается шахмат. Если произведена раздельная установка правых и левых шахмат, то переходить в ре- жим включения шахмат необходимо, не отпуская кнопку разряда. Режим вклю- чения шахмат произойдет при выводе мигающего разряда за пределы индика- ции в восьмой фиктивный разряд. Для перехода работы от установки к шахма- там необходимо нажать кнопку «Установка». На табло появятся выбранные значения минут и запятые во всех разрядах. Запятые свидетельствуют о том, что часы готовы к пуску режима шахмат. При нажатии кнопки «Старт-стоп» на од- ну секунду, запятые исчезнут, а часы пойдут в режиме вычитания. Периодич- ность появления Запятых при длительном удержании кнопки — 2 секунды. Да- лее, нажимая кнопку «R-L», переключают работу часов. На следующую секунду после появления нолей на каких-либо часах шахмат включится звуковая сигна- лизация. Звуковой сигнал выключится после нажатия кнопки «Старт-стоп». Да- лее нажимают кнопку «Установка» и схема переходит в режим работы часов. Следующий цикл режима шахмат можно повторить после установки значений часов шахмат. Если часы используются в режиме таймера, то после выключения звукового сигнала необходимо нажать кнопку «R-L» и снова запустить режим шахматы. Индикация на табло при выбранном первом режиме установки: Разряд: 0 — минуты правых шахмат _ 00 _ _ 30; 1 — минуты левых шахмат 25 30; 2 — адрес записи __01 __30; 3 — запись в ПЗУ __01 __30; 4 — адрес считывания __00__01; 5 — считывание 30 01; 6 — индикация 25 00 30 00; 7 — установка 01 00 01 00; 8 — включение шахмат 01 00 01 00. В режиме записи в память необходимо нажать кнопку «Установка» и удер- живать ее не менее одной секунды. Результат записи желательно сразу прове- рить и записать на бумаге. В память записывается значение правых шахмат. А при выборке записанное значение переписывается в правые и левые шахма- ты (общая установка). При установке шахмат более 9 на индикации в разряде десятков будут светиться: • нижняя черта (сегмент d) соответствует значению 10, • нижняя и средняя черта (d, g) соответствует значению 11, • нижняя„ средняя и верхняя черта (a, d, g) соответствует значению 12. Можно изменить значения сегментов в программе до максимально возмож- ного числа 15. Тогда будет максимальная установка до 159 минут. Кнопку SA5 можно заменить более привычными для шахматистов двумя кнопками с зависимым включением типа П2К. На рис. 9 и 10 показаны печатная плата и расположение элементов часов. Если вы будете использовать шахматные часы в «стационарных» условиях, 32
Часы с будильником — шахматные часы можно поставить индикаторы большего размера, чем типа АЛСЗЗЗА. В этом случае яркость свечения нужно подобрать уменьшением номиналов резисторов Rl—R8. Полностью убирать резисторы нельзя, поскольку максимальная на- грузка на порт (не на вывод!) не должна превышать 50 мА. Печатная плата для четырех светодиодов с общим катодом показана на рис. 11. Рис. 9. Шахматные часы. Печатная плата GB1 SA4 SA2 HL1 SA5 G F Е -4,5 В ЗАЗ SAI HL2 Рис. 10. Шахматные часы. Расположение элементов на плате Рис. 11. Печатная плата линейки светодиодов с общим катодом 2 Зак. 241S 33
Устройства с цифровой индикацией Корпус часов склеен из пластмассы и имеет габариты 70 х 65 х 40. Размер корпуса определен примененной батареей типа 3R12 (плоская). Часы сделаны переносными для возможности игры на скамейке или в дороге. При этом но- миналы резисторов Rl—R8 необходимо увеличить до 560 Ом. Такие часы в ре- жиме шахмат потребляют ток 23 мА, что хорошо согласуется с емкостью бата- реи. В режиме резервного питания часы потребляют ток 0,15 мА, поэтому для него можно применить миниатюрные дисковые элементы. При срабатывании будильника в режиме резервного питания потребляемый ток увеличивается до 4,5 мА. Поэтому желательно быстрее отключить сигнал. Поскольку индикации в этом режиме нет, отключить сигнал можно кратковременным нажатием кнопки «Режим». ; ЧАСЫ-ТАЙМЕР-ШАХМАТНЫЕ ЧАСЫ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ ЕДИНИЧНОГО ИЗГОТОВЛЕНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = SHAHMATU.ASM ; ДАТА ИЗМЕНЕНИЯ: 15-08-02. , ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: ' 5.61 ..00 . ♦INCLUDE P16F84A.INC CONFIG 3FF0H ; ИСПОЛЬЗУЕТСЯ ЧАСОВОЙ КВАРЦ ЧАСТОТОЙ 32768 ГЦ. ; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 32, ЧТО ВМЕСТЕ ; С TMR0 (256) И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ, ; ДАЕТ НА ВЫХОДЕ ТАЙМЕРА 1 СЕКУНДУ (4x32x256=32768). ; РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ. INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H /OPTION (RP0=l) . PC EQU 02H ;СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. EEDATA EQU 08H /ДАННЫХ ПЗУ. EEADR EQU 09H /АДРЕСА ПЗУ. EECON1 EQU 88H /РЕГИСТРЫ ЧТЕНИЯ-ЗАПИСИ. EECON2 EQU 89H /ПЗУ. INTCON ' EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. 34
Часы с будильником — шахматные часы ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. M_LOW EQU 010H ;ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ M_HIGH EQU 011H ;ДЕСЯТКИ МИНУТ ИНДИКАЦИИ H_LOW EQU 012H /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ H_HIGH EQU 013H /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ SLO1 EQU 014H ;ЕДИНИЦЫ СЕКУНД 1 ЧАСОВ. SHI1 EQU 015H ;ДЕСЯТКИ СЕКУНД 1 ЧАСОВ. MLO1 EQU 016H ;ЕДИНИЦЫ МИНУТ 1 ЧАСОВ. MHI1 EQU 017H ;ДЕСЯТКИ МИНУТ 1 ЧАСОВ. SLO EQU 018H ;ЕДИНИЦЫ СЕКУНД 2 ЧАСОВ. SHI EQU 019H ;ДЕСЯТКИ СЕКУНД 2 ЧАСОВ. MLO EQU 01 AH ;ЕДИНИЦЫ МИНУТ 2 ЧАСОВ. MH I EQU 01BH ;ДЕСЯТКИ МИНУТ 2 ЧАСОВ. ; РЕГИСТРЫ ДЛЯ ОРГАНИЗАЦИИ ИНДИКАЦИИ. ; с : KATOD EQU 01CH /КАТОД, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ(0-7). АТТ EQU 01DH /ПРИЗНАК (АТРИБУТ) УСТАНОВКИ (РЕЖИМ) COUF EQU 01EH /СЧЕТЧИК ФЛАГА. SEGD EQU 01FH /СЕГМЕНТЫ. CAT EQU 020H /УСТАНОВКА РАЗРЯДА МИГАНИЯ. COUI EQU 021H /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. / СЧЕТЧИКИ ЗАПИСИ [, СЧИТЫВАНИЯ ППЗУ. COUEE EQU 022Н /ЗАПИСИ В ПЗУ. ACOU EQU 023Н /СЧИТЫВАНИЯ ИЗ ПЗУ. / ВРЕМЕННЫЕ , Для ХРАНЕНИЯ ПРИ ПРЕРЫВАНИИ И УСТАНОВКЕ W_TEMP EQU 024H ; БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 025H ; :БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS'ПРИ ПРЕРЫВАНИИ FSR_TEMP EQU 029H ; :ВРЕМЕННЫЙ ДЛЯ FSR. DSMH EQU 026H ; /БАЙТ АДРЕСАЦИИ В ПП. LSMH EQU 027H ; /МЛАДШИЙ БАЙТ В ПОДПРОГРАММЕ. HSMH EQU 028H ; /СТАРШИЙ БАЙТ В ПП. SECUM EQU 029H ; /РЕГИСТР СЕКУНД В ПП. MINUM EQU 02 AH ; /РЕГИСТР МИНУТ В ПП. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ ЧАСОВ. SEC1 EQU 02BH , /СЕКУНДЫ СЧЕТЧИКА ЧАСОВ. MINI EQU 02CH , ;МИНУТЫ СЧЕТЧИКА ЧАСОВ. HOU1 EQU 02DH , /ЧАСЫ СЧЕТЧИКА ЧАСОВ. SECM EQU 02EH , /СЕКУНДЫ 1 ШАХ. SECMI EQU 02FH* , /СЕКУНДЫ 2 ШАХ. MINM EQU ОЗОН , /МИНУТЫ 1 ШАХ. MINM1 EQU 031H , /МИНУТЫ 2 ШАХ. 35
Устройства с цифровой индикацией ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. FLAG EQU 032Н ; 0-> ВКЛЮЧЕНИЕ ЗВОНКА. ; 1-> ПЕРЕКЛЮЧЕНИЕ ШАХМАТНЫХ ЧАСОВ. ; 2-> ОРГАНИЗАЦИЯ ГАШЕНИЯ ВО ВРЕМЯ УСТАНОВКИ. ; 3-> ПЕРЕКЛЮЧЕНИЕ: ЧАСЫ-ШАХМАТЫ. ; 4-> ЗАПЯТОЙ. ; 5-> СТАРТ-СТОП. ; 6-> ФЛАГ УСТАНОВКИ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ БУДИЛЬНИКА. ALAM EQU ОЗЗН /МИНУТЫ БУДИЛЬНИКА. ALAH EQU 034Н /ЧАСЫ БУДИЛЬНИКА. / ПУСК ORG О GOTO INIT ORG 4 GOTO COUNT / ИНИЦИАЛИЗАЦИЯ INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'00000100' ;ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100, MOVWF OPTION_REGA80H /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ. MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА MOVWF INTCON MOVLW B'00000000' ; RA0-RA4 НА ВЫХОД. MOVWF TRISAA80H MOVLW B'10001111' / RB0-RB3, RB7 НА ВХОД, RB4-RB6-BbIXOfl MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SEC1 CLRF MINI CLRF HOU1 CLRF SECM CLRF MINM CLRF SECMI CLRF MINM1 CLRT M LOW CLRF M HIGH CLRF H_LOW CLRF H HIGH CLRF SLO CLRF SHI CLRF MLO 36
Часы с будильником — шахматные часы CLRF MH I CLRF SLO1 CLRF SHI1 CLRF MLO1 CLRF MHI1 CLRF HSMH CLRF LSMH CLRF ATT CLRF COUI CLRF COUF CLRF ACOU CLRF COUEE CLRF ALAM CLRF ALAH MOVLW .1 /УСТАНАВЛИВАЕМ НОМЕР MOVWF CAT /МИГАЮЩЕГО РАЗРЯДА. ; 1. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ И СОСТОЯНИЯ ФЛАГОВ. KEY BTFSS PORTB,0 ; ПУСК-СТОП. CALL KEYC ;НА УСТАНОВКУ-СБРОС ФЛАГА ПУСКА. BTFSC FLAG,5 ;ЧАСЫ-ШАХМАТЫ. GOTO KEYSH ;НА ВКЛЮЧЕНИЕ ИНДИКАЦИИ ШАХМАТ. KEYF BTFSS PORTB,1 /ЕСЛИ РЕЖИМ ВКЛЮЧЕН, GOTO ATTK /ИДЕМ МЕНЯТЬ ЗНАЧЕНИЕ. GOTO CATK /ИНАЧЕ ИДЕМ СРАВНИВАТЬ РАЗРЯД УСТАНОВКИ KEYSH CALL SI /ЧАСЫ НЕ ОСТАНАВЛИВАЮТСЯ. GOTO SHARL /НА ИНДИКАЦИЮ ШАХМАТ. KEYC INCF COUF,1 /СЧЕТЧИК ФЛАГА ПУСКА. BTFSC. COUF,0 /НЕЧЕТНОЕ ЗНАЧЕНИЕ СЧЕТЧИКА BSF FLAG,5 /ВКЛЮЧАЕТ ФЛАГ ПУСКА. BTFSS COUF,0 /ЧЕТНОЕ ЗНАЧЕНИЕ СЧЕТЧИКА BCF FLAG,5 /ВЫКЛЮЧАЕТ ФЛАГ ПУСКА. BCF FLAG', 0 /ОБНУЛЕНИЕ ФЛАГА ЗВОНКА. BCF RETURN FLAG,6 /СБРОС ФЛАГА УСТАНОВКИ. f ; 2. ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАЮЩЕГО РАЗРЯДА). САТК CALL SI /ЧАСЫ HE ОСТАНАВЛИВАЮТСЯ: ПРИБАВИМ СЕКУНДУ BTFSC PORTB,2 /ЕСЛИ НЕ ВКЛЮЧЕН ВЫБОР РАЗРЯДА, GOTO ATTKU /ИДЕМ ВЫБИРАТЬ РЕЖИМ, INCF CAT, 1 /ИНАЧЕ +1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. MOVFW CAT /8 РАЗРЯД ФИКТИВНЫЙ, ЧТОБЫ УБРАТЬ МИГАНИЕ /С ИНДИКАТОРА. SUBLW .9 /НЕ БОЛЕЕ 9, BZ CATKO’ /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. 37
Устройства с цифровой индикацией ; ОТ НОМЕРА ВЫБРАННОГО РАЗРЯДА ЗАВИСИТ НАПРАВЛЕНИЕ. ATTKU MOVFW ADDWF ATT PC, 1 ;КУДА ПОЙТИ ПРИ ;УСТАНОВКЕ: GOTO CATUH ;ЧАСЫ-МИНУТЫ. GOTO CATSH ;ШАХМАТЫ, GOTO CATB ;РАБОТА ЧАСОВ. САТКО GOTO CATAL /БУДИЛЬНИК, CLRF CAT ;ОБНУЛЕНИЕ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ / 3. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА. SEGDATA w 04 cn Co ГО ADDWF PCL, F / G, F, E, D, С, B, A. RETLW B' 10111111' / o RETLW B'10000110' . / 1 RETLW B' 11011011' / 2 RETLW B' 11001111' / 3 RETLW B'11100110 ' / 4 RETLW B' 11101101’ / 5 RETLW B' 11111101' / 6 RETLW B' 10000111' / 7 RETLW B' 11111111' / 8 RETLW B'11101111' / 9 RETLW B' 10001000' / 10 НИЖНЯЯ ЧЕРТА. 4 RETLW B'11001000' /11 НИЖНЯЯ И СРЕДНЯЯ ЧЕРТА. RETLW B’ 11001001' /12 НИЖНЯЯ, СРЕДНЯЯ И ВЕРХНЯЯ ЧЕРТА. / 4. КУДА ПОЙТИ = МУЛЬТИПЛЕКСОР. CATUH MOVFW CAT КУДА ПОЙТИ? АТТ=0 ADDWF PC, 1 ЗАВИСИТ ОТ НОМЕРА CAT. GOTO ATTOO ОБНУЛЕНИЕ ЧАСОВ. GOTO MINIM УСТАНОВКА МИНУТ ЧАСОВ. GOTO ACOUOO ОБНУЛЕНИЕ СЧЕТЧИКА СЧИТЫВАНИЯ. GOTO HOU1H УСТАНОВКА ЧАСОВ. GOTO COUEEOO ОБНУЛЕНИЕ СЧЕТЧИКА ЗАПИСИ. GOTO ATTGO ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. CATSH MOVFW CAT КУДА ПОЙТИ? АТТ=1 ADDWF PC,.l ЗАВИСИТ ОТ НОМЕРА CAT. GOTO SHUR УСТАНОВКА МИНУТ ПРАВЫХ ШАХМАТ. GOTO SHUL УСТАНОВКА МИНУТ ЛЕВЫХ ШАХМАТ. GOTO COUEEU УСТАНОВКА И ИНДИКАЦИЯ АДРЕСА ЗАПИСИ GOTO ZAPISE ЗАПИСЬ В ПЗУ. GOTO COUUI УСТАНОВКА И ИНДИКАЦИЯ АДРЕСА СЧИТЫВАНИЯ GOTO АКТ СЧИТЫВАНИЕ ЗАПИСИ. 38
Часы с будильником — шахматные часы GOTO GOTO GOTO SHURLIN ; SHURL ; SH H ; 'ИНДИКАЦИЯ ШАХМАТ, ОБЩАЯ. УСТАНОВКА МИНУТ ШАХМАТ, ОБЩАЯ. ВКЛЮЧЕНИЕ ШАХМАТ. САТВ MOVFW CAT ; КУДА ПОЙТИ? ПРИ УСТАНОВКЕ АТТ=2 ADDWF PC, 1 ; ЗАВИСИТ ОТ НОМЕРА CAT. GOTO ATTK5 • ; РАБОТА: ЧАСЫ. GOTO ATTK5 ; РАБОТА: ЧАСЫ. GOTO ATTK5 ; г РАБОТА: ЧАСЫ. GOTO ATTK5 ; РАБОТА: ЧАСЫ. GOTO ATTK5 ; •РАБОТА: ЧАСЫ. GOTO ATTK5 ; :РАБОТА: ЧАСЫ. GOTO ATTK5 ; г РАБОТА: ЧАСЫ. GOTO ATTK5 ; :РАБОТА: ЧАСЫ. GOTO ATTK5 ; :РАБОТА: ЧАСЫ. CATAL MOVFW CAT ; :КУДА ПОЙТИ? АТТ=3 ADDWF PC, 1 ; ;ЗАВИСИТ ОТ НОМЕРА CAT. GOTO SHOO ; :ОБНУЛЕНИЕ ШАХМАТ. GOTO ALOM ; :УСТАНОВКА И ИНДИКАЦИЯ МИНУТ БУДИЛЬНИКА. GOTO ALOIN. ; :ИНДИКАЦИЯ БУДИЛЬНИКА. GOTO ALOH i :УСТАНОВКА И ИНДИКАЦИЯ ЧАСОВ БУДИЛЬНИКА. GOTO OMON ; :РАБОТА ЧАСОВ С БУДИЛЬНИКОМ. GOTO ATTGO ; :ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO ; :ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO :ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. GOTO ATTGO :ЗАВЕ РШЕНИЕ ПРЕ РЫВАНИЯ. ; 5. ВЫБОР РЕЖИМА УСТАНОВКИ. АТТК :ВО ВРЕМЯ УСТАНОВКИ ЧАСЫ НЕ ОСТАНАВЛИВАЮТСЯ, CALL SI :ПРИ ПЕРЕХОДЕ В МИНУТЫ ПРОПУСК УСТАНОВКИ 1 СЕК INCF ATT,F ;УВЕЛИЧИВАЕМ ЧИСЛО АТРИБУТА. MOVFW ATT SUBLW .4 :ИНДИКАЦИЯ РАЗРЕШЕНА ДО 4 ЦИФРЫ (0-3) . BNZ ATTGO ;ЕСЛИ НЕ РАВНО НУЛЮ, ИДЁМ. CLRF ATT ;ИНАЧЕ ОБНУЛЯЕМ АТРИБУТ. GOTO ATTGO . ;ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; 6. ОБНУЛЕНИЕ. ACOUOO BTFSC PORTB,3 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? GOTO COUUIN /НЕТ - НА ИНДИКАЦИЮ. CLRF ACOU /ОБНУЛЕНИЕ СЧЕТЧИКА СЧИТЫВАНИЯ. GOTO COUUIN /НА ИНДИКАЦИЮ. COUEEOO BCF FLAG,0 /СБРОС ФЛАГА ЗВОНКА. BTFSC PORTB,3 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? GOTO CO_IN /НЕТ - НА ИНДИКАЦИЮ. CLRF COUEE /ОБНУЛЕНИЕ СЧЕТЧИКА ЗАПИСИ. ( GOTO CO IN /НА ИНДИКАЦИЮ. SHOO BTFSC PORTB,3 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? GOTO ATTGO /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. 39
Устройства с цифровой индикацией CLRF CLRF SECM SECMI ';ОБНУЛЯЕМ ;/ CLRF MINM ;/ CLRF MINM1 /РЕГИСТРЫ ШАХМАТ. GOTO SHURLIN /НА ИНДИКАЦИЮ. ATTOO BTFSC PORTB,3 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ATTK5 / НЕТ. CLRF SEC1 /ДА, ОБНУЛЯЕМ ДЛЯ УСТАНОВКИ ЧАСОВ CLRF MINI /ПО СИГНАЛАМ ТОЧНОГО ВРЕМЕНИ CALL , HIN /И ВЫСВЕЧИВАЕМ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ;,7. УСТАНОВКА И СРАВНЕНИЕ БУДИЛЬНИКА. ALOM BTFSC PORTB,3 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ALOIN /НА ИНДИКАЦИЮ. INCF ALAM, 1 /+1 В МИНУТЫ БУДИЛЬНИКА. MOVLW .60 /НЕ БОЛЕЕ 59. SUBWF ALAM, 0 9 BTFSC STATUS,2 CALL ALOOM /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. MOVFW ALAM CALL M1U /СМЕНА ЗНАЧЕНИЙ РЕГИСТРОВ ИНДИКАЦИИ. GOTO ATTGO ;ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ALOH BCF STATUS,2 /НА ВСЯКИЙ СЛУЧАЙ. BTFSC PORTB,3 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ALOIN /НА ИНДИКАЦИЮ. INCF ALAH,1 /+1 В ЧАСЫ БУДИЛЬНИКА. MOVLW .24 /НЕ БОЛЕЕ 23. SUBWF ALAH,0 9 BTFSC STATUS,2 CALL ALOOH /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. MOVFW ALAH CALL H1U /СМЕНА ЗНАЧЕНИЙ РЕГИСТРОВ ИНДИКАЦИИ. • GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ALOOM CLRF ALAM /ОБНУЛЕНИЕ РЕГИСТРА МИНУТ. RETURN 9 ALOOH CLRF ALAH /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. RETURN 9 OMON MOVFW HOU1 /СРАВНЕНИЕ ЗНАЧЕНИЯ РЕГИСТРА ЧАСОВ SUBWF ALAH,0 /И РЕГИСТРА ЧАСОВ БУДИЛЬНИКА. BZ AMON /ЕСЛИ ОНИ РАВНЫ, ИДЕМ СРАВНИВАТЬ МИНУТЫ. GOTO ATTK5 /ИНАЧЕ ИДЕМ НА ИНДИКАЦИЮ В РЕЖИМЕ ЧАСОВ. AMON MOVFW MINI /СРАВНЕНИЕ ЗНАЧЕНИЯ РЕГИСТРА МИНУТ ЧАСОВ SUBWF ALAM,0 /И РЕГИСТРА МИНУТ БУДИЛЬНИКА. 40
Часы с будильником — шахматные часы BZ MONA /ЕСЛИ ОНИ РАВНЫ, ИДЕМ УСТАНАВЛИВАТЬ ФЛАГ ЗВОНКА BCF FLAG,0 ;ИНАЧЕ СБРОСИМ ФЛАГ ЗВОНКА. GOTO ATTK5 /ИДЕМ НА ИНДИКАЦИЮ В РЕЖИМЕ ЧАСОВ. MONA BSF FLAG,0 /УСТАНОВИМ ФЛАГ ЗВОНКА. GOTO ATTK5 /НА ИНДИКАЦИЮ В РЕЖИМЕ ЧАСОВ. ALOIN MOVFW ALAM /ИНДИКАЦИЯ ЗНАЧЕНИЙ CALL M1U /МИНУТ БУДИЛЬНИКА MOVFW ALAH /И ЧАСОВ БУДИЛЬНИКА. CALL H1U / GOTO ATTGO f / 8. ’ УСТАНОВКА ЧАСОВ. MINIM BTFSC PORTB,3 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ATTGO /НЕТ. ' ' CALL M1M /+1 В РЕГИСТР МИНУТ. CALL HIH /НА ИНДИКАЦИЮ ЧАСОВ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. HOU1H BTFSC PORTB,3 /АНАЛОГИЧНО ДЛЯ ЧАСОВ. GOTO ATTGO CALL HIH /+1 В РЕГИСТР ЧАСОВ. CALL HIN /НА ИНДИКАЦИЮ МИНУТ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; 9. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА. HIN MOVFW MINI CALL RETURN M1U /ИНДИКАЦИЯ МИНУТ. HIH MOVFW HOU1 CALL RETURN H1U /ИНДИКАЦИЯ ЧАСОВ. ATTK5 BCF FLAG,3 /РАБОТА В РЕЖИМЕ ЧАСОВ. /СБРОС ФЛАГА ВКЛЮЧЕНИЯ ШАХМАТ BCF FLAG,6 /И ФЛАГА УСТАНОВКИ. CALL HIN /ОБНОВЛЯЕМ ИНДИКАЦИЮ МИНУТ CALL HIH /И ЧАСОВ. GOTO ATTGO ;ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ; 10. ПЕРЕКЛЮЧЕНИЕ: ЧАСЫ-ШАХМАТЫ. SH н BTFSC PORTB,3 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. BCF FLAG,6 /СБРОС ФЛАГА УСТАНОВКИ 41
Устройства с цифровой индикацией ,— BTFSS FLAG,3 /ЕСЛИ ВКЛЮЧЕНЫ ЧАСЫ, GOTO SH Hl /ПЕРЕКЛЮЧИМ НА ШАХМАТЫ. . я BCF FLAG,3 ;И НАОБОРОТ, ВКЛЮЧИМ ЧАСЫ. GOTO ATTK5 /НА ИНДИКАЦИЮ ЧАСОВ. SH_H1 BSF FLAG,3 /ВКЛЮЧЕНИЕ ШАХМАТ. / GOTO SHARIN /НА ИНДИКАЦИЮ ШАХМАТ. ; 11. ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ATTGO BTFSC INTCON,2 /ЕСЛИ НЕТ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА, GOTO RETCONT /ТО ПРОПУСКАЕМ, ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. 9 GOTO COUZIKLO /ИЛИ ИДЕМ НА ИНДИКАЦИЮ. ; 12. УСТАНОВКА ШАХМАТ. SHURL BTFSC PORTB,3 /ЕСЛИ КНОПКА НЕ НАЖАТА, GOTO SHURLIN /ИДЕМ НА ИНДИКАЦИЮ. INCF MINM1,1 /+1 В МИНУТЫ ПРАВЫХ ШАХМАТ. MOVLW .130 /ДО 129 МИНУТ. SUBWF MINM1,0 BZ SHURLO /НА ОБНУЛЕНИЕ. SHURLIN MOVFW MINM1 /ЗНАЧЕНИЕ ПРАВЫХ ШАХМАТ MOVWF Minm /В РЕГИСТР ЛЕВЫХ ШАХМАТ. MOVWF DSMH CALL BINDECH . /ПЕРЕКОДИРУЕМ В 2-10 КОД MOVFW LSMH MOVWF MLO /И ЗАПИШЕМ В РЕГИСТРЫ MOVWF MLO1 /ИНДИКАЦИИ. MOVFW HSMH Г MOVWF MH I 9 MOVWF MHI1 CLRF $LO /СЕКУНДЫ НЕ УСТАНАВЛИВАЮТСЯ, CLRF SHI /А ОБНУЛЯЮТСЯ. CLRF SLO1 9 CLRF SHI1 9 CLRF SECM 9 CLRF SECMI 9 CLRF LSMH 9 CLRF HSMH BSF FLAG,6 ;ФЛАГ УСТАНОВКИ. GOTO ATTGO Г SHURLO CLRF MINM1 /ОБНУЛЕНИЕ ПРАВЫХ CLRF MINM /И ЛЕВЫХ ШАХМАТ. GOTO SHURLIN /НА ИНДИКАЦИЮ. ; УСТАНОВКА ПРАВЫХ ШАХМАТ. 42
Часы с будильником — шахматные часы SHUR BTFSC PORTB,3 /ЕСЛИ КНОПКА HE НАЖАТА, GOTO SHURIN /ИДЕМ НА ИНДИКАЦИЮ. INCF MINM1,1 ;+1 MOVLW .130 9 SUBWF MINM1,0 BZ SHURO • /НА ОБНУЛЕНИЕ. SHURIN MOVFW MINM1 /ЗНАЧЕНИЕ ПРАВЫХ ШАХМАТ MOVWF DSMH CALL BINDECH /ПЕРЕКОДИРУЕМ В 2-10 КОД. MOVFW LSMH MOVWF SLO1 /ЗАПИШЕМ В РЕГИСТРЫ MOVFW HSMH MOVWF SHI1 /ИНДИКАЦИИ МЛАДШИХ РАЗРЯДОВ. MOVLW .10 /- ПРОЧЕРК MOVWF MLO1 /В СТАРШИХ MOVWF MHI1 /РАЗРЯДАХ. CLRF SECM 9 CLRF LSMH 9 CLRF HSMH BSF FLAG,6 /ФЛАГ УСТАНОВКИ. GOTO ATTGO 9 SHURO CLRF MINM1 /ОБНУЛЯЕМ МИНУТЫ ПРАВЫХ ШАХМАТ GOTO SHURIN /НА ИНДИКАЦИЮ. ; УСТАНОВКА ЛЕВЫХ ШАХМАТ. SHUL BTFSC PORTB,3 /АНАЛОГИЧНО GOTO SHULIN /ДЛЯ ЛЕВЫХ ШАХМАТ INCF MINM,1 9 MOVLW .130 9 SUBWF MINM,0 9 BZ SHULO 9 SHULIN MOVFW MINM 9 MOVWF DSMH 9 CALL BINDECH 9 MOVFW LSMH 9 MOVWF MLO 9 MOVFW HSMH 9 MOVWF MH I 9 MOVLW .10 9 “ MOVWF SHI 9 MOVWF SLO t 9 CLRF SECMI 9 CLRF LSMH 9 CLRF HSMH 9 BSF FLAG,6 9 GOTO ATTG& 9 SHULO CLRF MINM 9 43
Устройства с цифровой индикацией 9 GOTO SHULIN ; 13. РАБОТА В РЕЖИМЕ ШАХМАТ SHARL BTFSS FLAG,5 /ЕСЛИ "ПУСК" HE ВКЛЮЧЕН, GOTO SHARIN /ИДЕМ НА ИНДИКАЦИЮ. BTFSS PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ПРАВЫХ ШАХМАТ (=0) GOTO SHAR /ИДЕМ НА ПРАВЫЕ ЧАСЫ. BTFSC PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ЛЕВЫХ ШАХМАТ GOTO SHAL /ИДЕМ НА ЛЕВЫЕ ЧАСЫ. SHAR DECF SECM1,1 /-1 ИЗ РЕГИСТРА СЕКУНД ПРАВЫХ ШАХМАТ. MOVLW .255 ;ЕСЛИ В РЕГИСТРЕ 0, ТО РЕЗУЛЬТАТ =255. SUBWF SECM1,O BZ SHARM /НА СРАВНЕНИЕ МИНУТ. GOTO SHARIN /НА ИНДИКАЦИЮ. SHARM BCF STATUS,2 TSTF MINM1 /ЕСЛИ В РЕГИСТРЕ 0, BZ ALARMR /ИДЕМ НА ВКЛЮЧЕНИЕ ЗВОНКА. MOVLW .59 ;ИНАЧЕ УСТАНОВИМ СЕКУНДЫ =59 MOVWF SECMI DECF MINM1,1 /И ВЫЧТЕМ 1 ИЗ МИНУТ. MOVLW .255 /ЕСЛИ В РЕГИСТРЕ 0, ТО РЕЗУЛЬТАТ =255. SUBWF MINM1,O BZ SHARMO /НА ОБНУЛЕНИЕ МИНУТ. GOTO SHARIN /НА ИНДИКАЦИЮ. SHARMO CLRF MINM1 /ОБНУЛЕНИЕ ПРАВЫХ МИНУТ. GOTO SHARIN /НА ИНДИКАЦИЮ ПРАВЫХ МИНУТ. SHAL DECF SECM,1 /ДЛЯ ЛЕВЫХ ШАХМАТ MOVLW .255 /ВСЕ АНАЛОГИЧНО. SUBWF SECM,0 9 BZ SHALM г GOTO SHALIN 9 SHALM BCF STATUS,2 9 TSTF MINM 9 BZ ALARML 9 MOVLW .59 9 MOVWF SECM 9 DECF MINM,1 9 MOVLW .255 9 SUBWF MINM,0 9 BZ SHALMO 9 GOTO SHALIN 9 SHALMO CLRF MINM 9 GOTO SHALIN 9 SHARIN 44
Часы с будильником — шахматные часы MOVFW SECMI /ИНДИКАЦИЯ ПРАВЫХ ШАХМАТ. MOVWF DSMH CALL BINDECH ;НА ПЕРЕКОДИРОВКУ. MOVFW LSMH MOVWF SLO1 х /ЗНАЧЕНИЕ В МЛАДШИЙ РЕГИСТР СЕКУНД MOVFW ..HSMH MOVWF SHI1 . /ЗНАЧЕНИЕ В СТАРШИЙ РЕГИСТР СЕКУНД CLRF LSMH 9 CLRF HSMH MOVFW MINM1 /АНАЛОГИЧНО С МИНУТАМИ. MOVWF DSMH / CALL BINDECH 9 MOVFW LSMH 9 MOVWF MLO1 9 MOVFW HSMH 9 MOVWF MHI1 9 CLRF LSMH 9 CLRF HSMH BSF FLAG,6 /ФЛАГ УСТАНОВКИ. BTFSS FLAG,5 /ЕСЛИ НЕТ ПУСКА, GOTO SHALIN /ПРОИНДИЦИРУЕМ ЛЕВЫЕ ШАХМАТЫ. GOTO ATTGO 9 SHALIN MOVFW SECM /ИНДИКАЦИЯ ЛЕВЫХ ШАХМАТ. MOVWF DSMH CALL BINDECH /НА ПЕРЕКОДИРОВКУ. MOVFW LSMH MOVWF SLO /ЗНАЧЕНИЕ В МЛАДШИЙ РЕГИСТР СЕКУНД MOVFW HSMH MOVWF SHI /ЗНАЧЕНИЕ В СТАРШИЙ РЕГИСТР СЕКУНД CLRF LSMH 9 CLRF HSMH MOVFW MINM /АНАЛОГИЧНО С МИНУТАМИ. MOVWF DSMH г 9 CALL BINDECH 9 MOVFW LSMH 9 MOVWF MLO 9 MOVFW HSMH 9 MOVWF MH I 9 CLRF LSMH 9 CLRF HSMH BSF FLAG,6 /ФЛАГ УСТАНОВКИ. GOTO ATTGO / 14. ИНДИКАЦИЯ В РЕЖИМЕ ШАХМАТ. SZIKL BSF BTFSC INTCON,7 FLAG,5 /ЧТОБЫ HE ЗАЦИКЛИТЬСЯ, РАЗРЕШАЕМ ПРЕРЫВАНИЯ /ЕСЛИ ПУСК ВКЛЮЧЕН, GOTO SZIKLO /ИДЕМ НА ИНДИКАЦИЮ ШАХМАТ BTFSS FLAG,3 /ЕСЛИ ВКЛЮЧЕНЫ ЧАСЫ, GOTO COUblKLO /ИДЕМ НА ИНДИКАЦИЮ ЧАСОВ. SZIKLO CLRF KATOD /ОБНУЛЯЕМ КАТОД 2-10. 45
Устройства с цифровой индикацией MOVLW 014H /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА МЛАДШЕГО MOVWF SEGD /РАЗРЯДА ШАХМАТ. SDATA BTFSC FLAG,0 /ЕСЛИ ВКЛЮЧЕН ЗВОНОК, BCF KATOD,4 /УСТАНОВИМ В НОЛЬ РАЗРЯД ЗВОНКА. BTFSS FLAG,0 /ЕСЛИ ЗВОНОК ВЫКЛЮЧЕН, BSF KATOD,4 /УСТАНОВИМ В ЕДИНИЦУ РАЗРЯД ЗВОНКА. MOVFW SEGD /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА ДЛЯ ИНДИКАЦИИ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТ В. MOVFW KATOD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ КАТОДА MOVWF PORTA /В ПОРТ А. BCF KATOD,4 /ЕСЛИ РАЗРЯД БЫЛ УСТАНОВЛЕН, ТО СБРОСИМ ИНАЧЕ ;СЧЕТЧИК /БУДЕТ РАБОТАТЬ НЕ ВЕРНО. BTFSS FLAG,5 /ЕСЛИ НЕТ ПУСКА, BSF PORTA,3 /ВКЛЮЧАЕМ ВСЕ ЗАПЯТЫЕ. BTFSC FLAG,5 /ЕСЛИ НАОБОРОТ- BCF PORTA,3 /ВЫКЛЮЧАЕМ ВСЕ ЗАПЯТЫЕ. INCF SEGD,F ;+1 В РЕГИСТР АДРЕСА РАЗРЯДА. INCF KATOD,1 ;+1 В РЕГИСТР КАТОДА. MOVLW .8 /ЗАПИСЬ ЧИСЛА 8-. SUBWF KATOD,0 /ПРОВЕРЯЕМ ЗНАЧЕНИЕ КАТОДА. BC SZIKL /ЕСЛИ РАВНО 0, ИДЕМ. GOTO SDATA /ИНАЧЕ ИДЕМ СВЕТИТЬ. ; 15. ПП. ИНДИКАЦИИ С ВЫХОДОМ 0-7; 0-3. COUZIKLO ; ЕСЛИ ВКЛЮЧЕН ПУСК ШАХМАТ, BTFSC FLAG,5 GOTO SZIKL ; ИДЕМ НА ИНДИКАЦИЮ ШАХМАТ. BTFSC FLAG,3 /ЕСЛИ ВКЛЮЧЕНЫ ШАХМАТЫ, GOTO SZIKL / ИДЕМ НА ИНДИКАЦИЮ ШАХМАТ. BTFSC FLAG,6 ; ЕСЛИ ВКЛЮЧЕНА УСТАНОВКА, GOTO ' ZIKL /ИДЕМ НА ИНДИКАЦИЮ В РЕЖИМЕ УСТАНОВКИ (ВСЕ ;РАЗРЯДЫ). CO 0 MOVLW 010H /ЗАПИСЬ НОМЕРА РЕГИСТРА ЕДИНИЦ МИНУТ MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. GOTO ZIKL1 Г ZIKL MOVLW 014H /ЗАПИСЬ НОМЕРА РЕГИСТРА ЕДИНИЦ СЕКУНД MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. ’ ZIKL1 BSF INTCON,7 /ЧТОБЫ НЕ ПРОПУСТИТЬ ПРЕРЫВАНИЕ. CLRF KATOD /ОБНУЛЯЕМ КАТОД 2-10. COUZ MOVFW KATOD /СРАВНИМ НОМЕР КАТОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT, 0 /РАЗРЯДА МИГАНИЯ. BNZ COUZ1 /ПЕРЕХОД ЕСЛИ НЕ НОЛЬ. INCF COUI,1 ;+1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. 46
Часы с будильником — шахматные часы MOVLW SUBWF .5 COUI,0 /5- ДЛЯ ОРГАНИЗАЦИИ МИГАНИЯ /ВЫБРАННОГО РАЗРЯДА. BNC COUZ1 /ЕСЛИ НЕ РАВНО 0, ИДЕМ БЕЗ ГАШЕНИЯ MOVLW .10 /0-5 -НЕТ ГАШЕНИЯ SUBWF COUI,0 /5-10 -ЕСТЬ ГАШЕНИЕ BNZ COUZ2 /МИГАНИЕ ЧАСТОТОЙ ОКОЛО 3 Гц. CLRF COUI /ОБНУЛИМ СЧЕТЧИК ЦИКЛОВ. GOTO COUZ1 f COUZ 2 BSF FLAG,2 /ЕСТЬ ГАШЕНИЕ. GOTO INDCO f COUZ1 BCF FLAG,2 /СБРОСИМ ФЛАГ ГАШЕНИЯ В 0. INDCO MOVFW KATOD /ЕСЛИ РАЗРЯДЫ СОВПАДАЮТ, SUBWF ATT, 0 /\ BNZ GDATA ' /ИДЕМ- СВЕТИТЬ С ЗАПЯТОЙ. BSF FLAG, 4 /ФЛАГ ЗАПЯТОЙ. GDATA BTFSC FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА ВКЛЮЧЕН, BCF KATOD,4 /ОБНУЛИМ РАЗРЯД (ВКЛ.ЗВОНКА). BTFSS FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА ВЫКЛЮЧЕН, BSF KATOD,4 /УСТАНОВИМ РАЗРЯД (ВЫКЛ.ЗВОНКА). MOVFW SEGD /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА ДЛЯ ИНДИКАЦИИ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ BTFSC FLAG,2 /ЕСЛИ ЕСТЬ ГАШЕНИЕ,' MOVLW B'10000000' /ГАСИМ СЕГМЕНТЫ. MOVWF PORTB /В ПОРТ В. MOVFW KATOD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ КАТОДА. MOVWF PORTA /В ПОРТ А BTFSC FLAG,4 /ЕСЛИ ФЛАГ =1, BSF PORTA,3 /ВКЛЮЧИТЬ ЗАПЯТУЮ. BTFSS FLAG,4 /ЕСЛИ ФЛАГ =0, BCF PORTA,3 /ВЫКЛЮЧИТЬ ЗАПЯТУЮ. BCF FLAG,4 /СБРОСИМ ФЛАГ ЗАПЯТОЙ. BCF KATOD,4 /ЕСЛИ РАЗРЯД БЫЛ УСТАНОВЛЕН, ТО СБРОДИМ ИНАЧЕ /СЧЕТЧИК /БУДЕТ РАБОТАТЬ НЕ ВЕРНО. INCF SEGD,F /+1 В РЕГИСТР АДРЕСА РАЗРЯДА. INCF KATOD,1 ,-+1 В РЕГИСТР КАТОДА. BTFSC FLAG,6 /ЕСЛИ РАБОТАЕМ НА УСТАНОВКЕ, GOTO INDU /ВКЛЮЧАЕМ ВСЕ РАЗРЯДЫ. BTFSC FLAG,5 /ЕСЛИ РАБОТА В РЕЖИМЕ ШАХМАТ, GOTO INDU /ТОЖЕ ВКЛЮЧАЕМ ВСЕ РАЗРЯДЫ. BTFSS FLAG,3 /ПРИ РАБОТЕ В РЕЖИМЕ ЧАСОВ GOTO INDH /ВКЛЮЧАЕМ 4 ПРАВЫХ РАЗРЯДА. INDU MOVLW .8 /ЗАПИСЬ ЧИСЛА 8-. SUBWF KAT Ob, 0 /ПРОВЕРЯЕМ ЗНАЧЕНИЕ КАТОДА. BC COUZIKLO /ЕСЛИ РАВНО 0, ИДЕМ, GOTO COUZ /ИНАЧЕ ИДЕМ СВЕТИТЬ. 47
Устройства с цифровой индикацией INDH MOVLW .4 SUBWF KATOD, 0 /ПРОВЕРЯЕМ ЗНАЧЕНИЕ КАТОДА. BZ COUZIKLO /ЕСЛИ РАВНО 0, ИДЕМ, GOTO COUZ /ИНАЧЕ ИДЕМ СВЕТИТЬ. / 15. ВКЛЮЧЕНИЕ ЗВОНКА. ALARMR BTFSS 'FLAG, 5 /ЗВОНОК HE РАБОТАЕТ. GOTO ATTGO /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. BSF FLAG,0 /ИНАЧЕ УСТАНОВИМ ФЛАГ ЗВОНКА = 1. CLRF SECMI /СБРОС, ЧТОБЫ НЕ СВЕТИТЬ CLRF MINM1 /ЧИСЛА ТИПА 255. GOTO SHARIN /НА ИНДИКАЦИИ СРАБАТЫВАЕТ ГЕНЕРАТОР ALARML BTFSS FLAG,5 /ЗВОНОК НЕ РАБОТАЕТ. GOTO ATTGO /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. BSF FLAG,0 /ИНАЧЕ УСТАНОВИМ ФЛАГ ЗВОНКА = 1. CLRF SECM /СБРОС, ЧТОБЫ НЕ СВЕТИТЬ CLRF ftlNM /ЧИСЛА ТИПА 255. GOTO SHALIN /НА ИНДИКАЦИИ СРАБАТЫВАЕТ ГЕНЕРАТОР ; 17. ПП. ПЕРЕКОДИРОВКИ С БИНАРНОГО В 2-10 КОД (2-_-2-10). BINDECH MOVLW .10 /10 >W. BDH BSF STATUS,0 /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH. BNC BINDECL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH /ПОВТОРИТЬ. BINDECL MOVF DSMH,0 ADDLW .10 ,-10+W >w. MOVWF LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. RETURN Г / 18. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. COUNT MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUSJTEMP MOVFW FSR /FSR. MOVWF FSR_TEMP MOVLW B’00000000’ ;ГАШЕНИЕ ИНДИКАЦИИ MOVWF. PORTB /НА ВРЕМЯ ПРЕРЫВАНИЯ. BSF STATUS,5 MOVLW B’10001111’ /РАЗРЕШАЕМ ВХОДА RB0-RB3 MOVWF TRISBA80H /ДЛЯ СЧИТЫВАНИЯ СОСТОЯНИЯ КНОПОК. BCF STATUS,5 GOTO KEY /НА ОПРОС КЛАВИАТУРЫ. 48
Часы с будильником — шахматные часы RETCONT /ВОССТАНОВЛЕНИЕ,СОХРАНЕННЫХ ЗНАЧЕНИЙ. BSF STATUS,5 MOVLW B' 10000000' /НА ВЫХОД СЕГМЕНТОВ. MOVWF TRISBA80H Г BCF STATUS,5 BCF INTCON,2 /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА MOVFW STATUS TEMP /(РАЗРЕШАЕМ ПРЕРЫВАНИЯ). /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR TEMP MOVWF FSR / FSR, MOVFW W TEMP ,-w. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 19. ЗАПИСЬ В ПАМЯТЬ. ZAPISE BSF FLAG,6 /ФЛАГ УСТАНОВКИ. BTFSC PORTB,3 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? GOTO ATTGO / НЕТ. MOVFW COUEE /ЗНАЧЕНИЕ СЧЕТЧИКА АДРЕСА MOVWF EEADR /В АДРЕС ЗАПИСИ. MOVFW MINM1 /ЗНАЧЕНИЕ ПРАВЫХ ШАХМАТ. MOVWF EEDATA /ЗАПИСЫВАЕМ. BCF INTCON,GIE /ЗАПРЕТ ПРЕРЫВАНИЙ. BSF STATUS,RPO /БАНК 1. BSF EECON1A80H, WREN /РАЗРЕШЕНИЕ ЗАПИСИ. MOVLW 55H /ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ MOVWF EECON2A80H // MOVLW 0AAH // MOVWF EECON2A80H // BSF EECON1A80H, , WR /ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ. ZAPIZ BTFSS EECON1A80H, ,4 /ПОКА НЕ БУДЕТ ЗАКОНЧЕНА ЗАПИСЬ GOTO ZAPIZ /ХОДИМ ПО КРУГУ. BCF INTCON,6 /ЗАПРЕТ ПРЕРЫВАНИЯ ПО ЗАПИСИ В ПАМЯТЬ. BCF EECON1A80H, ,4 / BCF EECON1A80H, .WREN /ЗАПРЕТ ЗАПИСИ.2 BCF STATUS,RPO /БАНК 0. GOTO SHURIN / 20. УСТАНОВКА АДРЕСА ЗАПИСИ COUEEU BTFSC PORTB,3 GOTO CO_IN INCF COUEE,1 MOVFW COUEE SUBLW .64 BZ EECNOO GOTO CO_IN EECNOO CLRF COUEE /НА ИНДИКАЦИЮ. ЕСЛИ КНОПКА УСТАНОВКИ НЕ НАЖАТА, ИДЕМ НА ИНДИКАЦИЮ. +1 В СЧЕТЧИК АДРЕСА ЗАПИСИ. НЕ БОЛЕЕ 63. ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. ИДЕМ НА ИНДИКАЦИЮ. ОБНУЛЯЕМ СЧЕТЧИК АДРЕСА ЗАПИСИ. 49
Устройства с цифровой индикацией CO_IN BSF FLAG,6 ;ФЛАГ УСТАНОВКИ. MOVFW COUEE CALL M1U /ИНДИКАЦИЯ АДРЕСА ЗАПИСИ НА МЕСТЕ СЕКУНД MOVFW M_LOW MOVWF SLO /ЛЕВОГО РАЗРЯДА. MOVFW M_HIGH / MOVWF SHI MOVLW .10 /НА МЕСТЕ МИНУТ ЛЕВОГО РАЗРЯДА MOVWF MLO /ВЫСВЕЧИВАЕТСЯ ПРОЧЕРК. MOVWF MH I GOTO ATTGO / /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. ; 21. УСТАНОВКА АДРЕСА СЧИТЫВАНИЯ. COUUI BTFSC PORTB,3 /ЕСЛИ КНОПКА УСТАНОВКИ HE НАЖАТА, GOTO COUUIN /ИДЕМ НА ИНДИКАЦИЮ. INCF ACOU,1 /+1 В СЧЕТЧИК АДРЕСА СЧИТЫВАНИЯ. MOVLW .64 /НЕ БОЛЕЕ 63. SUBWF ACOU,0 /НА ОБНУЛЕНИЕ. BZ COUUIO /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. GOTO COUUIN /ИЛИ ИДЕМ НА ИНДИКАЦИЮ. COUUIO CLRF ACOU /ОБНУЛИЛИ. COUUIN BSF FLAG,6 /ФЛАГ УСТАНОВКИ. MOVFW ACOU CALL H1U /ИНДИКАЦИЯ АДРЕСА СЧИТЫВАНИЯ MOVFW H_LOW /НА МЕСТЕ СЕКУНД MOVWF SLO1 /ПРАВОГО РАЗРЯДА. MOVFW H_HIGH Г MOVWF SHI1 MOVLW .10 /НА МЕСТЕ МИНУТ ПРАВОГО РАЗРЯДА MOVWF MLO1 /ВЫСВЕЧИВАЕТСЯ ПРОЧЕРК. MOVWF MHI1 GOTO ATTGO /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. ; 22. ЧТЕНИЕ'ЗАПИСИ. АКТ BTFSC PORTB,3 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? GOTO ATTGO /ЕСЛИ НЕТ, ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ АКТЕТЕ MOVFW ACOU /ЗАГРУЗКА АДРЕСА. MOVWF 'EEADR BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,RD /ЧТЕНИЕ. BCF STATUS,RPO /БАНК 0. MOVLW .255 /ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА, SUBWF EEDATA,0 /ЗАПИШЕМ -0. BTFSC STATUS,Z Г GOTO AKTETEO f MOVFW EEDATA f 50
Часы с будильником — шахматные часы АКТЕОО MOVWF MINM1 /ЗАПИСЬ В РЕГИСТР МИНУТ MOVWF MINM 7 GOTO SHULIN г АКТЕТЕО MOVLW .0 ;-о. GOTO АКТЕ00 / ; 23. СЧЕТ И ПЕРЕКОДИРОВКА РЕГИСТРОВ Ч-М-С-Д. S1 MOVFW SEC1 /ЗАГРУЗКА ЗНАЧЕНИЙ СЕКУНД В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml INCF SEC1,F /ИНАЧЕ ПРИБАВИТЬ 1 В РЕГИСТР СЕКУНД. RETURN ; ОБНУЛЕНИЕ. Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. / +1 В РЕГИСТР МИНУТ. М1М MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1 INCF MINI,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /MINI >W. / ПЕРЕКОДИРОВКА 2_2-10 И ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. M1U MOVWF DSMH ,-W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. ПЕРЕКОДИРОВКИ. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF M_LOW ,’W > M_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ, MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF M_HIGH ,-W > M_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП.. CLRF RETURN LSMH ;ОБНУЛЕНИЕ МЛ. РЕГ. ПП.. f ; ОБНУЛЕНИЕ. Hl CLRF MINI /ОБНУЛЯЕМ РЕГИСТР МИНУТ. CLRF M_LOW /ОБНУЛЯЕМ ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. CLRF M_HIGH /ОБНУЛЯЕМ ДЕСЯТКИ МИНУТ ИНДИКАЦИИ. / +1 В РЕГИСТР 1 ЧАСОВ. Н1Н MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H /- 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. MOVFW HOU1 /HOU >W. / ПЕРЕКОДИРОВКА 2_2-10*И ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. H1U MOVWF DSMH /W >DSMH. 51
Устройства с цифровой индикацией CALL BINDECH /ПЕРЕХОД В ПП.. MOVFW LSMH ;LSMH >W ВРЕМЕННЫЙ. MOVWF H_LOW ;W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF H_HIGH ;W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП.. CLRF LSMH ;ОБНУЛЕНИЕ МЛ. РЕГ. ПП.. RETURN Г H10 CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF H_LOW /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF H_HIGH /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. GOTO ATTGO END Регистратор событий Это устройство сделано для скрытого наблюдения за объектами, которые могут подвергаться несанкционированному вторжению посторонних лиц. Оно может быть также применено для регистрации на магнитные носители ка- ких-либо звуковых событий с запоминанием времени (часы, минуты) и даты (число, месяц). Для регистрации супружеской измены датчик колебаний уста- навливается под матрасом кровати. Устанавливая различные датчики: вибра- ции, движения, нагрузки и т. п., можно зарегистрировать в энергонезависимой памяти микроконтроллера 16 событий. В устройстве применяется система дис- танционного управления с динамическим кодом фирмы «Меджик системе» ти- па MSRF-3K (http://www.magicsys.spb.ru). Блок-схема регистратора показана на рис. 12. Сигнал с датчика поступает на регистратор. Регистратор может быть запрограммирован на прохождение определенного числа импульсов за определенное время в секундах. При про- хождении нужного числа импульсов за выбранное время регистратор зафикси- рует время и дату происшедшего события. Вначале события регистратор выдаст на брелок-передатчик импульс длительностью 0,8 секунды. Поскольку один и Рис. 12. Блок-схема регистратора событий 52
Регистра тор событий тот же вход регистратора является и его выходом, между регистратором и бре- локом установлен селектор импульсов. Селектор пропускает импульсы длите- льностью не менее 0,7 секунды. Через время, запрограммированное (в мину- тах) пользователем в регистраторе, выдается еще один импульс длительностью 0,8 секунды. Брелок в свою очередь запрограммирован пользователем на рабо- ту в триггерном режиме. Поэтому по первому импульсу с регистратора брелок передаст серию импульсов и приемник основного блока MSRF-3K включит диктофон или видеокамеру. По второму импульсу включенное устройство вы- ключается. Если вам не нужна регистрация события на диктофон или видеока- меру, то можно обойтись без системы дистанционного управления. При про- верке происшедшего события к регистратору подключается четырехразрядный семисегментный индикатор со своим блоком питания. Характеристики регистратора Длительность импульсов с датчика: не менее........30 мс, не более.........0,5 с Регистрация события в минутах, поэтому максимальная погрешность:.................................+59 с Количество программируемых импульсов до начала регистрации: . 1—20 Время прохождения импульсов до начала регистрации:........1—20 с Время включения второго импульса:.........................1—20 мин Возможна непрерывная работа в режиме электронных часов. Алгоритм программы регистратора представлен на рис. 13. В микроконтрол- лере PIC16F84A используется два прерывания: прерывание по переполнению таймера TMR0, и прерывание по изменению сигнала на входе порта В. Пере- полнение таймера происходит каждую секунду. В это время опрашивается со- стояние кнопок, и производятся необходимые установки. При нажатии двух кнопок установки происходит считывание памяти и заполнение регистров ин- дикации. Для упрощения алгоритм программы в режимах установки и часов на рис. 13 не показан, так как он мало чем отличается от алгоритма программы шахматных часов. Естественно, результат при нажатии кнопок другой. Функ- ции кнопок будут описаны ниже. Прерывание по изменению сигнала на входе порта В происходит в момент прихода импульса с датчика. Если это первый импульс, то он записывается в счетчик входных импульсов. Далее значение счетчика сравнивается с установ- ленным значением количества импульсов. Если значения не равны, записи в память не происходит. Если в течение времени в секундах (установленное ва- ми) значения счетчиков импульсов с датчика и запрограммированного не срав- няются, счетчик обнулится и следующий цикл сравнения начнется с нуля. Та- кое усложнение необходимо, если используется вибрационный датчик или дат- чик колебаний. В этом х случае будут исключены случайные срабатывания регистратора. В случае равенства значений счетчиков происходит запись в па- мять микроконтроллера даты, месяца, часов и минут, когда состоялось собы- тие. При этом устанавливается флаг формирования выходного импульса, а в программе индикации бформируется импульс длительностью 0,8 секунды. Во время формирования импульса индикация не производится. Этот импульс включит кнопку брелока, и основной блок MSRF-3K включит диктофон или 53
Устройства с цифровой индикацией Рис. 13. Алгоритм программы регистратора событий видеокамеру. В это время включается минутный счетчик времени регистрации. При равенстве значений счетчиков прошедшего времени и установленного снова сформируется импульс длительностью 0,8 секунды. Этот импульс опять включит кнопку брелока, запрограммированного на триггерный режим. То есть фактически основной блок выключит диктофон или видеокамеру. Установка при инициализации (по умолчанию) один импульс за одну се- кунду с регистрацией в одну минуту. Здесь необходимо вспомнить, что по- грешность регистрации составляет 59 секунд. То есть регистрация может длить- ся 1 секунду. Поэтому рекомендуемое минимальное время регистрации 2 ми- нуты. На рис. 14 показана схема регистратора с селектором импульсов и брелоком, от которого использована только настроенная плата без кнопок. Выход DP2.3 подключается к кнопке (кнопка удалена!) передатчика MSRF-3K, — выход на- строен на работу в триггерном режиме. Выводы порта В RBO—RB6 запрограм- мированы на выход значений сегментов индикатора. Выводы RBI, RB2 по пре- 54
Регистратор событий Рис. 14. Регистратор событий рыванию используются как входы кнопок «Режим» и «Установка». Вывод RB7 используется как вход с прерыванием от датчика SF1 и выход, нагруженный се- лектором импульсов, собранном на микросхеме DD2. Выводы порта А RAO—RA3 запрограммированы на , вывод переключения разрядов индикатора при динамической индикации. Вывод RA4 переключает положение запятой при установке режима работы и определяет значение индикатора при считывании. Кроме того, он используется как вход кнопки «Разряд». Условно датчик на схе- ме обозначен как геркон, хотя это может быть любой датчик, формирующий необходимую для регистрации длительность импульса. В программе заложено подавление дребезга контактов длительностью около 24 мс. Поэтому минималь- ная длительность импульса регистрации должна быть больше этого времени. При использовании датчика колебаний на герконе это условие выполняется. Необходимо заметить, что регистрируется импульс с нулевым потенциалом. Селектор импульсов представляет собой схему, которая обычно использует- ся для подавления дребезга контактов. Импульсы, длительность которых менее 0,7 секунды, не проходят на выход. Выходной импульс с микроконтроллера имеет низкий уровень, а кнопка брелока замыкается на плюс питания, поэтому элемент DD2.3 инвертирует входной импульс. Брелок имеет свой элемент пи- тания типа А23 или А27 на напряжение 12 В. Но микроконтроллер передатчика брелока работает на напряжении 5 В. Поэтому согласования уровней не требу- ется — брелок устойчиво срабатывает при падении напряжении питания мик- роконтроллера регистратора до 3 В. Чтобы работа регистратора не влияла на дальность действия передатчика брелока, для питания регистратора использу- ются свои элементы GB1. Поскольку микроконтроллер работает на малой час- тоте, потребляемый им ток составляет около сотни микроампер. Перевод мик- роконтроллера в «спящий» режим невозможен. На рис. 15 показана схема соединения индикаторов и кнопок управления с разъемом ХР1. Потребляемый ток с включенными индикаторами составляет 55
Устройства с цифровой индикацией Рис. 15. Регистратор событий. Индикатор около 30 мА, поэтому плата индикаторов имеет свои элементы питания. Рези- стор R1 является нагрузочным для вывода RA4, работающего как выход с от- крытым стоком. Диоды VD1—VD4 исключают влияние уровней порта В и кно- пок на выходы порта А. Плата индикаторов подключается к плате регистратора на время установок режимов работы и на время считывания результата регист- рации. Подключение можно сделать на любом доступном разъеме. Если реги- стратор будет использоваться как часы, то схему регистратора и индикатора можно объединить на одной плате и запитывать от стабилизированного блока питания на 5 В. Из-за простоты схемы и индивидуальности разъемов печатные платы на схемы не приводятся. Назначение кнопок управления: ТА1 — «Разряд» — выбор мигающего разряда установки; ТА2 — «Режим» — переключение запятой; ТАЗ — «Установка» — плюс (минус) единица в выбранный разряд. Функции, выполняемые регистратором при нажатии кнопок установки: ч Запятая в нулевом разряде (при выборе мигающего разряда) 0 — индикация числа и месяца; 1 — установка минут; 2 — обнуление часов; 3 — установка часов. 56
Регистратор событий Запятая в первом разряде О — установка числа импульсов до начала регистрации; 1 — установка месяца; 2 — индикация числа и месяца; 3 — установка числа. При запятой во втором разряде и любом выбранном разряде идет работа в режиме часов. Запятая в третьем разряде О — индикация числа импульсов до начала регистрации; 1 — установка времени прохождения импульсов с датчика в секундах; 2 — установка адреса окончания записи; 3 — установка времени включения диктофона (второго импульса 0,8 сек) в минутах. При установке месяца и времени в секундах формат индикации - - 01. Но если значение числа месяца устанавливается прибавлением единицы, то уста- новка времени в секундах — вычитанием единицы. Следующее за единицей число времени в секундах будет 20. Аналогично выполняется установка числа и времени в минутах, но формат индикации 01 - Считывание информации из памяти регистратора происходит при одновре- менном нажатии двух кнопок: «Режим» и «Разряд». При этом на индикаторе появится - - 0,8. Запятая в первом разряде говорит, что индицируется адрес окончания записи. При нажатии кнопки «Режим» запятая переместится в ну- левой разряд, а индикация будет во втором и третьем разрядах с прочерками в нулевом и первом разрядах. В этих разрядах будет высвечиваться адрес считы- вания. При очередном нажатии кнопки «Режим» запятая переместится во вто- рой разряд. На табло будут считанные показания числа и месяца. Следующее нажатие кнопки «Режим» уберет запятую с индикатора, что соответствует ин- дикации часов и минут. При индикации адреса считывания и нажатии кнопки «Установка», значение адреса увеличивается на 4. При равенстве адреса считы- вания й адреса конца записи нажатие кнопки «Установка» приведет к выходу из режима считывания в режим часов. Если записи не было, то считывания не произойдет. Предусмотрена установка окончания адреса записи с дискретно- стью 4. Устанавливая число 60, можно просмотреть все ранее записанные зна- чения. В этой ситуации надо помнить, что следующая запись начнется с уста- новленного адреса. Коротко о технических характеристиках системы дистанционного управления MSRF-3K Число каналов управления....................................3 Уверенная дальность управления с брелоком без антенны .......40 м Дальность управления брелоком с телескопической антенной ....100 м Напряжение питания основного блока..........................9—15 В Напряжение питания радиобрелока.............:...............12 В Напряжение питания нагрузок выходов основного блока, не более . . 25 В Ток потребления основного блока, не более....................20 мА Ток покоя радиобрелока, не более ............................1 мкА Мощность излучения радиобрелока, не более...................5 мВт Максимальный коммутируемый ток, не более ...................0,6 А 57
Устройства с цифровой индикацией' Каналы управления можно запрограммировать на работу: в потенциальном режиме (срабатывание, пока нажата кнопка); в импульсном режиме (замыка- ние ключа на 0,7 секунды); в триггерном режиме (каждая команда изменяет состояние ключа); без реакции. Срабатывание выходного транзисторного клю- ча происходит на общий провод (-12 В). Некоторые диктофоны имеют вход для их электронного включения. Видео- камеры лучше включать посредством пульта дистанционного управления. ; ЛИСТИНГ ПРОГРАММЫ "REGISTRATOR" ; РЕГИСТРАТОР СОБЫТИЙ С ЧАСАМИ, ДНЯМИ, МЕСЯЦАМИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ ИЗГОТОВЛЕНИЯ РАДИОЛЮБИТЕЛЯМИ ДЛЯ СЕБЯ. ; ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ, ; saes@mail.ru. #INCLUDE P16F84A.INC ___CONFIG 3FF0 ; 11111111110000 ; 0,1-РАЗРЯДЫ ГЕНЕРАТОРА, 00- 32-200 КГЦ. ; 2- WDTE, 0- ВЫКЛ. ; 3- PWRTE, 0- ВКЛ. ; 4-13 ЗАЩИТА КОДА. 1- НЕТ ЗАЩИТЫ. ; ДЕЛЕЖ ПИРОГА. INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H- ;TMR0. OPTIONR EQU 01H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H 9 PORTB EQU 06H 9 INTCON EQU 0BH 9 DAY1 EQU 0CH /ЧИСЛО СЧЕТЧИКА.' MON EQU 0DH /МЕСЯЦ. HOU1 EQU oeh /ЧАСЫ СЧЕТЧИКА. MINI EQU ofh /МИНУТЫ СЧЕТЧИКА. SEC1 EQU 010H /СЕКУНДЫ СЧЕТЧИКА. CAUK EQU 011H /СЧЕТЧИК ПРЕРЫВАНИЙ. M_LOW EQU 012H /ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. M_HIGH EQU 013H /ДЕСЯТКИ МИНУТ ИНДИКАЦИИ. H_LOW EQU 014H /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ. H_HIGH EQU 015H /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ. ATT EQU 018H /ПРИЗНАК (АТРИБУТ) УСТАНОВКИ. CAU EQU 019H /РЕГИСТР УСТАНОВКИ ПРЕРЫВАНИЙ ЗА 10 СЕК. ACOU EQU 01AH /СЧЕТЧИК АДРЕСА ПАМЯТИ ПРИ СЧИТЫВАНИИ И ЗАПИСИ KATOD EQU 01BH /= АНОДУ, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ (ОБЩИЙ ЭЛЕКТРОД) COUI EQU 01CH /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. 58
Регистратор событий ; ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ РЕГИСТРА FLAG. FLAG EQU 01DH ; О- ФОРМИРОВАНИЯ ИМПУЛЬСА EXE, ; 1- СЧИТЫВАНИЯ ДЛЯ АТТ, ; 2- ГАШЕНИЯ РАЗРЯДА, ; 3- ЗАПИСЬ МИНУТ, ; 4- НАЧАЛА ОТСЧЕТА СЕКУНД, ; 5- ФЛАГ ЗАПЯТОЙ, ; 7- ОБНУЛЕНИЕ СЧЕТЧИКА СЧИТЫВАНИЯ. ANOD EQU 01EH /АНОД, ПОЗИЦИОННОЕ ЗНАЧЕНИЕ. SEGD EQU 01FH /РЕГИСТР АДРЕСА РАЗРЯДА ИНДИКАЦИИ. CAT EQU 020H /УСТАНОВКА РАЗРЯДА МИГАНИЯ. COU10S EQU 021H /РЕГИСТР ВРЕМЕНИ ВХ. ПРЕРЫВАНИЙ В СЕК. COU10M EQU 022H /РЕГИСТР ДЛИТЕЛЬНОСТИ EXE В МИНУТАХ. ATTZ EQU 023H /РЕГИСТР РАЗРЯДА ИНДИКАЦИИ ЗАПЯТОЙ. W_TEMP EQU 024H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 025H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ DSMH EQU 026H /БАЙТ АДРЕСАЦИИ В ПП. LSMH EQU 027H /МЛАДШИЙ БАЙТ В ПОДПРОГРАММЕ. HSMH EQU 028H /СТАРШИЙ БАЙТ В ПП. FSR_TEMP EQU 029H /ВРЕМЕННЫЙ ДЛЯ FSR. COUEE EQU 02 AH /СЧЕТЧИК ЗАПИСИ. MIN10 EQU 02BH /РЕГИСТР ВЫДЕРЖКИ МИНУТ. DMHM EQU 02CH /ВРЕМЕННЫЙ ПРИ ЗАПИСИ. CAUCOU EQU 02DH /СЧЕТЧИК ВЫДЕРЖКИ СЕКУНД. ABC DE EQU 02EH /ВРЕМЕННЫЙ РЕГИСТР ЗАПИСИ КОСВЕННОГО АДРЕСА. EEDATAD EQU ОЗОН /РЕГИСТР СЧИТЫВАНИЯ ДНЕЙ. EEDATAM EQU 031H /РЕГИСТР СЧИТЫВАНИЯ МЕСЯЦА. EEDATAH EQU 032H /'РЕГИСТР СЧИТЫВАНИЯ ЧАСОВ. EEDAMIN EQU 033H /РЕГИСТР СЧИТЫВАНИЯ МИНУТ. ; ПУСК. ORG О GOTO INIT ORG 4 BTFSC INTCON,RBIF ;0? GOTO ZAPISI BTFSC INTCON,2 GOTO COUNT ; ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO ;БАНК 1. MOVLW В'00000100' -/ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100. MOVWF OPTION_REGA80H MOVLW В'10101000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ. ТАЙМЕРА, MOVWF INTCON /ИЗМЕНЕНИЮ СИГНАЛА PORTB. 59
Устройства с цифровой индикацией MOVLW В'00000000' /RA0-RA4-HA ВЫХОД. MOVWF TRISAA80H MOVLW В'10000000' /RB0-RB6-HA ВЫХОД, RB7-BXOfl. MOVWF TRI SB"18 ОН BCF STATUS,RPO /БАНК 0. CLRF ACOU ;ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ. CLRF TMR0 CLRF SEC1 CLRF MINI CLRF HOU1 CLRF M_LOW CLRF M_HIGH CLRF H_LOW CLRF H_HIGH CLRF HSMH CLRF LSMH CLRF DMHM CLRF COUEE CLRF ATT CLRF CAUK CLRF CAUCOU CLRF MIN10 CLRF CAT CLRF FLAG MOVLW .1 MOVWF MON ;МЕСЯЦ=1. MOVWF DAY1 ;ЧИСЛО=1. MOVWF COUIOS /РЕГИСТР ПРЕРЫВАНИЙ ЗА СЕКУНД=1. MOVWF COU10M ;РЕГИСТР EXE =МИНУТ=1. MOVWF CAU /ПО УМОЛЧАНИЮ 1 ПРЕРЫВАНИЕ ЗА 1 СЕК ; 1. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. KEY /ПРОВЕРЯЕМ НАЖАТИЕ 2 КНОПОК НА СЧИТЫВАНИЕ. COMF PORTB,W /ЗАГРУЖАЕМ ПОРТ С ИНВЕРСИЕЙ. XORLW B' 00000110'* /СРАВНИВАЕМ. BTFSC STATUS,Z /ЕСЛИ РАВНО 1, BSF FLAG,1 /УСТАНАВЛИВАЕМ ФЛАГ СЧИТЫВАНИЯ. COMF PORTB,W /ЕЩЕ РАЗ ЗАГРУЖАЕМ ПОРТ С ИНВЕРСИЕЙ. XORLW B'10000110' /СРАВНИВАЕМ. BTFSC STATUS,Z /ЕСЛИ РАВНО 0, BSF FLAG,1 /ПРОПУСКАЕМ, ИЛИ СТАВИМ ФЛАГ СЧИТЫВАНИЯ BTFSC FLAG,1 /ВОЗМОЖНО РАНЕЕ БЫЛ УСТАНОВЛЕН ФЛАГ? GOTO АКТ /ЕСЛИ ДА, ИДЕМ. BTFSS PORTB,1 ’ /ВКЛЮЧЕН ЛИ ВЫБОР РЕЖИМА УСТАНОВКИ? / GOTO ATTK ;ДА. ’ GOTO CATK ; НЕТ. ; 2. ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАЮЩЕГО РАЗРЯДА). САТК CALL SI /+1 В СЕКУНДЫ BTFSC PORTB,2 / 0? GOTO CATKU / НЕТ. 60
Регистратор событий INCF CAT, 1 /ДА, +1 В СЧЕТЧИК УСТАНОВКИ MOVFW CAT SUBLW .5 ;НЕ БОЛЕЕ 4, BZ CATKO ;ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. GOTO CATKU ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. MOVFW CAT /КУДА ПОЙТИ ПРИ ADDWF PC, 1 /УСТАНОВКЕ: GOTO ATTIN /ИНДИКАЦИЯ, GOTO ATTUM /УСТАНОВКА МИНУТ, GOTO ATTB /УСТАНОВКА, GOTO ATTUH /УСТАНОВКА ЧАСОВ, GOTO CATKO ATTIN /ИНДИКАЦИЯ. CLRF CAT /ОБНУЛЕНИЕ. GOTO ATTGO /ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. 3. ВЫБОР РЕЖИМА УСТАНОВКИ. АТТК /ВО ВРЕМЯ УСТАНОВКИ ЧАСЫ НЕ ОСТАНАВЛИВАЮТСЯ CALL SI INCF ATT,F /УВЕЛИЧИВАЕМ ЧИСЛО АТРИБУТА. MOVFW ATT SUBLW .4 /ИНДИКАЦИЯ РАЗРЕШЕНА ДО 3 ЦИФРЫ (0-3). BNZ ATTGO /ЕСЛИ НЕ РАВНО НУЛЮ ИДЕМ, CLRF ATT /ИНАЧЕ ОБНУЛЯЕМ АТРИБУТ. GOTO ATTGO ;ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. 4. ЗАПОЛНЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ ДЛЯ СЧИТЫВАНИЯ. АКТЕЕ MOVLW .10 /В РАЗРЯДАХ H MOVWF H_LOW t MOVWF H_HIGH MOVFW COUEE /ВЫСВЕТИМ НОМЕР АДРЕСА ОКОНЧАНИЯ ЗАПИСИ CALL M1U /НА МЕСТЕ МИНУТ. GOTO ATTGO f AKTCO MOVLW .10 /В РАЗРЯДАХ МИНУТ MOVWF M_LOW / MOVWF M_HIGH MOVFW ACOU /ВЫСВЕТИМ НОМЕР АДРЕСА НАЧАЛА ЗАПИСИ CALL H1U /НА МЕСТЕ ЧАСОВ. GOTO ATTGO ; АКТ DM MOVFW EEDATAD / ДЕНЬ CALL H1U /НА МЕСТЕ ЧАСОВ. MOVFW EEDATAM /МЕСЯЦ CALL M1U /НА МЕСТЕ МИНУТ. GOTO ATTGO Г AKTHM MOVFW EEDATAH * CALL H1U /ЧАСЫ. MOVFW EEDAMIN f 61
Устройства с цифровой индикацией CALL GOTO M1U ATTGO ;МИНУТЫ. ATTDATA MOVFW ATT 7 ADDWF PCL,F GOTO AKTCO /АДРЕС ЗАПИСИ НАЧАЛО. GOTO АКТ DM /ЧИСЛО МЕСЯЦ. GOTO AKTHM /ЧАСЫ МИНУТЫ. GOTO AKTEE /АДРЕС ЗАПИСИ КОНЕЦ. ZAPDATA MOVFW ATT /ДЛЯ УСТАНОВКИ НУЖНОЙ ЗАПЯТОЙ ADDWF PCL,F /ПРИ ИНДИКАЦИИ. RETLW B'00100010' /0, ЗАПИСЬ, НАЧАЛО 000,0 RETLW B'OIOOOIOO' /1, ЧИСЛО, МЕСЯЦ 00,00 RETLW B'00000000' /2, ВРЕМЯ 0000 . RETLW B'OOOIOOOI' /3, ЗАПИСЬ, КОНЕЦ 0000, ; 5. КУДА ПОЙТИ = МУЛЬТИПЛЕКСОР. ATTUM / MOVFW ATT КУДА ПОЙТИ? ПРИ УСТАНОВКЕ САТ=1. ADDWF PC,1 ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO MINIM УСТАНОВКА МИНУТ. GOTO MON IM УСТАНОВКА МЕСЯЦА. GOTO HIN РАБОТА: ЧАСЫ МИНУТЫ. GOTO ECUS УСТАНОВКА ВРЕМЕНИ В СЕК (10 СЕК). ATTUH MOVFW ATT КУДА ПОЙТИ? САТ=3. ADDWF PC, 1 ; ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO HOU1H УСТАНОВКА ЧАСОВ. GOTO DAY1D . УСТАНОВКА ЧИСЛА. GOTO HIN РАБОТА: ЧАСЫ МИНУТЫ. GOTO ECUM УСТАНОВКА ВРЕМЕНИ В МИНУТАХ (10 МИН). АТТВ MOVFW ATT КУДА ПОЙТИ? САТ=2. ADDWF PC,1 ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO ATTOO ОБНУЛЕНИЕ ЧАСОВ. GOTO DEYIN ИНДИКАЦИЯ ЧИСЛА И МЕСЯЦА. GOTO HIN РАБОТА: ЧАСЫ МИНУТЫ. GOTO EEFF УСТАНОВКА НОМЕРА ЗАПИСИ, КОНЕЦ. ATTIN \ MOVFW ATT КУДА ПОЙТИ? САТ=0,4. ADDWF PC, 1 ЗАВИСИТ ОТ НОМЕРА АТТ. GOTO DEYIN / ИНДИКАЦИЯ ЧИСЛА И МЕСЯЦА. GOTO OCAU1 УСТАНОВКА ЧИСЛА ПРЕРЫВАНИЙ НА 10 СЕК. GOTO HIN ; РАБОТА: ЧАСЫ МИНУТЫ. GOTO ОСAUI ; ИНДИКАЦИЯ ПРЕРЫВАНИЯ.=1. (15) ; б. ИНДИКАЦИЯ ЧИСЛА И МЕСЯЦА. DEYIN MOVFW DAY1 /ВЫСВЕТИМ ДНИ CALL ' H1U /НА МЕСТЕ ЧАСОВ. MOVFW MON , /МЕСЯЦ- 62
Регистратор событий CALL GOTO MID ATTGO /НА МЕСТЕ МИНУТ. DAYMON ' MOVFW MON /ЗАГРУЗКА ЧИСЕЛ В МЕСЯЦЕ ADDWF PCL,F NOP' /0 1 RETLW .31 ;1-ЯНВАРЬ RETLW .28 ;2-ФЕВРАЛЬ RETLW .31 ;3-МАРТ RETLW .30 ;4-АПРЕЛЬ RETLW .31 /5-МАЙ RETLW .30 ;б-ИЮНЬ RETLW .31 ;7-ИЮЛЬ RETLW .31 ;8-АВГУСТ RETLW .30 ;9-СЕНТЯБРЬ RETLW .31 ;10-ОКТЯБРЬ RETLW .30 ;11-НОЯБРЬ RETLW .31 /12-ДЕКАБРЬ ; 7. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА. SEGDATA /RB7, б, 5, 4, 3, 2, 1, 0 ADDWF PCL,F ;ЕХЕ, А, В, С, D, Е, F, G RETLW B'lllllllO’ ;0 RETLW В’10110000' /1 RETLW В'11101101' /2 RETLW В'11111001' ;3 RETLW В’10110011* /4 RETLW В'11011011* ;5 RETLW В'11011111' /б RETLW" В'11110000' ;7 RETLW В'11111111' /8 RETLW В'11111011' /9 RETLW В'10000001' ;- ; 8. ОБНУЛЕНИЕ СЕКУНД И МИНУТ. АТТОО BTFSC PORTA,4 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ATTGO /НЕТ. CLRF SEC1 /ДА. CLRF MINI GOTO HIN /.НА ИНДИКАЦИЮ. / 9. УСТАНОВКА И ИНДИКАЦИЯ НОМЕРА ПОСЛЕДНЕЙ ЗАПИСИ В ПАМЯТЬ. EEFF BTFSC PORTA,4 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ GOTO AKTEE MOVLW .4 /+4 ADDWF COUEE,1 MOVLW .64 /НЕ БОЛЕЕ 63 (3F) . SUBWF COUEE,0* BZ EEFFO /НА УСТАНОВКУ. GOTO AKTEE 63
Устройства с цифровой индикацией EEFFO ;MOVLW ;MOVWF CLRF GOTO .4 COUEE COUEE AKTEE /ПРИ НУЛЕВОМ АДРЕСЕ „ ;НЕТ СЧИТЫВАНИЯ. /НА ИНДИКАЦИЮ. ; 10. ПОДПРОГРАММЫ УСТАНОВКИ. MINIM BTFSC PORTA,4 /ПРОВЕРКА НАЖАТИЯ КНОПКИ УСТАНОВКИ. GOTO ATTGO ; НЕТ. CALL M1M ;+1 В РЕГИСТР МИНУТ. MOVFW HOU1 /MINI >W.- CALL H1U /НА ИНДИКАЦИЮ ЧАСОВ. GOTO ATTGO HOU1H BTFSC PORTA,4 /УСТАНОВКА ЧАСОВ. GOTO ATTGO CALL HIH /+1 В РЕГИСТР ЧАСОВ. MOVFW MINI /MINI >W. CALL M1U /НА ИНДИКАЦИЮ МИНУТ. GOTO ATTGO DAY ID BTFSC PORTA,4 /УСТАНОВКА ЧИСЕЛ. GOTO DAY1DI CALL DIH /+1 В РЕГИСТР ДНЕЙ. DAY1DI MOVFW DAY1 /ЧИСЛО ВЫСВЕЧИВАЕТСЯ НА МЕСТЕ CALL H1U /ЧАСОВ. MOVLW .10 MOVWF M HIGH /ПРОЧЕРК НА МЕСТЕ МИНУТ. MOVWF M LOW / GOTO ATTGO MONIM BTFSC PORTA,4 /УСТАНОВКА МЕСЯЦА. GOTO MON1MI CALL MO1H /+1 В РЕГИСТР МЕСЯЦА. MON1MI MOVFW MON /МЕСЯЦ ВЫСВЕЧИВАЕТСЯ НА МЕСТЕ' CALL M1U /МИНУТ. MOVLW .10 MOVWF H HIGH /ПРОЧЕРК НА МЕСТЕ ЧАСОВ. MOVWF H LOW f GOTO ATTGO - ; 11. ПОДГОТОВКА К ВЫБОРКЕ ЗАПИСИ НА ИНДИКАЦИИ. АКТ CALL SI ;+1 В СЕКУНДЫ. BCF STATUS,Z /НА ВСЯКИЙ СЛУЧАЙ. BTFSS PORTB,1 /ЕСЛИ КНОПКА НАЖАТА, GOTO EEAKT /ТО ИДЕМ МЕНЯТЬ ИНДИКАЦИЮ, 64 J
Регистратор событий BTFSC GOTO BTFSC GOTO CLRF BSF PORTA,4 ATTGO FLAG,7 АКТ 2 ACOU FLAG,7 /НАЖАТА ЛИ КНОПКА УСТАНОВКИ? /ЕСЛИ НЕТ, ЗАВЕРШЕНИЕ ПРЕРЫВАНИЯ. ;ОБНУЛЕНИЕ БЫЛО? /ДА. /НЕТ, ОБНУЛЯЕМ. /УСТАНОВИМ ФЛАГ ОБНУЛЕНИЯ. АКТ 2 CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF EEDATAD /ЗАПИСЬ В РЕГИСТР ДНЕЙ. INCF ACOU,1 /1 CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF EEDATAM /ЗАПИСЬ В РЕГИСТР МЕСЯЦЕВ. INCF ACOU,1 ;2 CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF EEDATAH /ЗАПИСЬ В РЕГИСТР ЧАСОВ. INCF ACOU,1 /3 CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF EEDAMIN /ЗАПИСЬ В РЕГИСТР МИНУТ. INCF ACOU,1 /+1 MOVFW COUEE /СРАВНИМ СЧЕТЧИК ПОСЛЕДНЕЙ ЗАПИСИ. ADDLW .4 / + 4. SUBWF ACOU,0 /СО СЧЕТЧИКОМ АДРЕСА СЧИТЫВАНИЯ. BZ АКТ 4 /ЕСЛИ ОНИ РАВНЫ, ИДЕМ ОБНУЛЯТЬ, GOTO ЕЕАКТ1 /ИНАЧЕ ИДЕМ НА ВЫБОРКУ. АКТ 4 BCF FLAG,1 /СБРАСЫВАЕМ ФЛАГ СЧИТЫВАНИЯ. CLRF ACOU /ОБНУЛЯЕМ. BCF FLAG,7 GOTO ATTGO /ЗАВЕРШАЕМ. АКТЕТЕ MOVFW ACOU /ЗАГРУЗКА АДРЕСА. MOVWF EEADR BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,RD /ЧТЕНИЕ. BCF STATUS,RPO /БАНК 0. MOVLW .255 /ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА, SUBWF EEDATA,0 /ЗАПИШЕМ -0. BTFSC STATUS,Z / ' GOTO AKTETEO / MOVFW RETURN EEDATA г АКТЕТЕО MOVLW RETURN .0 /-о. ЕЕАКТ INCF ATT,F /УВЕЛИЧИВАЕМ ЧИСЛО АТРИБУТА. MOVFW ATT SUBLW .4 /ИНДИКАЦИЯ РАЗРЕШЕНА ДО 3 ЦИФРЫ (0-3) SKPNZ /ПРОПУСТИТЬ, ЕСЛИ НЕ НОЛЬ, CALL AKTO /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. ЕЕАКТ1 MOVFW ATT / 3 Зак. 2418 65
Устройства с цифровой индикацией CALL MOVWF GOTO ZAPDATA ; ATTZ ; ATTDATA ; г ПЕРЕКОДИРОВКА АТТ В ПОЗИЦИЮ ЗАПЯТОЙ. ;РЕГИСТР ЗАПЯТОЙ. г УСТАНОВИМ ЗНАЧЕНИЯ В ЧАСАХ* И МИНУТАХ. АКТО CLRF RETURN ATT /ОБНУЛЯЕМ. ; 12. УСТАНОВКА И ИНДИКАЦИЯ СЧЕТЧИКОВ СЕКУНД И МИНУТ ПРИ ПРЕРЫВАНИИ. ECUS BTFSC GOTO PORTA,4 ECUSIN /УСТАНОВКА СЧЕТЧИКА СЕКУНД. . DECF COUIOS,1 /-1. TSTF COUIOS /0? BZ ECUSO /ДА, НА УСТАНОВКУ. ECUSIN MOVFW COUIOS CALL M1U /ИНДИКАЦИЯ НА МЕСТЕ МИНУТ. MOVLW .10 MOVWF H_HIGH /ПРОЧЕРК НА МЕСТЕ ЧАСОВ. MOVWF H_LOW Г GOTO ATTGO ECUSO MOVLW .20 /УСТАНАВЛИВАЕМ 20 (КОМУ НАДО, МОЖНО БОЛЬШЕ) MOVWF COUIOS GOTO ECUSIN /НА ИНДИКАЦИЮ. ECUM BTFSC PORTA,4 /УСТАНОВКА СЧЕТЧИКА МИНУТ. GOTO ECUMIN DECF ' COUIOM,1 /-1- TSTF COUIOM /0? BZ. ECUMO /ДА, НА УСТАНОВКУ. ECUMIN MOVFW COUIOM CALL H1U /ИНДИКАЦИЯ НА МЕСТЕЧАСОВ. MOVLW .10 MOVWF M_HIGH /ПРОЧЕРК НА МЕСТЕ МИНУТ. MOVWF M_LOW f GOTO ATTGO ECUMO 1 MOVLW .20 /УСТАНАВЛИВАЕМ 20 (КОМУ НАДО, МОЖНО БОЛЬШЕ) MOVWF COUIOM GOTO ECUMIN /НА ИНДИКАЦИЮ. ; 13. ИНДИКАЦИЯ ЧАСОВ И МИНУТ ПРИ СМЕНЕ ИНДИКАЦИИ. HIN MOVFW MINI /ИНДИКАЦИЯ ЧАСОВ И МИНУТ CALL M1U /ИНДИКАЦИЯ МИНУТ. MOVFW HOU1 CALL H1U /ИНДИКАЦИЯ ЧАСОВ. ' GOTO ATTGO 66
Регистратор событий • s===s=s=ss==s========:=s==========s==:s======== ; 14. ИНДИКАЦИЯ ЗАПИСИ. EEIN BTFSS FLAG,1 /ФЛАГ СЧИТЫВАНИЯМ? ПРОПУСТИТЬ GOTO COUZIKLO ;ИНАЧЕ ИДЕМ. BSF STATUS,C ;УСТАНОВИТЬ В 1. MOVLW B'liioiiio ' ;ЗАПИСЬ-НУЛЕВОГО КАТОДА. MOVWF ANOD MOVLW 012H /ЗАПИСЬ НОМЕРА РЕГИСТРА ЕДИНИЦ МИНУТ. MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. EEIN1 BCF FLAG,5 ;0 COMF ANOD,0 /ЕСЛИ РАЗРЯДЫ СОВПАДАЮТ, XORWF ATTZ,0 , ( BNZ EEIN3 /ИДЕМ СВЕТИТЬ ЗАПЯТУЮ. BSF FLAG,5 /1 EEIN3 MOVFW SEGD /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА ДЛЯ ИНДИКАЦИИ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТУ в. MOVFW ANOD /СВЕТЯЩИЙСЯ РАЗРЯД MOVWF PORTA /В ПОРТ А. BTFSC FLAG,5 /ЕСЛИ ФЛАГ =1, BSF PORTA,4 /ВЫКЛЮЧИТЬ ЗАПЯТУЮ. BTFSS FLAG,5 /ЕСЛИ ФЛАГ =0, BCF PORTA,4 /ВКЛЮЧИТЬ ЗАПЯТУЮ. EEIN4 INCF SEGD,F /+1 В РЕГИСТР АДРЕСА РАЗРЯДА. MOVLW B’01110111 ' /ЕСЛИ СВЕТИТСЯ КРАЙНИЙ РАЗРЯД, XORWF ANOD,0 /ТО НЕТ УСТАНОВКИ РАЗРЯДА "С" В 1 BTFSC STATUS,Z /ЕСЛИ 0, ПРОПУСКАЕМ, GOTO EEIN /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. BSF STATUS,C /УСТАНОВИТЬ В 1. RLF ANOD,1 /СДВИГАЕМ ВЛЕВО. GOTO EEIN1 9 ; 15. ЧИСЛО ПРЕРЫВАНИЙ НА 10 СЕК, УСТАНОВКА И ИНДИКАЦИЯ. 0CAU1 BTFSC PORTA,4 /ЕСЛИ КНОПКА НЕ НАЖАТА, GOTO ОС AU I /ИДЕМ НА ИНДИКАЦИЮ. INCF CAU, 1 /+1 MOVLW .21 /ДО 20 НА 10 СЕК (ТЕМП!). SUBWF CAU,0 /ЕСЛИ РАВНО 0, ТО BZ OCAUO /ИДЕМ НА УСТАНОВКУ. GOTO ОС AU I /ИЛИ НА ИНДИКАЦИЮ. OCAUO MOVLW .1 /УСТАНАВЛИВАЕМ 1. MOVWF CAU 9 ОС AU I CLRF H_HIGH 9 67
Устройства с цифровой индикацией CLRF H_LOW /О НА МЕСТЕ ЧАСОВ. MOVFW CALL GOTO . CAU M1U ATTGO /ИНДИКАЦИЯ НА МЕСТЕ МИНУТ. 9 9 ; 16. ЗАВЕРШЕНИЕ'ПРЕРЫВАНИЯ. ATTGO BTFSC INTCON,2 /ЕСЛИ НЕТ ПРЕРЫВАНИЯ, ИДЕМ НА ИНДИКАЦИЮ GOTO RETCONT /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. GOTO COUZIKLO /НА ИНДИКАЦИЮ. ; 17". ПП. ИНДИКАЦИИ С ВЫХОДОМ 0-7; 0-3. COUZIKLO BSF STATUS,C /УСТАНОВИТЬ В 1. MOVLW B’11101110’ /ЗАПИСЬ НУЛЕВОГО КАТОДА. MOVWF ANOD ; BTFSC FLAG,1 /0? ПРОПУСТИТЬ. GOTO eeIn /НЕТ, НА ИНДИКАЦИЮ ЗАПИСИ. BSF INTCON,7 CLRF KATOD /ОБНУЛЯЕМ КАТОД 2-10. MOVLW 012H /ЗАПИСЬ НОМЕРА РЕГИСТРА ЕДИНИЦ МИНУТ MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. GOTO COUZ 1 ZIKL INCF KATOD,1 ;+1 В РЕГИСТР КАТОДА. MOVLW B’00000100’ /ЗАПИСЬ ЧИСЛА 4. SUBWF KATOD,0 /ПРОВЕРЯЕМ ЗНАЧЕНИЕ КАТОДА. BZ COUZIKLO /ЕСЛИ РАВНО 0, ИДЕМ. COUZ INCF COUI,1 ;+1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. MOVLW .40 /40- ДЛЯ ОРГАНИЗАЦИИ МИГАНИЯ SUBWF COUI,0 /ВЫБРАННОГО РАЗРЯДА. BNZ COUZ3 /ЕСЛИ НЕ РАВНО 0, ИДЕМ. GOTO COUZ1 /ИДЕМ, ЕСЛИ РАВНО НУЛЮ. COUZ1 CLRF COUI /ОБНУЛИМ СЧЕТЧИК ЦИКЛОВ. BTFSC FLAG,2 /ПРОПУСТИТЬ, ЕСЛИ 0, GOTO COUZ2 9 BSF FLAG,2 9 GOTO COUZ3 9 COUZ2 BCF FLAG,2 /СБРОСИМ ФЛАГ ГАШЕНИЯ В 0. COUZ3 BTFSS FLAG,2 /ПРОПУСТИТЬ, ЕСЛИ 1. GOTO INDCO MOVFW KATOD /СРАВНИМ НОМЕР КАТОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT, 0 /РАЗРЯДА МИГАНИЯ. BNZ INDCO /ПЕРЕХОД ЕСЛИ НЕ НОЛЬ. INDCG MOVLW B’ 1111 ’ /ИНАЧЕ ГАСИМ ВСЕ КАТОДЫ MOVWF PORTA /И ИДЕМ МЕНЯТЬ ЗНАЧЕНИЕ GOTO INDC1 /СЕГМЕНТОВ (РАЗРЯД ПОГАШЕН). 68
Регистратор событий INDCO MOVFW KATOD /ЕСЛИ РАЗРЯДЫ СОВПАДАЮТ, SUBWF' ATT, 0 ;\ BNZ GDATA ;INDC /ИДЕМ СВЕТИТЬ С ЗАПЯТОЙ. GDATA BSF FLAG,5 /ФЛАГ ЗАПЯТОЙ. MOVFW SEGD /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА ДЛЯ ИНДИКАЦИИ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТУ В. MOVFW ANOD f MOVWF PORTA BTFSC FLAG,5 /ЕСЛИ ФЛАГ =1, BSF PORTA,4 /ВЫКЛЮЧИТЬ ЗАПЯТУЮ. BTFSS FLAG,5 /ЕСЛИ ФЛАГ 4=0, INDC1 BCF PORTA,4 /ВКЛЮЧИТЬ ЗАПЯТУЮ? BCF FLAG,5 INCF SEGD, F /+1 В РЕГИСТР АДРЕСА РАЗРЯДА. MOVLW B’OlllOlll' /ЕСЛИ СВЕТИТСЯ КРАЙНИЙ РАЗРЯД, XORWF ANOD,0 /ТО НЕТ УСТАНОВКИ РАЗРЯДА "С" В 1. BTFSC STATUS,Z /ЕСЛИ 0, ПРОПУСКАЕМ. GOTO INDO INDO BSF STATUS,C /УСТАНОВИТЬ В 1. RLF ANOD, 1 /СДВИГАЕМ ВЛЕВО. BTFSC FLAG,0 /ЕСЛИ ФЛАГ ИМПУЛЬСА УСТАНОВЛЕН, GOTO INDCF /ИДЕМ ФОРМИРОВАТЬ ВЫХОДНОЙ ИМПУЛЬС. GOTO ZIKL /ИНАЧЕ ИДЕМ СВЕТИТЬ. ; 18. ФОРМИРОВАНИЕ ВЫХОДНОГО ИМПУЛЬСА. INDCF BSF INTCON,5 /РАЗРЕШАЕМ ПРЕРЫВАНИЕ. BSF STATUS,RPO /БАНК 1. MOVLW B'00000000' /ВСЕ НА ВЫХОД, 7 РАЗРЯД ДАЕТ 0 НА ЕХЕ. MOVWF TRISBA80H BCF STATUS,RPO /БАНК 0. BSF PORTB,7 /0 BCF INTCON,5 /ЗАПРЕЩАЕМ ПРЕРЫВАНИЕ. INDCFN BCF PORTB,7 /0 MOVLW .255 /255 ЦИКЛОВ ИНДИКАЦИИ ДЛИТЕЛЬНОСТЬ ИМПУЛЬСА /ЕХЕ (0,8 СЕК). INDCFNN BCF PORTB,7 /0 ADDLW -1H NOP NOP NOP NOP NOP NOP 69
Устройства с цифровой индикацией NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP / NOP NOP BZ INDCFO f GOTO INDCFNN r INDCFO BSF PORTB,7 /ОЧИСТИМ ПОРТ, ЧТОБЫ HE ВЫЗВАТЬ НОВОГО ПРЕРЫВАНИЯ BCF FLAG,0 ;0 NOP NOP BSF STATUS,RPO ;БАНК 1. MOVLW B'10000000' MOVWF TRISBA80H ;РАЗРЯД НА ВХОД. BCF STATUS,RPO ;БАНК 0. BCF INTCON,0 г BSF INTCON,5 GOTO COUZIKLO /НА ИНДИКАЦИЮ. ; 19. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ РЕГИСТРОВ ПРИ ЗАПИСИ В ПАМЯТЬ. ZAPISI MOVWF W TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR TEMP BTFSC PORTB,7 /0? GOTO RECONST ; ' i GOTO KEYC f RECONST ;ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ MOVFW STATUS_TEMP MOVWF STATUS /РЕГИСТРОВ W И STATUS, MOVFW FSR_TEMP /FSR. MOVWF FSR / MOVFW W TEMP BCF INTCON,6 /ЗАПРЕТ ПРЕРЫВАНИЯ ПО ЗАПИСИ В ПАМЯТЬ. BCF INTCON,0 /РАЗРЕШАЕМ ПРЕРЫВАНИЕ ПО ВХОДУ В. BSF INTCON,7 /РАЗРЕШАЕМ ВСЕ ПРЕРЫВАНИЯ. . RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. 70
Регистратор событий ; 20. ЗАПИСЬ В ПАМЯТЬ. KEYC MOVLW .50 200 ЦИКЛОВ KEYC1 ADDLW -1H :24 MS- ДЛЯ УСТРАНЕНИЯ ДРЕБЕЗГА BTFSS STATUS, Z ; ;КОНТАКТОВ. GOTO KEYCI BTFSC PORTB,7 г ЕЩЕ НАЖАТА КНОПКА? GOTO RECONST :НЕТ. . BTFSC FLAG,3 УЖЕ ЕСТЬ ЗАПИСЬ 1? GOTO RECONST ДА. BTFSC FLAG,0 /ПРОШЕЛ ИМПУЛЬС EXE? GOTO RECONST / НЕТ. BSF FLAG,4 /ВКЛ. СЧЕТЧИК 10 СЕК. INCF CAUK,1 /+1 В СЧЕТЧИК ПРЕРЫВАНИЙ. BCF STATUS, Z MOVFW CAUK /СРАВНИМ ВЫЧИСЛЕННОЕ ЗНАЧЕНИЕ SUBWF CAU, 0 /С УСТАНОВЛЕНЫМ. BZ ZAPIS ;=о GOTO RECONST 9 ZAP IS CLRF CAUK /ОБНУЛЯЕМ СЧЕТЧИК ПРЕРЫВАНИЙ. CLRF ACOU BSF FLAG,0 /ФЛАГ EXE. BSF FLAG, 3 /1 ZAPISO MOVLW OCH /АДРЕС ПЕРВОЙ ЗАПИСИ В EEDATA. MOVWF ABCDE /ЧИСЛО, МЕСЯЦ, ЧАСЫ, МИНУТЫ. ZAPISE MOVFW ABCDE ' /ПО КОСВЕННОЙ АДРЕСАЦИИ MOVWF FSR >, ЗАГРУЖАЕМ ЗНАЧЕНИЕ MOVFW INDF /РЕГИСТРА MOVWF DMHM /ДЛЯ ЗАПИСИ. MOVFW COUEE /СЧЕТЧИК АДРЕСА. MOVWF EEADR 9 MOVFW DMHM 9 MOVWF EEDATA BCF INTCON, GIE /ЗАПРЕТ ПРЕРЫВАНИЙ. BSF STATUS, RPO /БАНК 1. BSF EECON1A 8OH,WREN /РАЗРЕШЕНИЕ ЗАПИСИ.2 MOVLW 55H ;ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ MOVWF EECON2A 80H ,’/ MOVLW OAAH // MOVWF EECON2A 80H // BSF EECON1A 80H,WR /ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ.1 ZAPIZ BTFSS EECON1A 80Н,4 /ПОКА НЕ БУДЕТ ЗАПИСИ GOTO ZAPIZ /ХОДИМ ПО КРУГУ. BCF INTCON, 6 /ЗАПРЕТ ПРЕРЫВАНИЯ ПО ЗАПИСИ В ПАМЯТЬ BCF EECONli ,80Н, 4 9 BCF EECON1A 8ОН,WREN /ЗАПРЕТ ЗАПИСИ.2 BCF STATUS, RP0 /БАНК 0. INCF COUEE,1 /+1 В СЧЕТЧИК АДРЕСА. 71
Устройства с цифровой индикацией MOVFW COUEE f SUBLW .64 f BZ EECNOO INCF ACOU,1 ;+1 В СЧЕТЧИК ЦИКЛА. MOVLW .4 /0-3. SUBWF ACOU,0 t BZ EECNOOO INCF ABCDE,1 ;+1 В СЧЕТЧИК АДРЕСА. GOTO ZAPISE /ПО КРУГУ ДО КОНЦА ЗАПИСИ EECNOO CLRF COUEE /ОБНУЛЯЕМ СЧЕТЧИК ЗАПИСИ. EECNOOO CLRF ACOU GOTO RECONST /ЗАВЕРШИТЬ ПРЕРЫВАНИЕ. ; 21. ПП. .ПЕРЕКОДИРОВКИ 2-_-2-10. BINDECll .10 /ПЕРЕКОДИРОВКА С БИНАРНОГО В 2-10 КОД /10 >W. MOVLW BDH BSF STATUS,0 /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS. SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH. BNC BINDECL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH ;ПОВТОРИТЬ. BINDECL MOVF DSMH,0 ADDLW .10 ,-10+W >w. MOVWF RETURN LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР.. Г ; 22. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. COUNT MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP MOVLW B'llllllll' /ГАШЕНИЕ ИНДИКАЦИИ НА ВРЕМЯ ПРЕРЫВАНИЯ. MOVWF PORTA /ПОСЛЕ ОНА САМА ВОССТАНОВИТСЯ. MOVWF PORTB BSF STATUS,RPO /БАНК 1. MOVLW B'00010000' /RA4 РАЗРЕШАЕМ ВХОД НА ВРЕМЯ ПРЕРЫВАНИЯ. MOVWF TRISAA80H MOVLW B'lOOOOllO' /РАЗРЕШАЕМ ВХОДА НА ВРЕМЯ ПРЕРЫВАНИЯ (В1, В2, В7) MOVWF TRISBA80H BCF STATUS,RPO /БАНК 0. GOTO KEY RETCONT. /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ BSF STATUS,RPO /1 БАНК. MOVLW B'10000000' /ВСЕ ВЫХОДЫ, В7- ВХОД. MOVWF TRISBA80H MOVLW B'00000000' /ВСЕ ВЫХОДЫ. MOVWF TRISAA80H Г 72
Регистратор событий BCF EECON1A80H,4 BCF STATUS,RPO /БАНК 0. BCF INTCON,6 BCF INTCON,2 ;СБРОС ФЛАГА (TOIF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА ;(РАЗРЕШАЕМ ПРЕРЫВАНИЯ). MOVFW STATUS TEMP ;ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ MOVWF STATUS /РЕГИСТРОВ W И STATUS, MOVFW FSR TEMP /FSR. - MOVWF FSR f MOVFW W TEMP RETFIE. /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 23. СЧЕТ И ПЕРЕКОДИРОВКА РЕГИСТРОВ Ч-М-С, ДНИ-МЕСЯЦЫ. S1 BTFSS FLAG,4 /ОТСЧЕТ 10 СЕК НАЧАТ? GOTO SIS / НЕТ. INCF CAUCOU,1 /ДА, .+ 1. MOVFW CAUCOU SUBWF COUIOS,0 /СЧЕТЧИК 10 СЕКУНД ПОЛОН? BZ SUNT ;ДА. GOTO SIS / НЕТ. SUNT CLRF CAUCOU /ОБНУЛЯЕМ. CLRF CAUK 1/ BCF FLAG,4 /СБРОСИМ ФЛАГ 10 СЕК. SIS MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,F /ПРИБАВИТЬ 1 В СЕКУНДЫ. RETURN f Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. BTFSS FLAG,3 /ЕСТЬ ЗАПИСЬ? GOTO M1M /ДА, ПРОПУСКАЕМ. INCF MIN10,1 /+1 В СЧЕТЧИК 10 МИН. MOVFW MIN10 /СРАВНИМ ЗНАЧЕНИЯ. SUBWF COUIOM,0 BZ MIO /10 МИН. ПРОШЛО? ИДЕМ ОБНУЛЯТЬ, GOTO M1M /ИНАЧЕ УСТАНАВЛИВАЕМ МИНУТЫ. MIO CLRF MIN10 BSF FLAG,0 /ИМПУЛЬС ЕХЕ ВЫДАЕТСЯ ПО ОКОНЧАНИЮ МИН. ЦИКЛА BCF FLAG,3 /СБРОСИМ ФЛАГ ЗАПИСИ. M1M MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MINI,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /MINI >W. M1U MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. 73
Устройства с цифровой индикацией MOVWF MOVFW M_LOW HSMH ;W > M_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ. /HSMH >W ВРЕМЕННЫЙ. MOVWF M_HIGH ;W > M_HIGH В РЕГИСТР ИНДЙКАЦИИ ДЕСЯТКОВ МИНУТ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH t RETURN f Hl CLRF MINI ;ОБНУЛЯЕМ РЕГИСТР МИНУТ. CLRF M_LOW /ОБНУЛЯЕМ ЕДИНИЦЫ МИНУТ. CLRF M_HIGH /ОБНУЛЯЕМ ДЕСЯТКИ МИНУТ. H1H MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. MOVFW HOU1 ,-HOU >W. H1U MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF H_LOW ,'W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF H_HIGH ,'W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH f RETURN г H10 CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF H_LOW /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF H_HIGH /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. DIH CALL DAYMON /СКОЛЬКО ДНЕЙ В МЕСЯЦЕ? SUBWF DAY1,0 /УЖЕ КОНЕЦ МЕСЯЦА? BZ DOI /ДА. ИДЕМ УСТАНАВЛИВАТЬ. INCF DAY1,F /НЕТ. +1 К ЧИСЛАМ. RETURN DOI MOVLW 01H /УСТАНОВКА В 1 MOVWF DAY1 /ЧИСЛА (0- ЧИСЛА НЕТ). MO1H INCF MON, F /+1 В МЕСЯЦ MOVFW MON ADDLW -ODH /УЖЕ 12 МЕСЯЦЕВ? BZ MOO /ДА. RETURN MOO MOVLW 01H /УСТАНОВИМ 1 МЕСЯЦ (0-НЕТ). MOVWF MON • f RETURN END 74
Автомобильный цифровой тахометр Автомобильный цифровой тахометр Этот тахометр предназначен для использования при регулировке холостого хода карбюраторов двигателей внутреннего сгорания. Его можно применять и для контроля частоты вращения вала автомобильных или лодочных двигателей во время движения. Принцип работы заимствован из статьи А. Бирюкова [4]. Для увеличения точности измерения оборотов введен предел измерения 3 секунды. Тахометр имеет три разряда индикации с пределом измерения от 60 мин-1 до 7800 мин-1. Погрешность измерения на пределе 1 секунда равна 30 мин-1, а на пределе 3 секунды — 10 мин-1. Нижний предел ограничен погрешностью измерения, а верхний — количеством прерываний между индикацией. Из-за чего индикация разрядов становится прерывистой. В статье-прототипе указана неверная формула [(2N х 3)/60] для вычисления частоты вращения коленчатого вала. Поскольку за один оборот коленчатого ва- ла двигателя происходит два искрообразования, то мы подсчитываем за одну секунду 2N импульсов. То есть в два раза большее количество, чем произошло оборотов (N). Чтобы получить значение оборотов в минуту, необходимо умно- жить значение оборотов за секунду на 60 (Ns х 60 = Nm). Так как мы цодсчиты- ваем число импульсов не N, a 2N, то умножать нужно уже не на 60, а на 30. А поскольку аппаратно мы отбрасываем разряд единиц, то фактически делим значение оборотов на 10. Из этого следует расчетная формула: Nm = 2NS х 3 мин-1. Где Nm — значение оборотов в минуту, 2NS — число импу- льсов с прерывателя за одну секунду. Если подсчитывать число импульсов за 3 секунды, то Nm = 2NS мин-1. Таким образом, подсчитанное число импульсов за секунду достаточно умножить на 3 и перекодировать в двоично-десятичное, чтобы получить значение оборотов в минуту без единиц. А на пределе 3-х се- кунд просто перекодировать полученное значение. Показания индикатора, рав- ные 100, будут соответствовать значению 1000 мин-1. Тахометр реализован на одной микросхеме микроконтроллера PIC16F84A. Алгоритм программы тахометра представлен на рис. 16. После включения пи- тания происходит начальная инициализация всех регистров с последующей ин- дикацией. После инициализации вступает в работу таймер TMR0. Таймер име- ет коэффициент деления, равный 256, что вместе с предделителем, имеющим коэффициент деления, равный 32, и циклом процессора, равным 4, дает пре- рывания каждую секунду (4 х 32 х 256 = 32768). При замыкании контактов прерывателя с входа RB0 также происходит пре- рывание. При прерывании сохраняются значения регистров, задействованных на момент прерывания, и определяется происхождение прерывания. Если пре- рывание с входа RB0, то двоичный 16-разрядный счетчик увеличивается на единицу. Таким образом, подсчитывается количество прерываний с входа RB0 между прерываниями от переполнения таймера, то есть за 1 секунду. Каждое прерывание заканчивается восстановлением ранее сохраненных значений реги- стров, и процессор переключается на работу с индикацией. Если прерывание произошло по переполнению таймера, то определяется состояние переключателя предела измерения и, если переключатель на пределе 75
Устройства с цифровой индикацией Рис. 16. Алгоритм программы тахометра одной секунды, двоичное значение 16-разрядного счетчика умножается на 3 (2N х 3). 16-разрядный счетчик обнуляется, готовясь к новому циклу измере- ния. Полученное двоичное значение перекодируется в трехразрядное двоич- но-десятичное число и переписывается в регистры индикации. После восста- новления значений регистров индикация происходит с новыми данными. То есть индикация обновляется каждую секунду. Если установлен предел измерения, равный 3 секундам, то при переполне- нии таймера значение счетчика секунд увеличивается на единицу. Если значе- ние счетчика секунд еще не равно трем, прерывание завершается без обнуле- ния 16-разрядного счетчика. В противном случае в 16-разрядном счетчике на- капливается количество прерываний с входа RB0 за три секунды. Это значение перекодируется в двоично-десятичное число и переписывается в регистры ин- дикации. Двоичный счетчик обнуляется и цикл повторяется. В данном случае индикация обновляется каждые три секунды. 76
Автомобильный цифровой тахометр Схема тахометра показана на рис. 17. Входной сигнал с контактов прерыва- теля стабилизируется стабилитроном VD1 на уровень ТТЛ и подается на вход RB0. При бесконтактной системе зажигания сигнал снимается с выхода комму- татора, выдающего перепад напряжения 3 В. Этого напряжения достаточно для срабатывания микроконтроллера. R1 36 к PR VD1 22 КС147А 2 3 17 18 DD1 PIC16F84A MCLR RA0 RA1 RA2 RA3 14, —Писс -MPGND 16 --- OSC1 ср и RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 OSC2 ZQ1 32768 Гц 6 PR 10 D 11 Е 12 F 13 G 15 С1 30 С2 30 о о U. U. HG1-HG3 АЛ304Г R DA1 +12 В 3 KP142EH5AF 2 сз 0,01 R3-R9 430 1s SA1 R2 Юк -12 В VD2 КД 102 4 8 В 2 R 2 9 С О ц Рис. 17. Автомобильный цифровой тахометр Входы RA0-RA2 коммутируют аноды светодиодов, реализуя динамиче- скую индикацию. Вход RA3 нагружен переключателем предела измерения «Is—3s». Внутренние подтягивающие резисторы программно отключены, но ими снабжены только входы «В» микроконтроллера, поэтому возникла необ- ходимость в установке резистора R2. Входы RBI—RB7 использованы для вывода значений сегментов. Поскольку микроконтроллер работает при верх- нем питающем напряжении 6 В, то микросхему стабилизатора напряжения КР142ЕН5 можно взять с любой буквой, обеспечивающей это напряжение. Потребляемый тахометром ток около 25 мА, поэтому микросхема стабилиза- тора напряжения не нуждается в радиаторе. Диод VD2 защищает прибор от переполюсовки. Если тахометр будет использоваться при регулировке кар- бюраторов, то светодиоды АЛ304Г нежелательно заменять индикаторами с большими размерами цифр. Топология печатной платы и расположений элементов на ней показаны на рис. 18. Печатная плата может быть выполнена на одностороннем фольгиро- ванном стеклотекстолите, однако лучше сделать ее из двухстороннего стекло- текстолита. Фольгу со стороны установки элементов необходимо использо- вать в качестве экрана, раззенковав отверстия установки элементов сверлом большего диаметра. Это улучшит помехозащищенность прибора, Особенно ес- ли высоковольтные провода двигателя имеют микротрещины. После монтажа элементов выводы кварцевого резонатора ZQ1 и микросхемы стабилизатора DA1 изгибают так, чтобы резонатор и микросхема были параллельны плате. 77
Устройства с цифровой индикацией 42,5 Рис. 18. Автомобильный цифровой тахометр. Печатная плата Рис. 19. Тахометр. 3-х разрядный индикатор на АЛ304Г. Сторона установки светодиодов Печатная плата индикаторов со стороны их установки показана на рис. 19. Пунктирными линиями обозначены проводники, идущие с обратной стороны платы. При монтаже и пайке выводов с изгибом по краю корпуса необходимо действовать аккуратно и быстро, чтобы не повредить соединение внутри пласт- массового корпуса светодиода. Для желающих на плате предусмотрен вывод сегмента запятой во втором разряде, чтобы отделить значение тысяч. Его необ- ходимо подключить через резистор 430—510 Ом на минус 5 В. Тахометр в настройке не нуждается. Только необходимо перед установкой проверить кварцевый резонатор на соответствие его номинальной частоте. В противном случае придется корректировать частоту автогенератора в готовом приборе параллельным или последовательным подключением к кварцу конден- саторов, что не предусмотрено конструкцией платы. Проверку работоспособности тахометра можно выполнить при помощи любого низкочастотного импульсного генератора. Зависимость частоты Fru от показаний тахометра N следующая: Fru х 3 = N. И наоборот, чтобы иметь представление о частоте вращения коленчатого вала в герцах, необходимо по- казания тахометра разделить на три. Например, если подать на вход тахометра частоту 100 Гц, то показания индикатора должны быть равны 300, что соот- ветствует 3000 мин-1. При показании тахометра, равном 150 (соответствует 1500 мин-1), частота вращения коленчатого вала в герцах будет равна 50 Гц. Для определения частоты вращения двухцилиндровых двигателей, например автомобилей «Ока», показания тахометра необходимо умножать на два. ; АВТОМОБИЛЬНЫЙ ТАХОМЕТР С ТРЕМЯ РАЗРЯДАМИ ИНДИКАЦИИ. ; ВРЕМЯ ИЗМЕРЕНИЯ 1 И 3 СЕКУНДЫ. ; ПОГРЕШНОСТЬ ИЗМЕРЕНИЯ В РЕЖИМЕ 1 СЕК. - 30 ОБ./МИН. ; В РЕЖИМЕ 3 СЕК. - 10 ОБ./МИН. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; РАЗРАБОТКА Н.ЗАЕЦ. ; ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru 78
Автомобильный цифровой тахометр ♦INCLUDE P16F84A.INC __CONFIG 3FFC / 11111111111100 ; 0,1-РАЗРЯДЫ ГЕНЕРАТОРА, 00- 32-200,КГЦ. / 2- WDTE, 1- ВКЛ. ; 3- PWRTE, 1- ВКЛ. ; 4-13 ЗАЩИТА КОДА. 1- НЕТ ЗАЩИТЫ. •====:======================================== * ; ПОДСЧЕТ ИМПУЛЬСОВ С ПРЕРЫВАТЕЛЯ ПРОИЗВОДИТСЯ 1 СЕКУНДУ. ; ЗА 1 ОБОРОТ КОЛЕНВАЛА ПРОХОДИТ ДВА ИМПУЛЬСА. ЗНАЧЕНИЕ В СЧЕТЧИКЕ БУДЕТ ; 2N ЗА СЕКУНДУ. ЗА МИНУТУ НАДО УМНОЖИТЬ НА 60. НА 10 МЫ ДЕЛИМ АППАРАТНО, ; УБРАВ РАЗРЯД ЕДИНИЦ. НА 2 УМНОЖЕНИЕ КОНСТРУКТИВНОЕ - 2 ИМПУЛЬСА ЗА.1 ОБОРОТ. ; ПОЛУЧИМ: Nx60=>2Nx3=n ОБ/МИН. 1 СЕК. ПОЛУЧАЕМ С TMR0, С ПРЕДДЕЛИТЕЛЕМ К=32: ; 256x32x4=32768. ПОДСЧЕТ ЗА 3 СЕКУНДЫ НЕПОСРЕДСТВЕННО ИДЕТ НА ИНДИКАЦИЮ. • ======:=:=== ==s= ================================= ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ. INDF EQU ООН /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TMR0 EQU 01Н ;TMR0. OPTION_REG EQU 81Н /OPTION (RP0=l). РС EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. DESI SOTI TUSI EQU EQU EQU 010Н 011Н 012Н /ДЕСЯТКИ ИНДИКАЦИИ. /СОТНИ. ;ТЫСЯЧИ. ; РЕГИСТРЫ ДЛЯ ОРГАНИЗАЦИИ ИНДИКАЦИИ. ANOD SEGD EQU EQU 013Н , 014Н , ;АНОД. Г СЕГМЕНТЫ. ; ВРЕМЕННЫЕ :, ДЛЯ ХРАНЕНИЯ ПРИ ПРЕРЫВАНИИ. \ W_TEMP EQU 015H STATUS_TEMP EQU 016H FSR_TEMP EQU 017H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ. /ВРЕМЕННЫЙ ДЛЯ FSR. ОПРЕДЕЛЕНИЕ РЕГИСТРОВ СЧЕТА. DES EQU 018H /МЛАДШИЙ РАЗРЯД РЕГИСТРА СЧЕТА SOT EQU 019H* /СТАРШИЙ РАЗРЯД. SEC EQU 01 AH /СЕКУНДЫ. SOTU EQU 01BH /ВРЕМЕННЫЙ РЕГИСТР. 79
Устройства с цифровой индикацией ; ОСНОВНАЯ ПРОГРАММА. ORG О GOTO INIT ORG 4 GOTO CONST ; 1. ИНИЦИАЛИЗАЦИЯ ’ INIT BSF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF BCF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF STATUS,5 В’11000100’ OPTION_REGA80H В' 10110000' INTCON В ’ 00011000 • TRISAA80H В ’ 00000001’ TRISBA80H STATUS,5 TtfRO DESI DES SOTI SOT SOTU TUSI SEC /ПЕРЕХОДИМ В БАНК 1. ;ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100, /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВЫКЛЮЧЕНЫ, ФРОНТ ;НАРАСТАНИЯ. /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА /И ИЗМЕНЕНИЮ ВХОДНОГО СИГНАЛА ПОРТА В. / RA0-RA2 НА ВЫХОД, RA3, РА4-ВХОД. / RB0 НА ВХОД, РВ1-ДВ7-ВЫХОД. /ПЕРЕХОДИМ В БАНК 0. /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ. / / 2. ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ КНОПОК И ФЛАГОВ. Г KEY BTFSS GOTO BCF BTFSS GOTO INTCON,2 INDZIKL0 INTCON,2 PORTA,3 THREES /ЕСЛИ НЕТ ПРЕРЫВАНИЯ, /ИДЕМ НА ИНДИКАЦИЮ. /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ /(РАЗРЕШАЕМ ПРЕРЫВАНИЯ). /ЕСЛИ КНОПКА НАЖАТА, /ИДЕМ СЧИТАТЬ СЕКУНДЫ. ТАЙМЕРА ,; 3. УМНОЖЕНИЕ ЗНАЧЕНИЙ ; НА 3. / MOVFW ADDWF BTFSC INCF BCF ADDWF BTFSC INCF MOVFW ADDWF ADDWF MOVFW DES DES, 0 STATUS,0 SOTU,1 STATUS,0 DES, 1 STATUS,0 SOTU,1 SOT SOT, 0 SOT, 1 SOTU /МЛАДШИЙ РАЗРЯД. /1 + 1 /ЕСЛИ НЕТ ПЕРЕНОСА, - /+1 В СТАРШИЙ РАЗРЯД. ; 0 . /2 + 1. /ЕСЛИ НЕТ ПЕРЕНОСА, /+1 В СТАРШИЙ РАЗРЯД. /СТАРШИЙ РАЗРЯД. /1 + 1.' /2 + 1. /ПРИБАВИМ ПЕРЕНОС ИЗ МЛАДШЕГО РАЗРЯДА. 80
Автомобильный цифр9вей тахометр ADDWF SOT,1 /ЗАПИШЕМ В СТАРШИЙ РАЗРЯД. /ОБНУЛИМ ВРЕМЕННЫЙ. CLRF SOTU ; 4. ПЕРЕКОДИРОВКА ИЗ 16 -И РАЗРЯДНОГО 2-ГО В 3-Х РАЗРЯДНОЕ 2-10-Е. RAS CLRWDT CLRF DESI /ОБНУЛИМ РЕГИСТРЫ ИНДИКАЦИИ. CLRF SOTI CLRF TUSI BCF STATUS, 2 t /ОЧИСТКА БИТА "Z" РЕГИСТРА STATUS. TSTF SOT /ПРОВЕРИМ НА НОЛЬ. BZ RAS1 /ЕСЛИ РАВНО, ИДЕМ. RASO MOVLW 64 /100. RAS2 BSF STATUS, 0 , /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS. RAS3 SUBWF DES,1 BNC BINDES /ВЫЧИТАЕМ ИЗ РЕГИСТРА 100 > DES. /ПЕРЕХОД ЕСЛИ ПЕРЕНОС. INCF TUSI,1 GOTO RAS3 BINDES /ПРИБАВИМ 1 К ТЫСЯЧАМ РЕГИСТРА ИНДИКАЦИИ. ;ПОВТОРИТЬ. * CLRWDT BCF STATUS, TSTF SOT BZ RAD DECF SOT,1 2 , /ОЧИСТКА БИТА "Z" РЕГИСТРА STATUS. /ПРИВЕРИТЬ РЕГИСТР НА НОЛЬ. /ЕСЛИ 0, ИДЕМ. /ВЫЧЕСТЬ ИЗ РЕГИСТРА 1. INCF TUSI,1 GOTO RAS2 /ПРИБАВИМ 1 К ТЫСЯЧАМ РЕГИСТРА ИНДИКАЦИИ. ;ПОВТОРИТЬ. RAD ADDWF DES,1 MOVLW .10 /ВОССТАНОВИМ ДЕСЯТКИ (В АКК. - 100) . /10. BSF STATUS, RADO SUBWF DES,1 BNC BINDED INCF SOTI,1 GOTO RADO 0 , /ОЧИСТКА БИТА "С" РЕГИСТРА STATUS. /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DES. /ПЕРЕХОД, ЕСЛИ ПРОПАЛ ПЕРЕНОС. /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. /ПОВТОРИТЬ. BINDED ADDWF DES,0 MOVWF DESI CLRF DES CLRF SOT GOTO RECONST /+10. /ЗАПИШЕМ В РЕГИСТР ИНДИКАЦИИ. ( /ОБНУЛИМ. RAS1 BCF STATUS, TSTF DES BZ RECONST GOTO RASO / 5. ТРИ СЕКУНДЫ. 2 /ОЧИСТКА БИТА "Z" РЕГИСТРА STATUS. /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА = 0, /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ, /ИНАЧЕ ИДЕМ СЧИТАТЬ. ;===================м=== THREES MOVLW -2 81
Устройства с цифровой индикацией ADDWF SEC, 0 /ЕСЛИ УЖЕ 2 СЕКУНДЫ, BZ THREES0 ;ОБНУЛЯЕМ, INCF SEC, 1 /ИНАЧЕ +1 В СЕКУНДЫ GOTO RECONST THREES0 CLRF SEC ;СБРОС. GOTO RAS /ИДЕМ СЧИТАТЬ. ; 6. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО АНОДА. SEGDATA /7, 6, 5, 4, 3, 2, 1, 0. ADDWF PCL, F ;G, F, E, D, C, B, A, PR АНОД КАТОД RETLW B’lOOOOOOl’ / о B'01111111' RETLW B'11110011' ; 1 B'00001101' RETLW B'01001001' / 2 B'10110111' RETLW B'01100001' ; 3 B'10011111' RETLW B'00110011' ; 4 B'11001101' RETLW B'00100101' / 5 B'11011011' RETLW B'00000101' ./ 6 B\iinioii' RETLW B'11110001' /' 7 B'00001111' RETLW B'00000001' / 8 B'llllllll' RETLW B'00100001' / 9 B'11011111' ; 7. ИНДИКАЦИЯ. INDZIKL0 CLRWDT CLRF ANOD /ОБНУЛЯЕМ АНОД, ЧТОБЫ ОЧИСТИТЬ СТАРШИЕ РАЗРЯДЫ BSF INTCON,7 /ЧТОБЫ НЕ ПРОПУСТИТЬ ПРЕРЫВАНИЕ. BSF ANOD,0 /УСТАНОВИМ МЛ. РАЗРЯД АНОДА. MOVLW 010H /ЗАПИСЬ НОМЕРА РЕГИСТРА МЛ. РАЗРЯДА MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. INDZIKL1 MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТ В. MOVFW ANOD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ АНОДА. MOVWF PORTA /В ПОРТ А. CALL REST /НА ОТДЫХ. BCF STATUS,0 /ОБНУЛИМ. RLF ANOD,1 /+1 В РЕГИСТР АНОДА. BTFSC ANOD,3 /ЗАПИСЬ ЧИСЛА 3. GOTO INDZIKL0 /ЕСЛИ РАВНО 0, ИДЕМ, CLRWDT /ВРЕМЯ ТАЙМЕРА - 18 МС. INCF SEGD,F /+1 В РЕГИСТР АДРЕСА РАЗРЯДА. MOVFW SEGD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ GOTO INDZIKL1 /И ИДЕМ. REST . MOVLW .10 /ЗАДЕРЖКА В 41 ЦИКЛ. 82
Автомобильный цифровой тахометр RESTO ADDLW -01H ;ВРЕМЯ НА ГОРЕНИЕ СЕГМЕНТА BTFSS STATUS,2 ;64 ЦИКЛА=7,81 МСЕК. GOTO RESTO ;ЗАЦИКЛИВАЕМСЯ. / RETURN ; а— х= ; 8. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST BCF INTCON,7 ;ЗАПРЕТ ПРЕРЫВАНИЙ. MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS ;STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP BTFSC INTCON,1 /ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ В, GOTO DES1 /+1 В РЕГИСТРЫ СЧЕТА. GOTO KEY /ИНАЧЕ ИДЕМ НА ОПРОС КЛАВИАТУРЫ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR / FSR, MOVFW W_TEMP /W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 9. СЧЕТ. DES1 MOVFW DES /ЗАГРУЗКА ЗНАЧЕНИЙ МЛ. РАЗРЯДА В РАБ. РЕГИСТР SUBLW OFFH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 255. BZ SOT1 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ, INCF DES,F /ИНАЧЕ ПРИБАВИТЬ 1 В РЕГИСТР МЛ. РАЗРЯДА. BCF INTCON,1 /СБРОС ФЛАГА ПРЕРЫВАНИЯ. GOTO RECONST 9 SOT1 CLRF DES /ОБНУЛЕНИЕ РЕГИСТРА МЛ. РАЗРЯДА. MOVFW SOT /ЗАГРУЗКА СТ. РАЗРЯДА В РАБ. РЕГИСТР. SUBLW OFFH • ' ' /ВЫЧЕСТЬ'ИЗ РЕГИСТРА 255. BZ FALSH /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ЗНАЧИТ ОШИБКА. INCF SOT, F /ПРИБАВИТЬ 1 В СТ. РАЗРЯД. BCF INTCON,1 /СЦРОС ФЛАГА ПРЕРЫВАНИЯ. GOTO RECONST 9 FALSH CLRF SOT /ОБНУЛЯЕМ. CLRF DES GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. / END 83
Устройства с цифровой индикацией Программатор После публикации статьи [3] автору пришло много писем по электронной почте с просьбой расширить функциональный диапазон часов. Идя навстречу всем пожеланиям, получилась эта разработка. Хотя микроконтроллеры, по су- ти, являются однокристальными мини-ЭВМ с возможностью программирова- ния в устройствах специального назначения, имеется возможность сделать их многофункциональными. Также, как и в данной работе, многофункциональ- ность программы микроконтроллера иногда ставит в затруднительное положе- ние при определении ее названия. Назвать часами с будильником эту разработ- ку уже нельзя (хотя она может выполнять такую функцию), поскольку 32 раза просыпаться за один день — это многовато. Можно было бы назвать: «Устрой- ство для- периодического включения и выключения вентилятора (нагревателя, холодильника, освещения, бытовых приборов...)». Я остановился на програм- маторе потому, что эта разработка, на мой взгляд, идеально подходит для про- граммирования звонков в учебном заведении или программирования расписа- ния дня. В энергонезависимую память программатора можно записать 32 значения времени, в которые включится (выключится) исполнительное устройство. Ди- скретность установки — 1 минута. Поскольку исполнительный устройств мо- жет быть много, то для определенности будем называть их просто будильни- ком. Будильники имеют следующие режимы звонков: • непрерывный режим — непрерывное звучание будильника (читай: работа устройства) от одного запрограммированного времени до следующего, за- тем пауза до следующего установленного времени и т. д.; • режим 1 минута — звучание будильника 1 минуту; • режим 5 секунд — звучание будильника 5 секунд; * режим 1 секунда — звучание будильника 1 секунду. Имеется возможность устанавливать ограничения работы будильников по дням: • работа будильников все дни; • работа все дни, кроме 6 и 7 дня; • работа все дни, кроме 7 дня; • отключение всех будильников. Кроме этого в программаторе имеются следующие режимы работы: • обнуление всех установок будильников; • коррекция хода часов за неделю в пределах ±4 сек; • ручная установка часов по сигналам точного времени; • ежедневная автоустановка часов по сигналам точного времени в диапазо- не времени ±10 секунд от полуночи; • установка и индикация дней недели; • работа индикации в попеременном режиме: индикация текущего времени 10 секунд, затем индикация значения запрограммированного времени бу- дильника, следующего за сработавшим, — 2 сек. * Естественно, все цифровые значения можно легко изменить в программе под конкретные требования. 84
Программатор Рис. 20. Алгоритм работы программы программатора Для выполнения всех перечисленных возможностей пришлось полностью изменить программу микроконтроллера, хотя принципиальная схема от такой переработки пострадала мало. Рассмотрим укрупненный алгоритм работы про- граммы, который представлен на рис. 20. После пуска и выполнения всех предварительных установок включается предделитель с коэффициентом деления, равным 16. По переполнению тайме- ра TMR0, имеющего коэффициент деления 256, происходит прерывание и ин- крементируется регистр делителя на 250. Если регистр делителя переполняет- ся, последовательно инкрементируются значения регистров секунд, минут, ча- сов и дней. Таким образом, с учетом машинного цикла общий коэффициент деления составляет 4 х 16 х 256 х 250 = 4096000. То есть, регистр секунд инк- рементируется с частотой 1 секунда. После инициализации программа перехо- дит на индикацию нулевого разряда. Нулевым разрядом считается младший, т. е. разряд единиц секунд. Индикация всех разрядов происходит одинаково, и достаточно подробно рассмотреть индикацию нулевого разряда. Сначала зна- чение нулевого регистра индикации переписывается во временный регистр индикации. Временной регистр в подпрограмме индикации дополняется, в случае необходимости, установкой запятой и включения будильника. После выполнения подпрограммы индикации процессор переходит к выполнению 85
Устройства с цифровой индикацией функций программатора, которые установлены после этого разряда. Закончив работу по сравнению и установкам, программа ожидает прерывания. После отработки прерывания вся процедура повторяется со следующим разрядом. После последнего, пятого, разряда программа возвращается к индикации ну- левого разряда. Таким образом, индикация каждого разряда постоянна и длит- ся 1/250 секунды, т. е. 4 мс. За это время можно выполнить 4096 команд. Чтобы не загружать выполнением всех функций программатора после одно- го разряда, они распределены следующим образом: • в нулевом разряде происходит сравнение установленных значений буди- льников с текущим временем: • в первом разряде проверяется запрет будильников по дням; • во втором разряде проверяется значение часов на автоустановку по сигна- лам точного времени в полночь; • в третьем разряде проверяется состояние кнопок и выполняются установ- ки по нажатым кнопкам; • в четвертом разряде происходит смена индикации при изменении режима работы. На каждую из перечисленных функций можно нарисовать свой алгоритм работы^ но ничего интересного они не будут представлять. Единственное, на что можно обратить внимание, это запись в память 64 регистров информации с регистров, которые по количеству превышают флэш-память в два раза. Поско- льку во всех регистрах записи занято только 4 разряда из восьми, то при записи в память старшие 4 разряда занимают десятки (минут, часов), а в младшие 4 разряда записывается значение единиц. Сравнение записанных значений вре- мени с текущими производится в том же формате, что значительно экономит ресурсы при проверке всей флэш-памяти. Чтобы не возникало путаницы при считывании и записи, значения минут записываются в память с номером от 0 до 31. А значение часов увеличено на 32. Сначала проверяется совпадение минут, затем, если произошло совпадение, проверяется адрес, увеличенный на 32, на совпадение часов. Принципиальная схема программатора показана на рис. 21. Как видно, она мало отличается от схемы в [3] и, если вы уже сделали часы, то минимальные доработки позволят вам сделать программатор. В том и преимущество микро- контроллеров, что, изменив программу, можно придать устройству совершенно новые потребительские свойства. Эта схема оставлена из-за своей универсаль- ности, т. е. возможности установки различных семисегментных индикаторов. Для этого необходимо только заменить микросхемы дешифраторов, как это хо- рошо описано в различной литературе [2]. Выводы RAO—RA2 микроконтроллера используются для вывода 2-10 кода сегментов, а выводы RBI—RB4 — кода разряда. Вывод RB5 запрограммирован для вывода запятой. Вывод RB6 используется для выхода потенциала на испол- нительное устройство. Выводы RB7, RA3, RA4 используются как входы уста- новки соответственно: записи, разряда, установки. Вывод установки ALA испо- льзуется для включения будильника. Вывод RB0, который в часах применялся для гашения, имеет постоянный нулевой потенциал для разрешения работы микросхемы мультиплексора DD3. Гашение в программе не используется, но выход оставлен для преемственности схемы. В связи с увеличением числа 86
Программатор команд поставлен высокочастотный кварц на частоту 4,096 МГц. При этом скорректированы значения конденсаторов С1 и С2. Для подключения сильноточной нагрузки через промежуточное реле уста- новлен транзистор VT7, работающий в ключевом режиме. Для контроля вклю- чения нагрузки или для будильника может служить звуковой излучатель НСМ1206х с частотой излучения около 2 кГц. Резервное питание от двух эле- ментов типа А10—А12 или типа ААА. Работа с программатором Кнопка «Разряд» перемещает запятую для выбора разряда установки. Кнопка «Установка» прибавляет единицу в выбранный разряд. Кнопка «Запись» фиксирует установленный режим работы, производит за- пись в память значений будильников и производит автоустановку часов в полночь. Режимы работы программатора устанавливаются числами в двух младших разрядах и имеют следующие значения: 40 — режим часов; 41 — попеременный режим; 42 — установка часов; 43 — установка дней; 45 — звонок звучит непрерывно;. 46 — звонок звучит 1 минуту; 47 — звонок звучит 5 секунд; 87
Устройства с цифровой индикацией 48 — звонок звучит 1 секунду; 49 — звонок отключен; 50 — звонок звучит все дни, кроме 6,7; 51 — звонок звучит все дни, кроме 7; 52 — звонок звучит все дни; 53 — установка коррекции; 54 — обнуление всех будильников; 55 — обнуление минут и секунд часов. Все режимы установки начинают работать после фиксации их нажатием кнопки «Запись». Индикация произведенной записи выполняется сменой по- ложения запятой. Если запятая находилась в любом разряде, кроме би 1, то при выполнении фиксации режима запятая переместится в первый разряд. Это относится к режимам 45—52. При установке режимов работы 41, 42, 55 запятая перемещается в 6 разряд и индикатор высвечивает значение часов. Индикация установки 54 режима производится нулями во всех разрядах. Кнопку «Запись» не нужно нажимать при установках дней, коррекции и ча- сов. Нельзя установить два взаимоисключающих режима, таких как 45—49 и 50—52. Будет работать последний установленный режим. После выполнения любых'установок, необходимо проверить показания часов в 42 режиме и за- кончить установку в выбранном режиме часов 40 или 41. После выполнения всех необходимых установок запятая выводится в 6 фиктивный разряд (выво- дится за пределы индикатора) и программатор переходит в режим индикации значений часов с секундами. Если установлен попеременный режим, то часы индицируются 10 секунд, затем индицируется значение будильника по адресу, следующему за уже сработавшим. Если будильник еще не сработал, высвечи- вается значение будильника по первому адресу. Если необходимо переместить запятую с первого разряда в нулевой, то делать это надо, не отрывая пальца от кнопки «Разряд», чтобы проскочить 6 разряд. Иначе установка не будет выполнена. Установка адресов будильников производится установкой чисел в младших разрядах от 0 до 31. При установке значения от 32 до 39 индикатор сбрасыва- ется в ноль. Это может произойти при установке режимов, если сначала уста- новлено значение в нулевом разряде, а затем производится установка в первом разряде с переходом через тройку. Поэтому сначала лучше устанавливать зна- чение первого разряда. Значения будильников могут устанавливаться с диск- ретностью 1 минута. Если вы предусматриваете работу программатора в попе- ременном режиме индикации, то желательно программировать значения буди- льников по возрастающей. При работе в непрерывном режиме первое значение от текущего времени будет включать исполнительное устройство, а следующее — выключать его. Нулевые значения установок игнорируются про- граммой, поэтому, если необходимо срабатывание будильника в полночь, нужно выставить значение 1 минуты до или после полуночи. Если необходимо отключить выбранный будильник, достаточно установить фиктивное значение часов, например 25. Если вы не предусматриваете работу в попеременном ре- жиме, то будильники можно программировать в любой последовательности, поскольку сравнение на совпадение производится по всему массиву памяти. После установки адреса и значения будильника запись в память производится 88
Программатор нажатием кнопки «Запись». Индикация выполнения записи производится пе- ремещением запятой в нулевой разряд. Это сделано для упрощения установки адреса следующего будильника. Поскольку запись в память выполняется в третьем разряде индикации, то при удержании кнопки «Запись» яркость этого разряда увеличивается. При установке 43 режима (установка дней) значения дней индицируются в 4 разряде. На табло высвечивается: сО-сс- 43. Для установки дней недели необ- ходимо запятую переместить в четвертый разряд. Значение дней не может быть установлено более 7. Установка дней недели необходима, если вы собираетесь ввести ограничение будильников по дням. При установке 53 режима (установка коррекции) на табло высвечивается: сО-сО-53. Во втором разряде высвечивается устанавливаемое значение коррек- ции, а в четвертом разряде — значение знака коррекции. Значение коррекции не мож!ет быть более 4. Знак коррекции положителен, если в четвертом разряде ноль, и отрицательный (часы спешат) — если единица. Практика показала, что ежедневное введение коррекции нецелесообразно. При обычном кварце суточ- ный ход часов лежит в пределах ±0,5 сек. Поэтому коррекцию лучше вводить за неделю. Коррекция вводится автоматически в 00-00-05 часов при переходе из 7 дня в 1. Если вы будете пользоваться автоустановкой по сигналам точного времени, то вводить значение этого режима нет необходимости. Этот режим включается автоматически в пределах ±10 секунд от полуночи. Импульс установки должен быть подан на вывод RB7 (REC). Поскольку цикл индикации всех разрядов ра- вен 4 х 6 = 24 мкс, то длительность импульса установки не должна быть мень- ше этого значения. Установка производится высоким уровнем ТТЛ. Естествен- но, при использовании автоустановки устанавливаемое значение' коррекции (режим 53) должно быть нулевым. Режим 55 обнуление минут и секунд используется для ручной установки ча- сов при нажатии кнопки «Запись». При индикации часов кнопка «Запись» не реагирует на нажатие. Кнопка «Установка» запараллелена кнопкой с фиксато- ром «Вкл. будильника». Непрерывный режим будильника предназначен для периодического вклю- чения и выключения мощной нагрузки. Для примера на рис. 21 нагрузка включается при помощи промежуточного реле. У автора это реле типа РЭС49 паспорт PC.569.426, хотя подойдет любое на соответствующее напряжение и ток. Промежуточный каскад может быть выполнен и на оптопарах, и на си- мисторе. Режим звучания будильника 1 минута можно использовать для обычного будильника. Режим 5 секунд предназначается для подачи звонков в учебном заведении. Режим звучания будильника 1 секунда выполняется в начале каждо- го часа (кукушка) и может служить для включения мелодии, например имита- ции боя курантов. Если установить программатор в учительской на попеременном режиме, то будет видно время, оставшееся до окончания перемены или урока. Топология печатных плат и расположение элементов даны на рис. 22—24. Пунктирными линиями обозначены проводники со стороны установки эле- ментов. 89
Устройства с цифровой индикацией Рис. 22. Программатор. Печатная плата g b d К1 А6 А2 А1 BF1 h REC ALA CAT+GBl -9B +9B Рис. 23. Программатор. Расположение элементов Рис. 24. Печатная плата линейки светодиодов с общим анодом ; ПРОГРАММАТОР - ЭТО ЧАСЫ С 32-МЯ БУДИЛЬНИКАМИ, ; 4 РЕЖИМАМИ ЗВОНКОВ, ; ЗАПРЕТОМ ЗВОНКОВ' ПО ВЫХОДНЫМ И Т.П. ; И ВОЗМОЖНОСТЬЮ УНИВЕРСАЛЬНОЙ ИНДИКАЦИИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru _ . ; ПРОГРАММА = SHOOL.ASM ; ВЕРСИЯ: 01-06-03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC ^CONFIG 3FF1H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 4,096 МГЦ. ; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 16, ЧТО ВМЕСТЕ ; С TMR0 (256), ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ И ДЕЛИТЕЛЕМ НА 250,’ 90
Программатор ; ДАЕТ НА ВЫХОДЕ 1 СЕКУНДУ (4x16x256x250=4096000) • / ; RA0-RA2 - 2_10 ВЫХОД СЕГМЕНТОВ. ; RA3- ВХОД ВЫБОРА РАЗРЯДА. ; RA4- ВХОД УСТАНОВКИ И ВКЛЮЧЕНИЯ БУДИЛЬНИКОВ. ; RB1-RB4 - 2_10 ВЫХОД НОМЕРА АНОДА (КАТОДА). ; RB5- ВЫХОД ЗАПЯТОЙ. ; RB6- ВЫХОД ВКЛЮЧЕНИЯ ЗУММЕРА БУДИЛЬНИКА. ; RB7- ВХОД ЗАПИСИ. ; RB0- НА ВЫХОДЕ "0" ДЛЯ ПРЕЕМСТВЕННОСТИ СХЕМЫ С CHASU.ASM f — ; СПЕЦ РЕГИСТРЫ. INDF EQU ООН /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01Н /TMR0. OPTIONR EQU 81Н /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. , STATUS EQU O3H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ.В ВВОДА/ВЫВОДА. TRISA EQU' 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86Н /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. EEDATA EQU 08Н /ДАННЫХ ПЗУ. EEADR EQU 09Н /АДРЕСА ПЗУ. EECON1 EQU 88Н /РЕГИСТРЫ ЧТЕНИЯ-ЗАПИСИ EECON2 EQU 89Н /ПЗУ., INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. SCO SCI SC2 SC3 SC4 SC5 COUE SMC CAT EQU ОСН /МЛАДШИЙ РАЗРЯД СЧЕТЧИКА. EQU 0DH EQU 0EH EQU 0FH EQU ЮН EQU- 11Н /СТАРШИЙ РАЗРЯД. EQU 12Н /СЧЕТЧИК ЦИКЛОВ СЧИТЫВАНИЯ EQU 13Н /СЧЕТЧИК 4 МИЛЛИСЕКУНД. EQU 14Н /УСТАНОВКА ЗАПЯТОЙ. И ЗАПИСИ. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG. FLAG EQU 15Н 0-> ВКЛЮЧЕНИЕ ЗВОНКА. 1-> ВКЛЮЧЕНИЕ КОРРЕКЦИИ. В 0-0-0 Ч-М-С. 2-> ФЛАГ УСТАНОВКИ. 3-> РАВЕНСТВА МИНУТ БУДИЛЬНИКОВ. 4-> УСТАНОВКА Ч/уЗОВ. 5-> РЕЗЕРВ. 6-> УСТАНОВКА БУДИЛЬНИКОВ. 7-> РАВЕНСТВА ЧАСОВ БУДИЛЬНИКА. 91
Устройства с цифровой индикацией ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ СЧЕТА. SECL EQU 020Н /ЕДИНИЦЫ СЕКУНД. SECH EQU 021Н /ДЕСЯТКИ СЕКУНД. MINL EQU 022Н /ЕДИНИЦЫ минут. MINH EQU 023Н /ДЕСЯТКИ МИНУТ. HOUL EQU 024Н /ЕДИНИЦЫ ЧАСОВ. HOUH EQU 025Н /ДЕСЯТКИ ЧАСОВ. DAY1 EQU 026Н /СЧЕТЧИК ДНЕЙ НЕДЕЛИ ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG1. FLAG1 EQU 027Н ; ; 0-> РЕЖИМ ЧАСОВ. ; 1-> УСТАНОВКА ДНЕЙ. ; 2-> РАВЕНСТВА БУДИЛЬНИКА.' ; 3—> ЗАПРЕТ БУДИЛЬНИКОВ ПО ДНЯМ. ; 4-> УСТАНОВКА ПОПЕРЕМЕННОГО РЕЖИМА. ; 5-> НЕПРЕРЫВНОЕ ЗВУЧАНИЕ БУДИЛЬНИКА. ; 6-> ЗВОНОК 1 МИНУТУ. ; 7-> ЗВОНОК 5 СЕКУНД. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG2. FLAG2 EQU ОЗОН ; ; 0-> ЗВОНОК КАЖДЫЙ ЧАС ПО 1 СЕКУНДЕ (БОЙ). ; 1-> УСТАНОВКА КОРРЕКЦИИ. / 2-> БУДИЛЬНИК ЗВОНИТ ВСЕ ДНИ, КРОМЕ 6,7 ДНЯ. ; 3-> ....КРОМЕ 7 ДНЯ. ; 4-> ....ВСЕ ДНИ. ; 5-> БУДИЛЬНИКИ ОТКЛЮЧЕНЫ. ; 6-> ОБНУЛЕНИЕ ВСЕХ БУДИЛЬНИКОВ. ; 7-> ОБНУЛЕНИЕ ЧАСОВ. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG3. FLAG3 EQU 032Н / 0-> ЗАПЯТАЯ ЗА ИНДИКАТОРОМ. 1-> РЕЗЕРВ. 2-> РАВЕНСТВА ЧАСОВ В ПОЛНОЧЬ. 3-> РАВЕНСТВА МИНУТ В ПОЛНОЧЬ. 4-> РАВЕНСТВА СЕКУНД В ПОЛНОЧЬ 5-> • РЕЗЕРВ. 6-> РЕЗЕРВ. 7-> • РЕЗЕРВ. РЕГИСТРЫ: УСТАНОВКИ, БУДИЛЬНИКОВ, КОРРЕКЦИИ, ГАШЕНИЯ. ZVONS EQU 028Н ;СЧЕТЧИК СЕКУНД ЗВОНКА. COBAHU EQU 029Н /СЧЕТЧИК ПОПЕРЕМЕННОЙ ИНДИКАЦИИ. ZVONNEP EQU 02АН /СЧЕТЧИК МИНУТ НЕПРЕРЫВНОГО РЕЖИМА. 92
Программатор BUDHEX EQU 01DH /ВОСЬМЕРИЧНОЕ ЗНАЧЕНИЕ НОМЕРА БУДИЛЬНИКА. ANOD EQU 02EH /АНОД, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ(0-5). SEG EQU 02FH /СЕГМЕНТЫ, ДЕСЯТИЧНОЕ ЗНАЧ.(2-10 КОД). COR EQU 033H /РЕГИСТР УСТАНОВКИ КОРРЕКЦИИ. W_TEMP EQU 034H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 035H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ BUHL EQQ 036H ./ЕДИНИЦЫ ЧАСОВ БУДИЛЬНИКА. BUHH EQU 037H /ДЕСЯТКИ ЧАСОВ БУДИЛЬНИКА. COBA EQU 038H /АДРЕС СРАБОТАВШЕГО БУДИЛЬНИКА. FSR_TEMP EQU 039H /ВРЕМЕННЫЙ ДЛЯ FSR. CORNEG ' EQU 03AH /ЗНАК КОРРЕКЦИИ, БИТ-0. NEGCOR EQU 03BH /ВРЕМЕННЫЙ ДЛЯ ОТРИЦАТЕЛЬНОЙ КОРРЕКЦИИ. BUM EQU 03CH /РЕГИСТР МИНУТ БУДИЛЬНИКА. BUDO EQU 03DH /ЕДИНИЦЫ НОМЕРА БУДИЛЬНИКА. BUD1 EQU 03EH /ДЕСЯТКИ НОМЕРА БУДИЛЬНИКА. вин EQU 03FH /РЕГИСТР ЧАСОВ БУДИЛЬНИКА. BUML EQU 040H /ЕДИНИЦЫ МИНУТ БУДИЛЬНИКА. BUMH EQU 041H /ДЕСЯТКИ МИНУТ БУДИЛЬНИКА. ACOU EQU 047H /СЧЕТЧИК ЦИКЛОВ ЗАПИСИ.' SB2 EQU 048H /МЛ. РАЗРЯД ЗНАЧЕНИЙ ТЕКУЩЕГО БУДИЛЬНИКА. SB3 EQU 049H Г SB4 EQU 04 AH SB5 EQU 04BH /СТ. РАЗРЯД ЗНАЧЕНИЙ ТЕКУЩЕГО БУДИЛЬНИКА. ; 1. ПУСК. ORG О GOTO INIT ORG 4 ’ GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'00000011' /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=16 ...011, MOVWF OPTION_REGA80rf /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ. MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА. MOVWF INTCON MOVLW B'00011000' / RA0-RA2-HA ВЫХОД, RA3,РА4-ВХОД. MOVWF TRISAA80H MOVLW B'lOOOOQOO' ; RB0-RB6-HA ВЫХОД, РВ7-ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. BCF PORTB,6 /СБРОСИМ БИТ БУДИЛЬНИКА. CLRF CORNEG /СБРАСЫВАЕМ ФЛАГ ЗНАКА КОРРЕКЦИИ, CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF FLAG1 CLRF FLAG2 CLRF FLAG3 CLRF- TMR0 * /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCO , CLRF SCI 93
Устройства с цифровой индикацией CLRF SC2 CLRF SC3 CLRF SC4 4* CLRF SC5 CLRF SECL CLRF SECH CLRF MINL CLRF, MINH CLRF HOUL CLRF HOUH CLRF BUML CLRF BUMH CLRF BUHL CLRF BUHH CLRF COR CLRF SMC CLRF ZVONS QLRF ZVONNEP CLRF COBAHU MOVLW .1 ;УСТАНАВЛИВАЕМ ВЫБОР MOVWF CAT ;РАЗРЯДА MOVWF DAY1 /И ДНИ НЕДЕЛИ. MOVWF MINL GOTO ZIKL /ИДЕМ НА ИНДИКАЦИЮ. , ; 3. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. KEY BTFSC FLAG3,0 /ЕСЛИ ЗПТ ЗА ПРЕДЕЛАМИ ИНДИКАТОРА, GOTO KEYO /КНОПКА ЗАПИСИ НЕ РАБОТАЕТ. BTFSC PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ЗАПИСИ, GOTO KEYZ /ИДЕМ НА ЗАПИСЬ. KEYO BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА (ЗАПЯТАЯ) НАЖАТА CALL САТК /ИДЕМ СРАВНИВАТЬ РАЗРЯД УСТАНОВКИ. BTFSC FLAG3,0 /ЕСЛИ ЗПТ ЗА ИНДИКАТОРОМ, GOTO KEY1 /ПРОПУСКАЕМ УСТАНОВКУ. BTFSC PORTA,4 /ЕСЛИ НАЖАТА КНОПКА УСТАНОВКИ, CALL UST /ИДЕМ НА УСТАНОВКУ. KEY1 BTFSC FLAG,1 /ЕСЛИ ПОЛНОЧЬ НАСТУПИЛА, ' GOTO KEYC /ИДЕМ СЧИТАТЬ 5 СЕКУНД, RETURN KEYC MOVLW .5 /5 СЕК SUBWF SC0,0 /ЕСЛИ НЕ РАВНО 0, ПРОПУСКАЕМ BZ CORN /ИЛИ ИДЕМ КОРРЕКТИРОВАТЬ СЕКУНДЫ. RETURN KEYZ BTFSC FLAG,6 /ПРИ УСТАНОВКЕ GOTO KEYZO /РАЗРЕШАЕТСЯ ЗАПИСЬ. BTFSC FLAG1,O /ЕСЛИ ЧАСЫ РАБОТАЮТ, RETURN /ЗАПРЕЩЕНА ЗАПИСЬ. BTFSC FLAG1,4 /В ПОПЕРЕМЕННОМ РЕЖИМЕ 94
Программатор RETURN /ЗАПИСЬ ЗАПРЕЩЕНА. KEYZO ВСЕ FLAG,6 /СБРОСИМ ФЛАГ УСТАНОВКИ БУДИЛЬНИКОВ. GOTO ZAPIS /НА ЗАПИСЬ. / 4. ЗАПИСЬ ЗНАЧЕНИЙ БУДИЛЬНИКОВ. ZAPBIN MOVFW SCI ПЕРЕКОДИРОВКА ДЕСЯТИЧНОГО ЗНАЧЕНИЯ ADDWF PC,1 /ДЕСЯТКОВ НОМЕРА БУДИЛЬНИКА В ДВОИЧНОЕ. RETLW В'00000000’ 0 RETLW В’00001010’ 10 RETLW В’00010100' 20 RETLW В’00011110' 30 RETLW В’00101000’ 40 RETLW В’00110010’ 50 / RETLW В'00111100' 60 .ZAPIS MOVLW .4 ЗАПИСЬ В ПАМЯТЬ ВОЗМОЖНА SUBWF SC1,O ТОЛЬКО ПРИ 3 В ПЕРВОМ РАЗРЯДЕ. BTFSC STATUS,0 , RETURN BTFSC FLAG2,6 ЕСЛИ ФЛАГ ОБНУЛЕНИЯ ВСЕХ БУДИЛЬНИКОВ УСТАНОВЛЕН GOTO scoo ИДЕМ ОБНУЛЯТЬ. CALL ZAPBIN ПЕРЕКОДИРОВКА НОМЕРА БУДИЛЬНИКА ADDWF SC0,0 ИЗ ДЕСЯТИЧНОГО В ДВОИЧНОЕ MOVWF BUDHEX ЧИСЛО. ZAPOO’ MOVLW .32 ЕСЛИ ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ SUBWF BUDHEX,0 НОМЕРА БУДИЛЬНИКА BTFSC STATUS,0 БОЛЬШЕ ИЛИ РАВНО 32, GOTO ZABOR ИДЕМ ОБНУЛЯТЬ. BTFSC FLAG2,6 ЕСЛИ ОБНУЛЕНИЕ БУДИЛЬНИКОВ УСТАНОВЛЕНО, GOTO ZAPISM ИДЕМ НА ЗАПИСЬ. BTFSC FLAG,6 ЕСЛИ УСТАНОВКА ВКЛЮЧЕНА, RETURN ВОЗВРАТ. ZAPISO SWAPF BUMH,0 ЗАПИСЬ МЛАДШЕГО И СТАРШЕГО IORWF BUML,0 РЕГИСТРОВ МИНУТ MOVWF BUM В ОДИН РЕГИСТР ЗАПИСИ МИНУТ. SWAPF BUHH,0 ЗАПИСЬ МЛАДШЕГО И СТАРШЕГО IORWF BUHL,0 РЕГИСТРОВ ЧАСОВ MOVWF BUH В ОДИН РЕГИСТР ЗАПИСИ ЧАСОВ. ZAPISM BTFSC ACOU,0 ПРИ ЕДИНИЧНОМ ЗНАЧЕНИИ СЧЕТЧИКА GOTO ZAPISH ИДЕМ НА ЗАПИСЬ ЧАСОВ. MOVFW BUDHEX MOVWF EEADR MOVFW' BUM ИНАЧЕ ЗАПИСЫВАЕМ МИНУТЫ. MOVWF EEDATA GOTO ZAPISE ZAPISH J* MOVFW BUDHEX ЗНАЧЕНИЯ ЧАСОВ ЗАПИСЫВАЕМ ADDLW .32 •НАЧИНАЯ С 32 АДРЕСА. 95
Устройства с цифровой индикацией MOVWF EEADR MOVFW BUH MOVWF EEDATA ; * ZAPISE BCF INTCON,GIE /ЗАПРЕТ ПРЕРЫВАНИЙ. BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,WREN /РАЗРЕШЕНИЕ ЗАПИСИ.2 MOVLW 55H- /ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ MOVWF EECON2A80H // , MOVLW ОААН // MOVWF EECON2A80H // BSF EECON1A80H,WR /ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ. ZAPIZ BTFSS EECON1A80H,4 /ПОКА НЕ БУДЕТ ЗАПИСИ GOTO •ZAPIZ- /ХОДИМ ПО КРУГУ. BCF INTCON,6 . /ЗАПРЕТ ПРЕРЫВАНИЯ ПО ЗАПИСИ В ПАМЯТЬ. BCF EECON1A80H,4 / BCF EECON1A80H,WREN /ЗАПРЕТ ЗАПИСИ. BCF STATUS,RPO /БАНК 0. INCF ACOU,1 . /+1 В СЧЕТЧИК ЦИКЛА. MOVLW .2 /0-1. ' SUBWF ACOU,0 BZ EECNOO GOTO ZAPISM /ПО КРУГУ-ДО КОНЦА ЗАПИСИ. ZABOR . BCF FLAG2,6 ;ОБНУЛЕНИЕ ФЛАГА CLRF SCO /И РЕГИСТРОВ НОМЕРА ЗАПИСИ. CLRF SCI RETURN f EECNOO CLRF ACOU /ПО ОКОНЧАНИИ ЗАПИСИ ОБНУЛЯЕМ СЧЕТЧИК CLRF CAT ' /И ПЕРЕМЕЩАЕМ ЗАПЯТУЮ В НУЛЕВОЙ РАЗРЯД BTFSS FLAG2,6 /ЕСЛИ ИДЕТ ОБНУЛЕНИЕ ВСЕХ БУДИЛЬНИКОВ, RETURN /ПРОПУСКАЕМ ВОЗВРАТ. SC31 INCF BUDHEX,1 /УВЕЛИЧИМ СЧЕТЧИК GOTO ZAPOO /И ИДЕМ НА ЗАПИСЬ НУЛЕЙ. SCOO CLRF BUM /ОБНУЛЯЕМ РЕГИСТР МИНУТ CLRF BUH /И ЧАСОВ. GOTO ZAPOO /НА ЗАПИСЬ. ; 5. ВЫБОР РАЗРЯДА УСТАНОВКИ (ЗАПЯТОЙ). САТК BTFSS FLAG,2 RETURN INCF CAT,1 BCF FLAG,2 MOVFW CAT SUBLW .7 BZ CATKO RETURN . CATKO /УСТАНОВКА РАЗРЕШЕНА ЕСЛИ ПРОШЛА 1 СЕК. ,-+1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. /ЧТОБЫ ЖДАТЬ ДО СЛЕДУЮЩЕЙ СЕКУНДЫ. /6 РАЗРЯД ФИКТИВНЫЙ, ЧТОБЫ УБРАТЬ ЗАПЯТУЮ /С ИНДИКАТОРА. /НЕ БОЛЕЕ 6, /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. Г
Программатор CLRF CAT /ОБНУЛЕНИЕ. BCF FLAG3,0 /СБРОСИМ ФЛАГ 6 РАЗРЯДА. RETURN / 6. ВЫБОР РЕЖИМА УСТАНОВКИ. ATTU MOVLW .6 /ЕСЛИ ЗАПЯТАЯ ЗА ПРЕДЕЛАМИ SUBWF CAT, 0 /ИНДИКАТОРА, BZ ATTUH /ИДЕМ В РЕЖИМ ЧАСОВ. BCF FLAG1,4 /ПРИ УСТАНОВКЕ РАБОТАЕТ BSF FLAG1,0 /РЕЖИМ ЧАСОВ. MOVLW .4 /ЕСЛИ 4 В ПЕРВОМ РАЗРЯДЕ, SUBWF SCI, 0 BZ ATTU4 /ИДЕМ НА ВЫБОР РЕЖИМА. MOVLW .5 /ЕСЛИ 5 В ПЕРВОМ РАЗРЯДЕ, SUBWF SCI, 0 BZ ATTU5 /ИДЕМ НА ВЫБОР РЕЖИМА». MOVLW .6 SUBWF SCI, 0 /ЕСЛИ 6 В ПЕРВОМ РАЗРЯДЕ, BTFSC STATUS,2 CLRF SCI /ОБНУЛЯЕМ РАЗРЯД. BSF FLAG,6 /ИНАЧЕ ПОСТАВИМ ФЛАГ УСТАНОВКИ GOTO BIN /ИДЕМ НА ИНДИКАЦИЮ БУДИЛЬНИКОВ ATTU4 BCF FLAG,6 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW SCO /ПО ЗНАЧЕНИЮ НУЛЕВОГО РАЗРЯДА* ADDWF PC, 1 /ВЫБЕРЕМ РЕЖИМ ИНДИКАЦИИ. GOTO HATUB /УСТАНОВКА РЕЖИМА ЧАСОВ. GOTO HOBBI /ПОПЕРЕМЕННЫЙ РЕЖИМ. GOTO HATU /УСТАНОВКА ЧАСОВ. GOTO. DIN /УСТАНОВКА ДНЕЙ. GOTO INDSC /ВСЕ НУЛИ. GOTO BUNE /НЕПРЕРЫВНЫЙ РЕЖИМ ЗВОНКА. GOTO BUI /ЗВОНОК 1 МИНУТУ. GOTO BU5 /ЗВОНОК 5 СЕК. GOTO BOI /ЗВОНОК 1 СЕК КАЖДЫЙ ЧАС. GOTO BUVO /ЗВОНОК ОТКЛЮЧЕН. ATTU5 BCF FLAG,6 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW SCO /ПО ЗНАЧЕНИЮ НУЛЕВОГО РАЗРЯДА ADDWF PC, 1 /ВЫБЕРЕМ РЕЖИМ ИНДИКАЦИИ. GOTO BU67 /ЗВОНОК ВСЕ ДНИ КРОМЕ 6 И 7. GOTO BU7 /ВСЕ ДНИ КРОМЕ 6. GOTO BUV /ЗВОНОК ВСЕ ДНИ. GOTO CORAT /УСТАНОВКА КОРРЕКЦИИ. GOTO BUOO /ОБНУЛЕНИЕ ВСЕХ БУДИЛЬНИКОВ. GOTO RETURN RETURN RETURN RETURN ATOO /ОБНУЛЕНИЕ ЧАСОВ. / г г t ATTUH J* BSF FLAG3,0 /УСТАНОВИМ ФЛАГ 6 РАЗРЯДА. BCF FLAG,6 /СБРОСИМ ФЛАГ УСТАНОВКИ. 4 Зак. 2418 97
Устройства с цифровой индикацией GOTO HAT /НА ИНДИКАЦИЮ ЧАСОВ. ; 7. ОБНУЛЕНИЕ МИНУТ И СЕКУНД. АТОО ВСЕ FLAG,4 ;СБРОСИМ ФЛАГ УСТАНОВКИ. АТОК BTFSS PORTB,7 /ПРОВЕРКА НАЖАТИЯ КНОПКИ ЗАПИСИ. RETURN MOVLW . 9 /НЕТ. /ДА. SUBWF MINL,0 /ЕСЛИ В МИНУТАХ 9, BTFSC STATUS,2 /НАДО УВЕЛИЧИТЬ CALL HLU /ЗНАЧЕНИЕ ЧАСОВ. CLRF SECL /ОБНУЛЯЕМ ДЛЯ УСТАНОВКИ ЧАСОВ CLRF SECH CLRF MINL /ПО СИГНАЛАМ ТОЧНОГО ВРЕМЕНИ. CLRF MINH BTFSC FLAG3,4 /ЕСЛИ УСТАНОВЛЕН ФЛАГ АВТОСБРОСА, CALL KYRAO /СХОДИМ СБРОСИТЬ ФЛАГИ. . MOVLW .6 /ПОСЛЕ УСТАНОВОК MOVWF CAT /ЗАПЯТАЯ ПЕРЕМЕЩАЕТСЯ В 6 РАЗРЯД GOTO HATUH /ПРОИНДИЦИРУЕМ НОВОЕ ЗНАЧЕНИЕ. ; 8. УСТАНОВКА РАЗРЯДОВ ИНДИКАЦИИ. UST BTFSS FLAG,2 /ЕСЛИ СБРОШЕН ФЛАГ УСТАНОВКИ, RETURN BCF FLAG,2 ;ВОЗВРАЩАЕМСЯ. /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW CAT /ПО ПОЛОЖЕНИЮ ЗАПЯТОЙ ADDWF PC, 1 /ОПРЕДЕЛЯЕМ РАЗРЯД УСТАНОВКИ. GOTO USTO /0 GOTO UST1 /1 GOTO UST2 /2 GOTO UST3 /3 GOTO UST4 /4 GOTO UST5 /5 GOTO HAT /ИНДИКАЦИЯ ЧАСОВ. USTO INCF SCO, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 SUBWF SCO, 0 BTFSC STATUS,0 /С (ПЕРЕНОС) = 1, ЕСЛИ 10’И БОЛЕЕ CLRF ' SCO / GOTO ' UST6 / UST1 INCF SCI, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 5. MOVLW .6 9 SUBWF SCI, 0 9 BTFSC STATUS,0 9 CLRF SCI 9 GOTO UST6 9 UST2 INCF SQ2, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 98
Программатор SUBWF SC2, 0 BTFSC STATUS,0 ; CLRF SC2 GOTO UST6 ' ; UST3 INCF SC3,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 5 MOVLW .6 SUBWF SC3,0 BTFSC STATUS,0 / CLRF SC3 GOTO UST6 UST4 INCF SC4,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9 MOVLW .10. SUBWF SC4,0 BTFSC STATUS,0 / CLRF SC 4 GOTO UST6 UST5 INCF SC5,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2 MOVLW .3 SUBWF SC5,0 BTFSC STATUS,0 / ‘ CLRF SC5 GOTO UST6 ; 9. ЗАПРЕТ БУДИЛЬНИКОВ ПО ДНЯМ. BUR7 BCF FLAG,4 MOVLW .7 /ЕСЛИ УЖЕ 7 ДЕНЬ, SUBWF DAY1,0 7 SKPNZ BSF FLAG1,3 /УСТАНОВИМ ФЛАГ ЗАПРЕТА ПО дням SKPZ BCF FLAG1,3 /ИНАЧЕ СБРОСИМ ФЛАГ. RETURN 9 BUR67 BCF FLAG,4 MOVLW .6 /ЕСЛИ УЖЕ 6 ДЕНЬ, SUBWF DAY1,0 9 SKPNZ BSF FLAG1,3 /УСТАНОВИМ ФЛАГ ЗАПРЕТА ПО дням SKPZ BCF FLAG1,3 /ИНАЧЕ СБРОСИМ.ФЛАГ. SKPZ GOTO BUR7 /ИДЕМ ПРОВЕРЯТЬ 7 ДЕНЬ. RETURN 9 10. УСТАНОВКА ФЛАГОВ РЕЖИМОВ. HATUB BTFSS PORTB,?’ /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. BSF FLAG1,0 /УСТАНОВИМ РЕЖИМ ЧАСОВ. ' 99
Устройства с цифровой индикацией BCF FLAG1,4 ;СБРОСИМ ПОПЕРЕМЕННЫЙ РЕЖИМ. MOVLW . 6 ;ПРОИНДИЦИРУЕМ УСТАНОВКУ MOVWF CAT ;СМЕНОЙ ПОЛОЖЕНИЯ ЗАПЯТОЙ. * RETURN HOBBI BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. BSF FLAG1,4 ;УСТАНОВИМ ПОПЕРЕМЕННЫЙ РЕЖИМ. BCF FLAG1,0 /СБРОСИМ РЕЖИМ ЧАСОВ. MOVLW .6 /ПРОИНДИЦИРУЕМ УСТАНОВКУ MOVWF CAT ;СМЕНОЙ ПОЛОЖЕНИЯ ЗАПЯТОЙ. RETURN BUNE BCF FLAG,4 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, - RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,5 /ВКЛЮЧИМ ФЛАГ НЕПРЕРЫВНОГО ЗВУЧАНИЯ БУДИЛЬНИКА. BCF FLAG1,6 /СБРОСИМ ФЛАГИ ДРУГИХ ЗВОНКОВ. BCF FLAG1,7 9 BCF FLAG2,0 . BCF FLAG2,5 /И ФЛАГ ОТКЛЮЧЕНИЯ БУДИЛЬНИКОВ. * GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BUI BCF FLAG,4 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,6 /ВКЛЮЧИМ ФЛАГ 1 МИНУТЫ. BCF FLAG1,5 /СБРОСИМ ФЛАГИ ДРУГИХ ЗВОНКОВ. BCF FLAG1,7 9 BCF FLAG2,0 BCF FLAG2,5 /И ФЛАГ ОТКЛЮЧЕНИЯ БУДИЛЬНИКОВ. GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BU5 BCF FLAG, 4, BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,7 /ВКЛЮЧИМ ФЛАГ 5 СЕКУНД. BCF FLAG1,6 /СБРОСИМ ФЛАГИ ДРУГИХ ЗВОНКОВ. BCF FLAG1,5 9 BCF FLAG2,0 BCF FLAG2,5 /И ФЛАГ ОТКЛЮЧЕНИЯ БУДИЛЬНИКОВ. GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BO I BCF FLAG,4 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG2,0 /ВКЛЮЧИМ ФЛАГ 1 СЕКУНДЫ. BSF FLAG1,0 /В ЭТОМ РЕЖИМЕ НЕ МОЖЕТ БЫТЬ ПОПЕРЕМЕННОГО РЕЖИМА. BCF FLAG1,4 /СБРОСИМ ФЛАГИ ДРУГИХ ЗВОНКОВ. BCF FLAG1,6 9 BCF FLAG1,7 BCF FLAG2,5 /И ФЛАГ ОТКЛЮЧЕНИЯ БУДИЛЬНИКОВ. GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. 100
Программатор BU67 BCF FLAG,4 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ HE НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. BSF FLAG2,2 /ВКЛЮЧИМ ФЛАГ ЗВОНКА КРОМЕ ВЫХОДНЫХ ДНЕЙ BCF FLAG2,3 ;СБРОСИМ ФЛАГИ ДРУГИХ РЕЖИМОВ ПО дням. BCF FLAG2,4' GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BU7 BCF FLAG,4 BTFSS PORTB,7 ;ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG2,3 /ВКЛЮЧИМ ФЛАГ ВОСКРЕСНОГО ДНЯ. BCF FLAG2,2 /СБРОСИМ ФЛАГИ ДРУГИХ РЕЖИМОВ ПО дням. BCF FLAG2,4 GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BUV 1 BCF FLAG,4 BTFSS, PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG2,4 /ВКЛЮЧИМ ЗВОНОК ПО ВСЕМ ДНЯМ. BCF FLAG1,3 /СБРОСИМ ФЛАГ ЗАПРЕТА ПО ДНЯМ.’ BCF FLAG2,3 /СБРОСИМ’ ФЛАГИ ДРУГИХ РЕЖИМОВ ПО дням. BCF FLAG2,2 GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BUVO BCF . FLAG,4 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,3 /УСТАНОВИМ ФЛАГ ЗАПРЕТА ЗВОНКА ПО ДНЯМ. BCF FLAG2,3 /СБРОСИМ ФЛАГИ ДРУГИХ РЕЖИМОВ ПО дням. BCF FLAG2,4 / BCF FLAG2,2 GOTO BUCAT /НА СМЕНУ ЗАПЯТОЙ. BUOO BCF FLAG,4 BCF FLAG2,1 BTFSS PORTB,7 /ЕСЛИ КНОПКА ЗАПИСИ НЕ НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG2,6 /ВКЛЮЧИМ ОБНУЛЕНИЕ ВСЕХ БУДИЛЬНИКОВ. CLRF SCO /ОБНУЛИМ 0 И 1 РАЗРЯДЫ. CLRF SCI CLRF BUDHEX /ОБНУЛИМ СЧЕТЧИК АДРЕСА ЗАПИСИ. CALL BUCAT /НА СМЕНУ ЗАПЯТОЙ. GOTO KEYZ /И ПОЙДЕМ НА ЗАПИСЬ. BUCAT MOVLW .1 /ПОСЛЕ УСТАНОВОК ФЛАГОВ MOVWF CAT /ЗАПЯТАЯ ПЕРЕМЕЩАЕТСЯ В ПЕРВЫЙ РАЗРЯД. RETURN t ; 11. ЗАПИСЬ УСТАНОВОК J3 РЕГИСТРЫ. UST6 BTFSC FLAG,6 101
Устройства с цифровой индикацией GOTO BUST /РЕГИСТРЫ: БУДИЛЬНИКА BTFSC FLAG,4 GOTO HUST ;ЧАСОВ BTFSC FLAG1,1 GOTO DUST ; ДНЕЙ BTFSC FLAG2,1 GOTO RETURN CUST /КОРРЕКЦИИ. ; 12. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ. BUST BCF FLAG,6 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ РЕГИСТРОВ ИНДИКАЦИИ / MOVWF - BUML /В РЕГИСТРЫ БУДИЛЬНИКА. MOVFW SC3 9 MOVWF BUMH 9 MOVFW SC4 9 MOVWF BUHL 9 MOVFW SC5 9 MOVWF BUHH 9 RETURN HUST BCF FLAG,4 /СБРОСИМ ФЛАГ УСТАНОВКИ ЧАСОВ MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ РЕГИСТРОВ ИНДИКАЦИИ MOVWF MINL /В РЕГИСТРЫ ЧАСОВ. MOVFW SC3 9 MOVWF MitiH MOVFW SC4 / MOVWF HOUL 9 MOVFW SC5 9 MOVWF HOUH 9 RETURN DUST BCF FLAG1,1 /СБРОСИМ ФЛАГ УСТАНОВКИ ДНЕЙ. MOVLW . 10 /ВО 2,3,5 РАЗРЯДЫ ЗАПИШЕМ' "с" MOVWF SC2 9 MOVWF SC3 9 MOVWF SC5 MOVLW .8 /8 ДНЯ НЕТ. SUBWF SC4,0 BTFSC STATUS,0 /ЕСЛИ 8 ИЛИ БОЛЬШЕ, CLRF SC4 /ОБНУЛИМ. BTFSC STATUS,0 BSF SC4,0 /И УСТАНОВИМ В 1. MOVFW SC4 /ПЕРЕПИШЕМ В РЕГИСТР ДНЕЙ. MOVWF DAY1 9 RETURN CUST BCF FLAG2,1 /СБРОСИМ ФЛАГ УСТАНОВКИ КОРРЕКЦИИ. . MOVLW .10 /В 3,5 РАЗРЯДЫ ЗАПИШЕМ "с". MOVWF SC3 9 MOVWF SC5 MOVLW .2 /ЕСЛИ ЗПТ ВО ВТОРОМ РАЗРЯДЕ, SUBWF CAT, 0 9 102
Программатор SKPZ GOTO 'CUSTG /ПРОПУСТИМ. MOVLW .5 /ЗНАЧЕНИЕ МОЖЕТ БЫТЬ НЕ БОЛЕЕ 4. SUBWF SC2, 0 / BTFSC STATUS,0 CLRF SC2 /ИНАЧЕ ОБНУЛЯЕМ РАЗРЯД. MOVFW SC2 MOVWF COR /ПЕРЕПИШЕМ В РЕГИСТР КОРРЕКЦИИ. RETURN CUSTG MOVLW .4 /ЕСЛИ ЗАПЯТАЯ SUBWF CAT, 0 /В 4 РАЗРЯДЕ, SKPZ RETURN /ПРОПУСТИМ. • MOVLW .2 /ЗНАЧЕНИЕ ЗНАКА КОРРЕКЦИИ НЕ БОЛЕЕ 1 SUBWF SC4,0 9 BTFSC STATUS,0 CLRF SC4 /ЕСЛИ БОЛЕЕ 1, ОБНУЛИМ. MOVFW SC4 /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ЗНАКА MOVWF CORNEG /В РЕГИСТР ЗНАКА КОРРЕКЦИИ. RETURN ; 13. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА. HAT BTFSC PORTA,3 /ЕСЛИ КНОПКА РЕЖИМА НАЖАТА, RETURN ,• ВОЗВРАЩАЕМСЯ. BTFSC FLAG1,4 /ЕСЛИ ВКЛЮЧЕН ПОПЕРЕМЕННЫЙ РЕЖИМ, GOTO HOB I /ИДЕМ НА ЭТОТ РЕЖИМ. HATU BCF FLAG1,1 /СБРОСИМ ФЛАГ УСТАНОВКИ ДНЕЙ. BSF FLAG,4 /ВКЛЮЧИМ ФЛАГ УСТАНОВКИ ЧАСОВ. HATUH BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА'РЕЖИМА НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BTFSC FLAG3,0 /ЕСЛИ ЗАПЯТАЯ, НЕ В 6 РАЗРЯДЕ, CALL HAT1 /ПРОПУСТИМ ЗАПИСЬ В РАЗРЯДЫ СЕКУНД MOVFW MINL /ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ MOVWF SC2 /ЗНАЧЕНИЯ РЕГИСТРОВ ЧАСОВ. MOVFW MINH / MOVWF SC3 ’ MOVFW нои!' . '"‘'Ц 9 MOVWF SC4 9 MOVFW . HOUH 9 MOVWF SC5 9 BTFSC FLAG1,4 BCF FLAG,2 /СБРОСИМ ФЛАГ УСТАНОВКИ RETURN /ДЛЯ ПОПЕРЕМЕННОГО РЕЖИМА. НАТ1 MOVFW SECL' /ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ MOVWF SCO /ЗНАЧЕНИЯ РЕГИСТРОВ СЕКУНД. MOVFW SECH 9 MOVWF RETURN SCI 9 103
Устройства с цифровой индикацией BIN BCF . FLAG,4 ;СБРОСИМ ФЛАГ УСТАНОВКИ ЧАСОВ. MOVLW .2 ;СМЕНА ИНДИКАЦИИ SUBWF CAT, 0 /ЕСЛИ ЗПТ В НУЛЕВОМ BTFSC STATUS,0 /ИЛИ ПЕРВОМ РАЗРЯДЕ. RETURN CALL ZAPIS /ИДЕМ НА ЗАПИСЬ, ЧТОБЫ MOVFW BUDHEX /ПЕРЕКОДИРОВАТЬ НОМЕР БУДИЛЬНИКА. MOVWF COUE /ПЕРЕПИШЕМ ЕГО В РЕГИСТР АДРЕСА. BINHB CALL AKTETE /СЧИТАЕМ ЗНАЧЕНИЕ БУДИЛЬНИКА MOVFW EEDATA /ПО ЭТОМУ АДРЕСУ. MOVWF BUML /РАСШИФРУЕМ ЗНАЧЕНИЕ ПО МЛАДШЕМУ MOVLW B'OOOOllll 9 ANDWF BUML,1 9 MOVFW EEDATA MOVWF BUMH ;И СТАРШЕМУ РЕГИСТРАМ МИНУТ. SWAPF BUMH,1 9 MOVLW B'OOOOllll 9 ANDWF BUMH,1 MOVFW BUML /ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ. MOVWF SC2 9 MOVFW BUMH 9 MOVWF SC3 MOVLW .32 /МИНУТЫ ЗАПИСАНЫ ДО 31 АДРЕСА, ADDWF COUE,1 /ЧАСЫ С 32 АДРЕСА. CALL AKTETE /СЧИТАЕМ ЗНАЧЕНИЕ ЧАСОВ. MOVFW EEDATA /РАСШИФРУЕМ ЗНАЧЕНИЕ ПО МЛАДШЕМУ MOVWF BUHL 9 MOVLW B'OOOOllll 9 ANDWF BUHL,1 9 MOVFW EEDATA MOVWF BUHH /И СТАРШЕМУ РЕГИСТРАМ ЧАСОВ. SWAPF BUHH,1 9 MOVLW B'OOOOllll 9 ANDWF BUHH,1 MOVFW BUHL /ПЕРЕПИШЕМ ЗНАЧЕНИЯ ЧАСОВ MOVWF SC4 /В РЕГИСТРЫ ИНДИКАЦИИ. MOVFW BUHH 9 MOVWF SC5 MOVLW .32 /ПРИВЕДЕМ ЗНАЧЕНИЕ СЧЕТЧИКА АДРЕСА SUBWF COUE,1 /В ДИАПАЗОН МИНУТ. RETURN DIN л BCF FLAG,4 /СБРОСИМ ФЛАГ УСТАНОВКИ ЧАСОВ. BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РЕЖИМА НАЖАТА, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,1 /ВКЛЮЧИМ ФЛАГ УСТАНОВКИ ДНЕЙ. MOVLW .10 /ВО .2,3,5 РАЗРЯДЫ ЗАПИШЕМ "с". MOVWF SC2 9 MOVWF SC3 9 MOVWF SC5 MOVFW DAY1 /ЗНАЧЕНИЕ РЕГИСТРА ДНЕЙ MOVWF SC4 /ПЕРЕПИШЕМ В РЕГИСТР ИНДИКАЦИИ. RETURN 104
Программатор CORAT BCF FLAG, 4 ;СБРОСИМ ФЛАГ УСТАНОВКИ ЧАСОВ. BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РЕЖИМА НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. BSF FLAG2,1 /ВКЛЮЧИМ ФЛАГ УСТАНОВКИ КОРРЕКЦИИ. MOVLW . 10 ГВ 3,5 РАЗРЯДЫ ЗАПИШЕМ "с". MOVWF SC3 9 MOVWF SC5 MOVFW COR /ЗНАЧЕНИЕ РЕГИСТРА КОРРЕКЦИИ MOVWF SC2 /ПЕРЕПИШЕМ В РЕГИСТР ИНДИКАЦИИ. MOVFW CORNEG /ЗНАЧЕНИЕ РЕГИСТРА ЗНАКА КОРРЕКЦИИ MOVWF SC4 /ПЕРЕПИШЕМ В РЕГИСТР ИНДИКАЦИИ. RETURN INDSC CLRF SC2 /ВО ВСЕ РЕГИСТРЫ ИНДИКАЦИИ CLRF SC3 /ЗАПИШЕМ НУЛИ. CLRF SC4 9 CLRF SC5 9 RETURN HOB I BTFSC FLAG,6 /ЕСЛИ ИДЕТ УСТАНОВКА RETURN /ВОЗВРАЩАЕМСЯ. ' ' BTFSC PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ЗАПИСИ, GOTO нови /УСТАНОВИМ ФЛАГ ПОПЕРЕМЕННОГО РЕЖИМА. BTFSC PORTA,3 /ЕСЛИ ИДЕТ ВЫБОР РЕЖИМА, RETURN /ВОЗВРАЩАЕМСЯ. BTFSS FLAG1,4 /ЕСЛИ НЕ ВКЛЮЧЕН ПОПЕРЕМЕННЫЙ РЕЖИМ, RETURN /ВОЗВРАЩАЕМСЯ. BTFSS FLAG,2 /ЕСЛИ НЕ ВКЛЮЧЕН ФЛАГ УСТАНОВКИ, RETURN /ВОЗВРАЩАЕМСЯ. INCF COBA,0 /УВЕЛИЧИМ АДРЕС ПРОЗВЕНЕВШЕГО БУДИЛЬНИКА. MOVWF COUE BSF FLAG,6 /СИМУЛИРУЕМ УСТАНОВКУ БУДИЛЬНИКОВ. CALL BINHB /СЧИТАЕМ ЗНАЧЕНИЕ СЛЕДУЮЩЕГО БУДИЛЬНИКА. BCF FLAG,6 /СБРОСИМ СИМУЛЯЦИЮ. MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ БУДИЛЬНИКА ИЗ РЕГИСТРОВ MOVWF SB2 /ИНДИКАЦИИ В РЕГИСТРЫ ИНДИКАЦИИ БУДИЛЬНИКА. MOVFW SC3 / MOVWF SB3 9 MOVFW SC4 9 MOVWF SB4 9 MOVFW SC5 9 MOVWF SB5 INCF COBAHU,1 /УВЕЛИЧИМ СЧЕТЧИК СЕКУНД ПОПЕРЕМЕННОГО РЕЖИМА. BCF STATUS,0 MOVLW .11 /10 СЕКУНД ИНДИКАЦИЯ ЧАСОВ. SUBWF COBAHU,0 BTFSC STATUS,0 /ЕСЛИ БОЛЬШЕ, GOTO BUHOI /ИДЕМ НА ИНДИКАЦИЮ БУДИЛЬНИКА. GOTO HATU /ИЛИ НА ИНДИКАЦИЮ ЧАСОВ. BUHOI BCF STATUS,2 MOVLW .12 * /2 СЕКУНДЫ ИНДИКАЦИЯ БУДИЛЬНИКА. SUBWF COBAHU,0 BTFSC STATUS,2 /ЕСЛИ УЖЕ 2 СЕКУНДЫ, 105
Устройства с цифровой индикацией CLRF COBAHU /ОБНУЛИМ СЧЕТЧИК. CLRF SCO /СЕКУНДЫ В ПАМЯТЬ НЕ ЗАПИСЫВАЮТСЯ CLRF SCI ’ MOVFW SB2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ БУДИЛЬНИКА MOVWF SC2 /В РЕГИСТРЫ ИНДИКАЦИИ. MOVFW SB3 9 MOVWF SC3 9 MOVFW SB4 9 MOVWF SC4 9> MOVFW SB5 9 MOVWF SC5 BCF RETURN нови FLAG,2 /СБРОСИМ ФЛАГ УСТАНОВКИ. BSF FLAG1,4 /ВКЛЮЧИМ ПОПЕРЕМЕННЫЙ РЕЖИМ. BCF FLAG1,0 /СБРОСИМ РЕЖИМ ЧАСОВ. MOVLW .6 /ПЕРЕМЕСТИМ'ЗАПЯТУЮ ЗА ИНДИКАТОР. MOVWF CAT 9 RETURN 9 ; 14. ПРОВЕРКА ЗАПРЕТА БУДИЛЬНИКОВ ПО ДНЯМ.- U4851 BTFSC FLAG2,2 /ЕСЛИ ФЛАГ 6,7 ДНЯ УСТАНОВЛЕН GOTO BUR67 /ПРОВЕРИМ ЗНАЧЕНИЕ ДНЕЙ. BTFSC FLAG2,3 /ЕСЛИ ФЛАГ 7 ДНЯ УСТАНОВЛЕН, GOTO BUR7 /ПРОВЕРИМ ЗНАЧЕНИЕ ДНЕЙ. RETURN ; 15. ПП. ИНДИКАЦИИ С ВЫХОДОМ В ДВОИЧНО-ДЕСЯТИЧНОМ КОДЕ И ЗВОНКА БУДИЛЬНИКА. • ==ssszssszszs=s=ss:5ess:ss========ss=:==s==s=s=s=s=s==:==s=s==s==ss==s:==5==s=====:==s==s=s=s=sss=szs==s=szs=s=szs=s:s=:sscss ZIKL CLRF ANOD /ОБНУЛЯЕМ РЕГИСТР АНОДА. ZSO BSF INTCON,7 /РАЗРЕШАЕМ ПРЕРЫВАНИЯ. MOVFW SCO /ПЕРЕПИШЕМ ЗНАЧЕНИЕ НУЛЕВОГО РАЗРЯДА ИНДИКАЦИИ CALL INDZIKL /И ПОЙДЕМ НА ИНДИКАЦИЮ. CALL ATTU /ПРОИНДИЦИРУЕМ ЗНАЧЕНИЯ РЕЖИМОВ. ZS01 BTFSS INTCON,7 /ЖДЕМ ПРЕРЫВАНИЯ. GOTO ZS1 /ХОДИМ ПО КРУГУ. GOTO ZS01 /ПОСЛЕ ОТРАБОТКИ ПРЕРЫВАНИЯ ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ /РАЗРЯДУ. ZS1 BSF INTCON,7 /ВСЕ РАЗРЯДЫ ИНДИЦИРУЕМ АНАЛОГИЧНО НУЛЕВОМУ. MOVFW SCI 9 CALL INDZIKL CALL U4851 /ПРОВЕРИМ ЗАПРЕТ БУДИЛЬНИКОВ ПО ДНЯМ. ZS12 BTFSS INTCON,7 9 GOTO ZS2 GOTO ZS12 9 ZS2 BSF INTCON,7 9 MOVFW SC2 9 106
Программатор CALL CALL INDZIKL KYRANT ;ПРОВЕРИМ АВТОУСТАНОВКУ ПО СИГНАЛАМ В 00 ЧАСОВ ZS23 BTFSS INTCON,7 / GOTO ZS3 / GOTO ZS23 9 ZS3 BSF INTCON,7 9 MOVFW SC3 9 CALL INDZIKL CALL KEY /ПРОВЕРИМ КНОПКИ. ZS34 BTFSS INTCON,7 9 GOTO ZS4 9 GOTO ZS34 9 ZS4 BSF INTCON,7 9 MOVFW SC4 9 CALL INDZIKL CALL BUDC /ПРОВЕРИМ СОВПАДЕНИЕ УСТАНОВЛЕННЫХ БУДИЛЬНИКОВ ZS45 BTFSS INTCON,7 9 GOTO ZS5 9 , GOTO ZS45 9 ZS5 BSF INTCON,7 9 MOVFW SC5 9 CALL INDZIKL 9 ZS50 BTFSS INTCON,7 9 GOTO ZIKL 9 GOTO ZS50 9 INDZIKL MOVWF SEG /ЗАПИСЬ ЗНАЧЕНИЯ РАЗРЯДА ВО ВСПОМОГАТЕЛЬНЫЙ РЕГИСТР BCF STATUS,0 /СБРОСИМ ПРИЗНАК ПЕРЕНОСА. RLF SEG, 1 /СДВИГАЕМ ВЛЕВО, ВЫРАВНИВАЯ ВЫХОДНОЙ РЕГИСТР. MOVFW ANOD /ЗАГРУЖАЕМ НОМЕР АНОДА. SUBWF CAT, 0 /СРАВНИВАЕМ С ПОЛОЖЕНИЕМ ЗАПЯТОЙ. BTFSC STATUS,2 /ЕСЛИ СОВПАДАЮТ, BCF SEG, 5 /УСТАНОВИМ ЗАПЯТУЮ. BTFSS STATUS,2 BSF SEG, 5 /ИНАЧЕ СБРОСИМ ЗАПЯТУЮ. BTFSS PORTA,4 /ЕСЛИ КНОПКА БУДИЛЬНИКА ОТЖАТА, GOTO INDZVON /ПРОПУСКАЕМ УСТАНОВКУ ЗВОНКА. BTFSC FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 1, BSF SEG, 6 /ТО УСТАНОВИМ ПОТЕНЦИАЛ НА RB6 (EXE). BTFSS FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 0, INDZVON BCF SEG, 6 /СБРОСИМ РАЗРЯД ЗВОНКА. MOVFW SEG /ПЕРЕПИШЕМ СФОРМИРОВАННОЕ ЗНАЧЕНИЕ MOVWF PORTB /В ВЫХОДНОЙ РЕГИСТР ПОРТА TRISB. MOVFW ANOD * /ЗАГРУЖАЕМ НОМЕР АНОДА MOVWF PORTA /В ПОРТ А. . INCF ANOD,1 /4-1 В РЕГИСТР АНОДА. 107
Устройства с цифровой индикацией RETURN ; 16. УСТАНОВКА ПО СИГНАЛАМ ТОЧНОГО ВРЕМЕНИ В 00 ЧАСОВ. KYRANT BTFSC FLAG3,4 ;ЕСЛИ РАВЕНСТВО БЫЛО, GOTO ATOK /ИДЕМ НА ОЖИДАНИЕ СИГНАЛА. BTFSS FLAG3,2 /ЕСЛИ РАВЕНСТВА ЧАСОВ НЕ БЫЛО, GOTO KYRAH /ИДЕМ СРАВНИВАТЬ ЧАСЫ. BTFSS FLAG3,3 ;ЕСЛИ РАВЕНСТВА МИНУТ НЕ БЫЛО, GOTO KYRAM /ИДЕМ СРАВНИВАТЬ МИНУТЫ. BTFSS FLAG3,4 /ЕСЛИ РАВЕНСТВА ДЕСЯТКОВ СЕКУНД НЕ БЫЛО GOTO KYRASH /ИДЕМ СРАВНИВАТЬ СЕКУНДЫ. GOTO KYRASL /ИЛИ СЕКУНДЫ ПОСЛЕ ПОЛУНОЧИ. KYRAH MOVLW 023H /ЕСЛИ УЖЕ 23 ЧАСА, SUBWF BUH, 0 f BTFSC STATUS,2 BSF RETURN FLAG3,2 /УСТАНОВИМ ФЛАГ РАВЕНСТВА ЧАСОВ. KYRAM . MOVLW 059H /ЕСЛИ УЖЕ 59 МИНУТ, SUBWF BUM, 0 f , BTFSC STATUS,2 BSF RETURN FLAG3,3 /УСТАНОВИМ ФЛАГ РАВЕНСТВА МИНУТ. KYRASH MOVLW .5 /ЕСЛИ УЖЕ 50 СЕКУНД, SUBWF SECH,0 / BTFSC STATUS,2 BSF RETURN FLAG3,4 /УСТАНОВИМ.ФЛАГ РАВЕНСТВА СЕКУНД. KYRASL MOVLW .1 /ЕСЛИ НЕ БЫЛО ОБНУЛЕНИЯ ДО ПОЛНОЧИ, SUBWF SECH,0 /ЖДЕМ 10 СЕКУНД ПОСЛЕ ПОЛУНОЧИ. BTFSC STATUS,2 GOTO RETURN KYRAO ;И ИДЕМ НА СБРОС ФЛАГОВ. KYRAO BCF FLAG3,2 /ПОСЛЕ АВТООБНУЛЕНИЯ СБРОСИМ BCF FLAG3,3 /ВСЕ ФЛАГИ BCF FLAG3,4 MOVLW .6 ;И ПОСТАВИМ ЗАПЯТУЮ MOVWF RETURN CAT /В 6 РАЗРЯД. ; 17. СРАВНЕНИЕ : РЕГИСТРОВ БУДИЛЬНИКА И ЧАСОВ. BUDC BTFSC FLAG1,3 /ЗАПРЕТ СРАВНЕНИЯ ПО ДНЯМ? / RETURN /ДА. BTFSC FLAG2,5 /ЗАПРЕТ СРАВНЕНИЯ ПО СЕКУНДАМ? RETURN /ДА. BTFSC FLAG1,2 / СРАВНЕНИЕ ВЫПОЛНЕНО.? RETURN /ДА. BTFSC FLAG,6 /ИДЕТ УСТАНОВКА? 108
Программатор RETURN ;ДА. SWAPF HOUH,0 ;ЗАПИСЬ МЛАДШЕГО И ’СТАРШЕГО IORWF HOUL,0 /РЕГИСТРОВ ЧАСОВ MOVWF BUH /В ОДИН РЕГИСТР ЗАПИСИ ЧАСОВ. SWAPF MINH,0 /ЗАПИСЬ МЛАДШЕГО И СТАРШЕГО IORWF MINL,0 /РЕГИСТРОВ МИНУТ MOVWF BUM /В ОДИН РЕГИСТР ЗАПИСИ МИНУТ. CLRF COUE /СБРОС СЧЕТЧИКА АДРЕСА. BCF STATUS,2 /СБРОС БИТА НУЛЯ. MOVLW .0 /ЕСЛИ ЧАСЫ НЕ РАВНЫ НУЛЮ, SUBWF BUH, Q / BTFSS STATUS,2. 'GOTO AKTM /ИДЕМ ВЫБИРАТЬ С АДРЕСА ЧАСОВ. BCF STATUS,2 MOVLW .0 /ЕСЛИ МИНУТЫ НЕ РАВНЫ НУЛЮ, SUBWF BUM, 0 / BTFSS STATUS,2 / 4 GOTO AKTM /ИДЕМ ВЫБИРАТЬ С АДРЕСА МИНУТ. RETURN /НУЛЕВЫЕ ЗНАЧЕНИЯ НЕ СРАВНИВАЮТСЯ. BUDH BCF STATUS,2 MOVFW EEDATA /СРАВНИМ СЧИТАННОЕ ЗНАЧЕНИЕ ЧАСОВ SUBWF BUH, 0 /БУДИЛЬНИКА С ТЕКУЩИМ ВРЕМЕНЕМ. BTFSC STATUS,2 /ЕСЛИ ОНИ РАВНЫ, BSF FLAG,7 /УСТАНОВИМ ФЛАГ РАВЕНСТВА ЧАСОВ. BTFSS STATUS,2 BCF FLAG,3 /ИНАЧЕ СБРОСИМ ФЛАГ РАВЕНСТВА МИНУТ. MOVLW .32 /ПРИВЕДЕМ ЗНАЧЕНИЕ SUBWF COUE,1 /СЧЕТЧИКА АДРЕСА В ДИАПАЗОН МИНУТ. BTFSS FLAG,7 /ЕСЛИ ЧАСЫ НЕ СОВПАЛИ, GOTO BUDM1 /ПРОВЕРИМ ОСТАВШИЕСЯ ЗНАЧЕНИЯ МИНУТ. BSF FLAG1,2 /УСТАНОВИМ ФЛАГ РАВЕНСТВА БУДИЛЬНИКА И ЧАСОВ MOVFW COUE /ЗАФИКСИРУЕМ АДРЕС СОВПАВШЕГО БУДИЛЬНИКА MOVWF COBA /В СЧЕТЧИКЕ' ПОПЕРЕМЕННОГО РЕЖИМА. BCF FLAG,3 /СБРОСИМ ФЛАГИ РАВЕНСТВА МИНУТ BCF FLAG,7 /И ЧАСОВ. BTFSC FLAG1,6 /ЕСЛИ ВКЛЮЧЕН РЕЖИМ ЗВОНКА 1 МИНУТУ, BSF FLAG,0 /ВКЛЮЧИМ' ФЛАГ ЗВОНКА. BTFSC FLAG1,5 /ЕСЛИ ВКЛЮЧЕН НЕПРЕРЫВНЫЙ РЕЖИМ ЗВОНКА, GOTO RETURN BUDMZ /ПОЙДЕМ ВКЛЮЧАТЬ ЗВОНОК. BUDMZ BTFSS ZVONNEP, 0 /ЕСЛИ РЕГИСТР ЗВОНКА НЕЧЕТНЫЙ, BSF FLAG,0 /ВКЛЮЧИМ ЗВОНОК. BTFSC ZVONNEP,0 /ЕСЛИ РЕГИСТР ЗВОНКА ЧЕТНЫЙ, BCF RETURN FLAG,0 /ВЫКЛЮЧИМ ФЛАГ ЗВОНКА. BUDM MOVFW EEDATA /ВЫЧТЕМ СЧИТАННОЕ ЗНАЧЕНИЕ SUBWF BUM, 0 /ИЗ РЕГИСТРА МИНУТ. BTFSS STATUS,2 /ЕСЛИ НЕТ РАВЕНСТВА, BCF FLAG,3 /СБРОСИМ ФЛАГ РАВЕНСТВА МИНУТ. BTFSC STATUS,2 /ЕСЛИ РАВЕНСТВО, BSF FLAG,3 /УСТАНОВИМ ФЛАГ РАВЕНСТВА МИНУТ. BTFSC FLAG,3 /ЕСЛИ ФЛАГ РАВЕНСТВА МИНУТ УСТАНОВЛЕН, 109
Устройства с цифровой индикацией BUDM1 GOTO ВСЕ INCF MOVLW SUBWF BTFSC RETURN GOTO AKTH STATUS,0 COUE,1 .32 COUE,0 STATUS,0 AKTETE /ИДЕМ СРАВНИВАТЬ ЧАСЫ. /ЗНАЧЕНИЕ СЧЕТЧика адеЕСА ;МОЖЕТ БЫТЬ НЕ БОЛЕЕ 31. /ЕСЛИ УЖЕ 32, /ЗАКОНЧИМ СРАВНЕНИЕ МИНУТ.' /ИНАЧЕ ПРОДОЛЖИМ СРАВНЕНИЕ. ; 18. ВЫБОРКА ИЗ ПАМЯТИ. АКТН MOVLW ADDWF .32 COUE,1 ; НАЧИНАЕМ СРАВНЕНИЕ С 32 АДРЕСА. АКТМ GOTO AKTETE ; НА ВЫБОРКУ ЧАСОВ. • CLRF COUE НАЧИНАЕМ С НУЛЕВОГО АДРЕСА. АКТЕТЕ MOVFW COUE /УСТАНОВИМ АДРЕС И НАЧНЕМ MOVWF EEADR /СЧИТЫВАНИЕ. BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,RD /ЧТЕНИЕ. BCF STATUS,RPO /БАНК 0. MOVLW .255 /ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА, SUBWF EEDATA,0 /ЗАПИШЕМ -0. BTFSC STATUS,Z f CALL AKTEO BTFSC FLAG,6 /ЕСЛИ ИДЕТ УСТАНОВКА, СЧИТЫВАЕТСЯ RETURN /ЗНАЧЕНИЕ ПО ОДНОМУ АДРЕСУ. BTFSC FLAG,3 /ЕСЛИ РАВЕНСТВО МИНУТ БЫЛО, GOTO BUDH /ИДЕМ СРАВНИВАТЬ ЧАСЫ. BTFSS FLAG,3 /ЕСЛИ РАВЕНСТВА МИНУТ НЕ БЫЛО, GOTO BUDM /ПРОДОЛЖАЕМ СРАВНИВАТЬ МИНУТЫ. АКТЕО GOTO BUDH /ИНАЧЕ СРАВНИМ ЧАСЫ. CLRF RETURN EEDATA /ОБНУЛИМ, Т.К. 255 НЕ ВПИСЫВАЕТСЯ ; 19. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF MOVFW MOVWF MOVFW MOVWF W_TEMP STATUS STATUS_TEMP FSR FSR TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W /STATUS, ; FSR. r И RECONST CALL SI /ПРИБАВИМ1 1 В СЧЕТЧИК СЕКУНД. /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. ’ BCF INTCON,2 (РАЗРЕШАЕМ ПРЕРЫВАНИЯ). MOVFW STATUS_TEMP MOVWF STATUS MOVFW FSR_TEMP MOVWF FSR /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: /STATUS, /FSR, ТАЙМЕРА ПО
Программатор MOVFW RETURN W_TEMP ;w. /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 20. СЧЕТ Ч-М -с-д. SI • INCF SMC,1 /ДЕЛИТЕЛЬ НА 250. MOVFW SMC ADDLW -0FAH /250=0FAH. BZ SLFO t ' RETURN SLFO CLRF SMC /ОБНУЛИМ СЧЕТЧИК МИЛЛИСЕКУНД. BSF FLAG,2 /УСТАНОВИМ ФЛАГ УСТАНОВКИ. MOVLW .9 /ЕСЛИ УЖЕ 9 СЕКУНД, SUBWF SECL,0 BC SH /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД. INCF SECL,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. BTFSC FLAG2,0 /ЕСЛИ ЗВОНОК ПО 1 СЕК. КАЖДЫЙ ЧАС, GOTO SLF1 /ТО ИДЕМ УСТАНАВЛИВАТЬ ФЛАГИ. BTFSC FLAG1,7 /ЕСЛИ ЗВОНОК -5 СЕКУНД, GOTO SLF5 . /ИДЕМ ОТСЧИТЫВАТЬ. RETURN SLF1 BTFSC FLAG,0 /СБРОС ФЛАГА ЗВОНКА. BCF FLAG,0 /УСТАНОВКА ЗАПРЕТА СРАВНЕНИЯ БУДИЛЬНИКОВ RETURN SLF5 BTFSS FLAG1,2 /ЕСЛИ ЗВОНОК РАЗРЕШЕН, RETURN BSF FLAG,0 /УСТАНОВИМ ФЛАГ ЗВОНКА. INCF ZVONS,1 /ПРИБАВИМ ЕДИНИЦУ В СЧЕТЧИК ЗВОНКА. MOVLW .6 /ЕСЛИ УЖЕ 5 СЕКУНД, SUBWF ZVONS,0 BZ SLF50 RETURN ;ИДЕМ УСТАНАВЛИВАТЬ ФЛАГИ. CLRF ZVONS /ОБНУЛИМ СЧЕТЧИК ЗВОНКА. BCF FLAG,0 /СБРОС ФЛАГА ЗВОНКА. BCF FLAG1,2 /СБРОС ФЛАГА РАВЕНСТВА ЧАСОВ. BSF FLAG2,5 /УСТАНОВКА ЗАПРЕТА СРАВНЕНИЯ БУДИЛЬНИКОВ RETURN SH CLRF SECL /ОБНУЛИМ СЕКУНДЫ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW SECH /ЕСЛИ ДЕСЯТКИ СЕКУНД ADDLW -5H /РАВНЫ 5, BZ ML /ИДЕМ СРАВНИВАТЬ МИНУТЫ. INCF SECH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД. RETURN ML CLRF SECH /ОБНУЛИМ ДЕСЯТКИ СЕКУНД. MLU BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW MINL /ЕСЛИ ЕДИНИЦЫ МИНУТ 111
Устройства с цифровой индикацией ADDLW -9H ;РАВНЫ 9, BZ MH /ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ. INCF MINL,1 ;ИНАЧЕ УВЕЛИЧИМ МИНУТЫ. BTFSC FLAG1,7 Г BCF FLAG2,5 BTFSC FLAG1,6 /ЕСЛИ УСТАНОВЛЕН ФЛАГ 1 МИНУТЫ, GOTO MHF /ИДЕМ УСТАНАВЛИВАТЬ ФЛАГИ. BTFSC FLAG1,5 /ЕСЛИ УСТАНОВЛЕН ФЛАГ НЕПРЕРЫВНОГО ЗВОНКА, CALL BUNZ /ИДЕМ ВКЛЮЧАТЬ СЧЕТЧИК. BCF FLAG1,2 /СБРОСИМ ФЛАГ РАЗРЕШЕНИЯ ЗВОНКА ДЛЯ 1 МИНУТЫ RETURN MHF BTFSS FLAG1,2 ;ЕСЛИ ЗВОНОК РАЗРЕШЕН, RETURN BCF FLAG,0 /ВЫКЛЮЧИМ ЗВОНОК BCF FLAG1,2 /И ФЛАГ РАЗРЕШЕНИЯ RETURN BUNZ BTFSS FLAG1,2 /ЕСЛИ ЗВОНОК РАЗРЕШЕН, RETURN INCF ZVONNEP, 1 /УВЕЛИЧИМ ЗНАЧЕНИЕ СЧЕТЧИКА НЕПРЕРЫВНОГО РЕЖИМА BTFSC ZVONNEP,0 /ЕСЛИ ЗНАЧЕНИЕ НЕЧЕТНОЕ, BSF FLAG,0 /ВКЛЮЧИМ звонок. BTFSS ZVONNEP,0 /ЕСЛИ ЗНАЧЕНИЕ ЧЕТНОЕ, BCF FLAG,0 /ВЫКЛЮЧИМ ЗВОНОК. RETURN MH CLRF MINL /ОБНУЛИМ ЕДИНИЦЫ МИНУТ. BTFSC FLAG1,6 /ЕСЛИ ВКЛЮЧЕН РЕЖИМ ЗВОНКА 1 МИНУТА, CALL MHF /ИДЕМ СБРАСЫВАТЬ ФЛАГИ. BTFSC FLAG1,5 /ЕСЛИ ВКЛЮЧЕН НЕПРЕРЫВНЫЙ РЕЖИМ ЗВОНКА CALL BUNZ /ПРОВЕРИМ СЧЕТЧИК НЕПРЕРЫВНОГО РЕЖИМА. BCF FLAG1,2 /СБРОСИМ ЗАПРЕТ ЗВОНКА. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW MINH /ЕСЛИ ДЕСЯТКИ МИНУТ ADDLW -5H /РАВНЫ 5, BZ HL /ИДЕМ СРАВНИВАТЬ ЧАСЫ. INCF MINH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ. RETURN HL CLRF MINH /ОБНУЛИМ ДЕСЯТКИ МИНУТ. HLU BCF MOVFW ADDLW BZ MOVFW STATUS,2 HOUH -2H HL4 HOUL /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. /ЕСЛИ ДЕСЯТКИ ЧАСОВ /РАВНЫ 2, /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. /ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9, ADDLW BZ INCF BTFSC -9H HH HOUL,1 FLAG2,0 /УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ. /ИНАЧЕ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ. /ЕСЛИ ВКЛЮЧЕН РЕЖИМ ЗВОНКА 1 СЕК. (БОЙ) BSF FLAG,0 RETURN /ВКЛЮЧИМ ЗВОНОК. 112
Программатор HL4 BCF STATUS,2 ;СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW HOUL /ЕСЛИ ЕДИНИЦЫ ЧАСОВ . ADDLW -3H /РАВНЫ 3, BZ HH /ИДЕМ ОБНУЛЯТЬ. INCF HOUL,1 /ИЛИ ПРИБАВИМ ЕДИНИЦУ. BTFSC FLAG2,0 ‘ /ЕСЛИ ВКЛЮЧЕН РЕЖИМ ЗВОНКА 1 СЕК. (БОЙ) BSF FLAG,0 /ВКЛЮЧИМ ЗВОНОК. RETURN НН CLRF HOUL /ОБНУЛИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG2,0 /ЕСЛИ ВКЛЮЧЕН РЕЖИМ ЗВОНКА 1 СЕК. (БОЙ) BSF FLAG,0 /ВКЛЮЧИМ ЗВОНОК. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW HOUH - /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -2H , /РАВНЫ ДВУМ, BZ DL /ИДЕМ УВЕЛИЧИВАТЬ ДНИ. INCF HOUH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ. RETURN DL CLRF HOUH /ОБНУЛИМ ДЕСЯТКИ ЧАСОВ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW DAY1 /НЕ БОЛЕЕ 7 ДНЯ. ADDLW -7H /ЕСЛИ РАВНО, BZ DAY /ИДЕМ УСТАНАВЛИВАТЬ В 1, ЕСЛИ НЕТ - ПРОПУСКАЕМ INCF DAY1,1 /ПРИБАВИМ ЕДИНИЦУ К ДНЯМ. RETURN DAY MOVLW 01H /УСТАНОВКА В' 1 MOVWF DAY1 /ДНЕЙ НЕДЕЛИ (0- ДНЯ НЕТ). BSF FLAG,1 /УСТАНОВКА БИТА ОТСЧЕТА 5 СЕК. ДЛЯ КОРРЕКЦИИ RETURN ; 21. ВВЕДЕНИЕ КОРРЕКЦИИ CO ЗНАКОМ. CORN BTFSS GOTO MOVFW CORNEG,0 CORN1 COR /ПРОПУСТИТЬ, ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ (=1) /ИНАЧЕ ИДЕМ УВЕЛИЧИВАТЬ ЗНАЧЕНИЕ СЕКУНД. /ЗАГРУЖАЕМ УСТАНОВОЧНЫЙ РЕГИСТР КОРРЕКЦИИ MOVWF NEGCOR /ПЕРЕПИСЫВАЕМ ВО ВРЕМЕННЫЙ РЕГИСТР. NEGF NEGCOR,0 /ИЗМЕНИМ ЗНАК ЧИСЛА И ПРИБАВИМ ADDWF SECL,1 /К СЕКУНДАМ. VXVM 1 BCF RETURN FLAG,1 /СБРОСИМ ФЛАГ 5 СЕКУНД. MOVFW COR /ПРИБАВИМ ПОЛОЖИТЕЛЬНУЮ КОРРЕКЦИЮ ADDWF SECL,1 /К СЕКУНДАМ. BCF RETURN FLAG,1 ft /СБРОСИМ ФЛАГ 5 СЕКУНД. END 113
Устройства с цифровой индикацией Универсальный таймер Трудно перечислить все применения таймеров в быту. Это и кухонный тай- мер, и таймер включения вентилятора, приема лекарств, включения освещения или электронных приборов... Автор стремился реализовать в предлагаемом тай- мере все возможные случай применения с широким диапазоном выдержки времени от единиц секунд до 13 суток и 3 часов. Таймер имеет возможность непрерывного и единичного (повторного) режима работы, запись в память од- ной установки и выключение индикации для уменьшения энергопотребления. Таймер запрограммирован на микроконтроллере PIC16F84A и имеет три разряда индикации на светодиодах АЛ304Г с общим анодом. Алгоритм про- граммы показан на рис. 25. После пуска и начальной установки регистров включаются таймер с предде- лителем, имеющими такой коэффициент деления, что таймер переполняется каждую секунду. По переполнению таймера происходит прерывание. Во время прерывания происходит опрос состояния кнопок и флагов. В первую секунду по нажатой кнопке устанавливается соответствующий флаг. В следующую секунду по установленному флагу выполняется необходимая установка. Установка значе- ний производится в регистры установки, поэтому после каждой установки про- исходит перезапись в регистры индикации. Запись в необходимые регистры ин- дикации осуществляется в зависимости от положения запятой. Если запятая в нулевом разряде, то счет происходит в секундах; если — в первом разряде, то счет в минутах, и, наконец, если запятая во втором разряде, то счет в часах. Вер- нее сказать, не счет, а установка и индикация. Дискретность счета постоянна и равна одной секунде. Каждое действие установки заканчивается восстановлени- ем значений регистров после прерывания. По завершении прерывания процес- сор выполняет основную работу по организации динамической индикации. Если установка не происходит и флаг установки равен нулю, то включается счетчик паузы. Каждую секунду значение восьмиразрядного регистра счетчика увеличивается на единицу. Таким образом, регистр паузы переполнится (уста- новится в ноль) через 256 секунд (4 мин 16 сек) и включит флаг паузы. После завершения прерывания в подпрограмме индикации индикация выключится. После нажатия кнопки «Стоп» все флаги сбросятся и индикация снова вклю- чится. Поскольку во время паузы значения регистров не изменяются, то после включения индикации на табло высветятся те же значения, что были до вы- ключения индикации. Из режима паузы можно выйти и нажатием кнопки «Пуск». В этом случае таймер сразу начнет счет по ранее установленному зна- чению, сохраненному в регистрах установки. Так осуществляется повторный режим по заранее установленному значению. Если устанавливается непрерывный режим работы, то необходима запись установленного значения в энергонезависимую память. В память записывается как установленное значение, так и местоположение запятой. Выборка из памяти в непрерывном режиме происходит автоматически после завершения каждого цикла счета. Выборку из памяти можно также произвести и в ручном режиме. На рис. 26 приведена принципиальная схема таймера. Входы RBO—RB7 ис- пользуются как выходы значений сегментов светодиодов. Во время прерывания входы RB4—RB7 нагружаются кнопками SA2—SA5: «Плюс», «Минус», «Пуск», 114
Универсальный таймер Рис. 25. Алгоритм программы универсальный таймер 115
Устройства с цифровой индикацией Рис. 26. Универсальный таймер «Стоп». Кнопка SA1 (ЗПТ) подключена к постоянному входу RA3. Выводы RAO—RA3 используются как выходы анодов светодиодов. Вывод RA4 на схеме нагружен звуковым излучателем НСМ120бх со встроенным генератором часто- той 2 кГц. Этот вывод включает нагрузку нулевым потенциалом и может быть использован для подключения мощной нагрузки обычными способами, т. е. при помощи реле, оптопары или симметричного тиристора. В непрерывном режиме работы на этом выводе потенциал будет изменяться с каждым циклом, поэтому включать нагрузку можно как высоким уровнем, так и низким. Питание таймера осуществляется тремя элементами типа АА (пальчиковые). Потребляемый ток при всех включенных сегментах равен 15 мА. Малый по- требляемый ток в режиме «Пауза», равный 0,1 мА, позволяет обойтись без вы- ключателя питания. Если таймер будет использоваться для коммутации силь- ноточной нагрузки, то напряжение источника питания не должно превышать 6 В. Необходимо заметить, что гасящие резисторы Rl—R8 подобраны для мак- симальной яркости и, в зависимости от условий эксплуатации, могут быть уве- личены до 560 Ом, что немного уменьшит потребляемый ток таймера с вклю- ченной индикацией. Если схема будет запитываться от блока питания, то воз- можна установка светодиодов с большими размерами цифр, например АЛЗЗЗГ. В этом случае значение гасящих резисторов Rl—R8 должно быть равно 200 Ом (общая нагрузка на порт: не более 50 мА). Кварцевый резонатор ZQ1 на часто- ту 32768 Гц цилиндрический, часовой. Применяемые кнопки: миниатюрные импортные мембранного типа. Назначение кнопок и работа с таймером SA1 (ЗПТ) — для переключения запятой по разрядам индикатора; SA2 (Плюс) — для прибавления единицы в выбранный разряд установки; SA3 (Минус) — для вычитания единицы из выбранного разряда установки; 116
Универсальный таймер SA4 (Пуск) — включение индикации и таймера; SA5 (Стоп) — для включения индикации и остановки таймера. Одновременное нажатие кнопок: «Стоп» + «Плюс» вызывает запись в энергонезависимую память индицируе- мого значения; «Стоп» + «Минус» Вызывает считывание из памяти; «Стоп» + «ЗПТ» включает непрерывный режим. Индикация непрерывного режима осуществляется чередованием включения всех запятых и запятой в выбранном разряде. Работу с таймером необходимо начинать с выбора разряда установки при помощи кнопки «ЗПТ». В выбранном разряде устанавливается необходимое значение кнопками «Плюс» или «Минус». Изменение на единицу значения в выбранном разряде будет происходить через одну секунду. Далее необходимо установить запятую на разряд в зависимости от времени счета. Если предпола- гается непрерывный режим работы, то необходимо записать значение индика- тора в память одновременным нажатием кнопок «Стоп» и «Плюс». Затем включается непрерывный режим («Стоп» + «ЗПТ»). Кнопка «Пуск» может быть нажата в любое время, даже после включения режима «Пауза». Установ- ленные ранее значения сохранятся и будут отработаны таймером. Выход из ре- жима непрерывной работы осуществляется кнопкой «Стоп», при этом сбрасы- вается индикация непрерывного режима. Работа таймера в одноразовом (повторном) режимах исключает запись в па- мять, так как для этого режима значения выбираются из регистров установки. Однако одноразовый режим может быть включен и после считывания значения из памяти. После отработки таймером времени в одноразовом режиме включа- ется звуковой излучатель. Выключение зуммера происходит при нажатии кноп- ки «Стоп». Нажатием кнопки «Стоп» можно остановить работу таймера в лю- бой момент. При повторном нажатии кнопки «Пуск» таймер начнет работу со значений, записанных в,установочных регистрах. Счет таймера производится в вычитающем режиме, но в часовом формате. Например, установленное значение 560, в секундах будет соответствовать 5 ми- нутам и 60 секундам, т. е. фактически — 6 минутам. Максимально возможные значения установки таймера: Запятая в нулевом разряде — 999, = 9 мин 99 сек =10 мин 39 сек. Запятая в первом разряде — 99,9 = 9 час 99 мин = 10 час 39 мин. Запятая во втором разряде — 9,99 = 9 дней 99 часов =13 дней 3 часа. Выключение индикации происходит не только во время простоя таймера, но и во время работы длительностью более 10 минут. Вернее, при изменении состояния регистра счетчика десятков минут. То есть при работе со счетом в секундах (запятая в нулевом разряде) индикация выключаться не будет, потому что нет изменения регистра десятков минут. Установлен только регистр единиц минут. При установке значения, например, 01,1 (11 минут) индикация выклю- чится через одну минуту. Выключение индикации выполнено для экономии энергии элементов, поскольку в этом режиме потребляемый ток такой же, как и в режиме «Паузы». Включение индикации без нарушения работы таймера осуществляется кнопкой «Пуск». 117
Устройства с цифровой индикацией То, что таймер начал работу, например, в режиме часового счета после на- жатия кнопки «Пуск», будет свидетельствовать уменьшение на единицу значе- ния нулевого разряда. Это произойдет потому, что все предыдущие разряды равны нулю. На рис. 27 и 28 изображены печатная плата и расположение элементов тай- мера. На рис. 29 показана печатная плата для светодиодов АЛ304Г со стороны их установки. Пунктирными линиями обозначены проводники, идущие с об- ратной стороны. Рис. 27. Универсальный таймер. Печатная плата Рис. 28. Универсальный таймер. Расположение элементов на печатной плате Рис. 29. Универсальный таймер. 3-х разрядный индикатор на АЛ304Г. Сторона установки светодиодов ; УНИВЕРСАЛЬНЫЙ ТАЙМЕР. ; 3 РАЗРЯДА ИНДИКАЦИИ НА АЛ304Г. ; УСТАНОВКА ПЛЮС, МИНУС ДО 999. ; В ЧАСАХ 9.99, МИНУТАХ 99.9, СЕКУНДАХ 999. ; ВКЛЮЧЕНИЕ НЕПРЕРЫВНОГО РЕЖИМА. ; СЧЕТ В ЧАСОВОМ ФОРМАТЕ. ; ЗАПИСЬ В ПАМЯТЬ НАБРАННОГО ЗНАЧЕНИЯ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. 118
Универсальный таймер ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ ОБЛАСТИ. / saes@mail.ru ; ПРОГРАММА = KUXTIM.ASM ; ДАТА ИЗМЕНЕНИЯ: 10-11-02 (ВЕРСИЯ: 10.11.02). / АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC _______________CONFIG 3FF0H • =ss===ssss==ss=ssssss=s:===s:ss===ss=====s:==s:======= ========== ; ИСПОЛЬЗУЕТСЯ ЧАСОВОЙ КВАРЦ ЧАСТОТОЙ 32768 ГЦ. ; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 32, ЧТО ВМЕСТЕ ; С TMR0 (256) И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ, ; ДАЕТ НА ВЫХОДЕ ТАЙМЕРА 1 СЕКУНДУ (4x32x256=32768). ; РЕГИСТРЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ. INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TMR0 EQU 01H ;ТАЙМЕР. OPTIQNR EQU 81H ;(RP0=l) УПРАВЛЕНИЯ И КОНФИГУРАЦИИ PCL EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ.' FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA . EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. EEDATA EQU 08H /ДАННЫХ ПЗУ. EECON1 EQU 88H /РЕГИСТР ЧТЕНИЯ-ЗАПИСИ ПЗУ. EEADR EQU 09H /АДРЕСА ПЗУ.' EECON2 EQU 89H /РЕГИСТР ЧТЕНИЯ-ЗАПИСИ ПЗУ. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. SECO EQU 0CH /МЛАДШИЙ РАЗРЯД СЧЕТЧИКА SEC1 EQU 0DH /СРЕДНИЙ РАЗРЯД. SEC2 EQU 0EH /СТАРШИЙ РАЗРЯД. CAT EQU 0FH /УСТАНОВКА ЗАПЯТОЙ. / ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ ФЛАГОВ. FLAG EQU 02ОН ; ФЛАГИ УСТАНОВОК: ; 0-> ПУСК. ; 1-> УСТАНОВКА ПЛЮС. ; 2-> УСТАНОВКА МИНУС. ; 3-> ЗАПИСЬ В ПАМЯТЬ. ; 4-> ; 5-> РЕЖИМ: ОДНОРАЗОВЫЙ - НЕПРЕРЫВНЫЙ. ; 6-> ВКЛЮЧЕНИЯ СПЯЩЕГО РЕЖИМА. 119
Устройствас цифровой индикацией ; 7 -> СЧИТЫВАНИЯ. FLA ; ФЛАГИ ; 0 ; 1 ; 2 ; 3 EQU 021H РЕЗУЛЬТАТА РАБОТЫ: - > ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. - > ЗАПЯТАЯ. - > ЗВОНОК. - > ИНДИКАЦИИ ВСЕХ ЗАПЯТЫХ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. SECL SECH MINL MINH HOUL HOUH DEYL ANOD SEGD EQU 010Н ; EQU 011Н , EQU 012H , EQU 013H , EQU 014H , EQU 015H EQU 016H , EQU 017H EQU 018H ;ЕДИНИЦЫ СЕКУНД ИНДИКАЦИИ. ;ДЕСЯТКИ СЕКУНД ИНДИКАЦИИ. /ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. /ДЕСЯТКИ МИНУТ ИНДИКАЦИИ. /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ. /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ. /ЕДИНИЦЫ ДНЕЙ ИНДИКАЦИИ. /АНОД. , • /СЕГМЕНТЫ. ; РЕГИСТРЫ: ВРЕМЕННЫЕ, УСТАНОВКИ. PAUSA EQU 01 ЭН PAUSI EQU 01AH COU EQU 01BH ABC EQU 01CH W_TEMP EQU 01DH STATUS_TEMP EQU 01EH FSR_TEMP EQU 01FH SEC EQU 022H COUI EQU 023H /ВРЕМЯ ДО ВХОЖДЕНИЯ В СПЯЩИЙ РЕЖИМ. ;ВРЕМЯ ДО ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. ;СЧЕТЧИК ЦИКЛОВ СЧЕТА. ;ВРЕМЕННЫЙ РЕГИСТР ЗАПИСИ. ;БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ЙРИ ПРЕРЫВАНИИ. /ВРЕМЕННЫЙ ДЛЯ FSR. /ВРЕМЕННЫЙ ДЛЯ ЗАПИСИ. /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. - / 1. ПУСК. f ORG 0 GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF BCF CLRF STATUS,RPO B'OOOOOIOO' OPTION_REGA80H B'lOlOOOOO' INTCON B'OOOOIOOO' TRISAA80H B'00000000' TRISBA80H STATUS,RPO FLAG /ПЕРЕХОДИМ В БАНК 1. /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100, /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВКЛЮЧЕНЫ. /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = TMR0.. / RA0-RA2, RA4 - НА ВЫХОД, RA3 - ВХОД. /RBO- RB7-ВЫХОД /ПЕРЕХОДИМ В БАНК 0. /СБРАСЫВАЕМ ВСЕ ФЛАГИ - 120
Универсальный таймер CLRF CLRF FLA TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SECO CLRF SEC1 CLRF SEC2 CLRF SECL CLRF SECH CLRF MINL CLRF MINH CLRF HOUL CLRF HOUH CLRF DEYL CLRF PAUSA * CLRF PAUS I CLRF COU CLRF COUI CLRF ABC MOVLW .1 ;УСТАНАВЛИВАЕМ MOVWF CAT /РАЗРЯД ЗАПЯТОЙ. G^TO INDZIKLO t ; 3. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. KEY KEY BTFSS PORTB,7 /.ЕСЛИ ПУСК ВКЛЮЧЕН (ВКЛЮЧАЕТСЯ НУЛЕМ) GOTO KEY3 /ИДЕМ ВКЛЮЧАТЬ ФЛАГ ПУСКА. BTFSS PORTB,6 /ОПРЕДЕЛИМ УСТАНОВКУ ФЛАГОВ BSF FLAG,1 /ПЛЮСА BTFSS PORTB,5 /И BSF FLAG,2 /МИНУСА. TSTF FLAG /ЕСЛИ НИЧЕГО НЕ НАЖАТО, BZ KEY 2 /ТО ИДЕМ СЧИТАТЬ ВРЕМЯ ДО ПАУЗЫ. CLRF PAUSA /СБРОСИМ РЕГИСТР ПАУЗЫ. GOTO RECONST Г KEY2 BCF STATUS,2 INCF PAUSA,1 /ПРИБАВЛЯЕМ 256 РАЗ В СЕКУНДАХ BTFSC STATUS,2 /ЕСЛИ УЖЕ НОЛЬ, BSF FLA, 0 /УСТАНОВИМ ФЛАГ ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. GOTO RECONST /ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. KEY3 BSF FLAG,0 GOTO IND ; 4. ВЫБОР РАЗРЯДА УСТАНОВКИ CATI TSTF CAT / BZ САТО BCF STATUS,, 0 RLF CAT, 1 BTFSS CAT,3 GOTO RECONST УСТАНОВИМ ФЛАГ ПУСКА. И СДЕЛАЕМ ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. ЕСЛИ ИЗ ПАМЯТИ СЧИТАН НОЛЬ, ИДЕМ УСТАНАВЛИВАТЬ. ОБНУЛИМ РАЗРЯД, ЧТОБЫ ПРИ СДВИГЕ ЗАПИСАТЬ 0. СДВИНЕМ ВЛЕВО НА 1 РАЗРЯД ЗАПЯТУЮ. ЕСЛИ ЕЩЕ НЕ 3 РАЗРЯД, 121
Устройства с цифровой индикацией CLRF CAT ;ИНАЧЕ УСТАНАВЛИВАЕМ BSF CAT, 0 /НУЛЕВОЙ РАЗРЯД. GOTO IND /ОБНОВИМ ИНДИКАЦИЮ. САТО BSF CAT, 0 /УСТАНАВЛИВАЕМ НУЛЕВОЙ РАЗРЯД GOTO RECONST / ; 5. ТАБЛИЦА ЗНАЧЕНИЙ СЕГМЕНТОВ. SEGDATA ;7, 6, 5, 4, 3, 2, 1, 0 ADDWF PCL, F ;H, G, F, E, D, C, B, A АНОД КАТОД RETLW B'llOOOOOO' ; о В'ОШШ' RETLW B'11111001' / 1 B'0000110' RETLW B'10100100' / 2 B'1011011' RETLW B'10110000' / 3 B'1001111' RETLW B'10011001' ; 4 B'1100110' RETLW B'10010010' / 5 B'1101101' RETLW B'10000010' / 6 B'1111101' RETLW B'11111000 ' / 7 B'OOOQlll' RETLW B'10000000' / 8 B' 1111111 ' RETLW B'10010000' ; 9 B'1101111' ; б. ИНДИКАЦИЯ. INDZIKLO BSF INTCON,7 /ЧТОБЫ HE ПРОПУСТИТЬ ПРЕРЫВАНИЕ. BTFSC FLA, 0 /ЕСЛИ ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ ВКЛЮЧЕН, GOTO MRAK /ПОЙДЕМ ГАСИТЬ ИНДИКАЦИЮ. CLRF ANOD ' /ОБНУЛЯЕМ АНОД, ЧТОБЫ ОЧИСТИТЬ СТАРШИЕ РАЗРЯДЫ BSF ANOD,0 /УСТАНОВИМ МЛ. РАЗРЯД АНОДА. BTFSS FLAG,0 /ЕСЛИ ПУСК НЕ ВКЛЮЧЕН, GOTO ZIKLS /ИНДИКАЦИЯ В СЕКУНДАХ. BTFSC CAT, 1 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ РАЗРЯДЕ, GOTO ZIKLM ./ИНДИКАЦИЯ В МИНУТАХ. BTFSC CAT, 2 /ЕСЛИ ЗАПЯТАЯ ВО ВТОРОМ РАЗРЯДЕ, GOTO ZIKLH /ИНДИКАЦИЯ В ЧАСАХ. ZIKLS MOVLW 010H /ЗАПИСЬ НОМЕРА РЕГИСТРА МЛ. РАЗРЯДА СЕКУНД MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. GOTO ZIKLC 7 ZIKLM MQVLW 012H /ЗАПИСЬ МЛ. РАЗРЯДА МИНУТ MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. GOTO ZIKLC / ZIKLH MOVLW 014H /ЗАПИСЬ МЛ. РАЗРЯДА ЧАСОВ. MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. ZIKLC BTFSS FLAG,5 /ЕСЛИ ВКЛЮЧЕН НЕПРЕРЫВНЫЙ РЕЖИМ GOTO ZIKLA INCF COUI,1 ,-+1 СЧИТАЕМ ЦИКЛЫ ИНДИКАЦИИ. MOVLW . 150 /150 ЦИКЛОВ ГОРЯТ ВСЕ ЗАПЯТЫЕ, SUBWF COUI,0 /ИНДИЦИРУЯ НЕПРЕРЫВНЫЙ РЕЖИМ. 122
Универсальный таймер BZ COUZ BTFSS FLA, 3 /ЕСЛИ ФЛАГ ЦИКЛОВ РАВЕН 0, GOTO GOTO ZIKLA /ЗАПЯТАЯ СВЕТИТСЯ. ZIKLF . /ИНАЧЕ СВЕТЯТСЯ ВСЕ ЗАПЯТЫЕ. couzo BCF FLA,3 /СБРАСЫВАЕМ ФЛАГ ЦИКЛОВ. ZIKLA MOVFW ANOD /СРАВНИМ РАЗРЯД АНОДА SUBWF CAT, 0 /С РАЗРЯДОМ ЗАПЯТОЙ. BTFSC STATUS,2 /ЕСЛИ ОНИ СОВПАДАЮТ, BSF FLA,1 . /УСТАНОВИМ ФЛАГ ЗАПЯТОЙ. GOTO ZIKLF /ВЫСВЕТИМ. COUZ CLRF COUI /ОБНУЛИЛИ СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. BTFSC FLA, 3 /ПРОПУСТИТЬ, ЕСЛИ 0. GOTO COUZO /ИНАЧЕ ИДЕМ СБРАСЫВАТЬ ФЛАГ И СВЕТИТЬ ЗАПЯТУЮ BSF FLA, 3 /УСТАНОВКА ФЛАГА ЦИКЛОВ. ZIKLF BTFSC FLA, 2 /ЕСЛИ ВКЛЮЧЕН ЗВОНОК, BCF ANOD,4 /УСТАНОВИМ В НОЛЬ РАЗРЯД ЗВОНКА (О-ВКЛЮЧЕНО). BTFSS FLA, 2 /ЕСЛИ ЗВОНОК ВЫКЛЮЧЕН, BSF ANOD,4 /УСТАНОВИМ В ЕДИНИЦУ РАЗРЯД ЗВОНКА. MOVFW SEGD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТ В. BTFSC FLA, 1 /ЕСЛИ ФЛАГ ЗАПЯТОЙ ВКЛЮЧЕН, BCF PORTB,7 /ТО ВЫСВЕТИМ ЗАПЯТУЮ. BTFSC FLA, 3 /ЕСЛИ ФЛАГ ЦИКЛОВ =1, BCF PORTB,7 /ТО ВЫСВЕТИМ ЗАПЯТУЮ. MOVFW ANOD /ЗАГРУЖАЕМ ЗНАЧЕНИЕ АНОДА. MOVWF PORTA /В ПОРТ А.. BCF FLA, 1 /СБРОСИМ ФЛАГ ЗАПЯТОЙ. BCF ANOD,4 . /СБРОСИМ РАЗРЯД ЗВОНКА, ЧТОБЫ НЕ МЕШАЛ СРАВНЕНИЮ. BCF STATUS,0 /ОБНУЛИМ, ЧТОБЫ НЕ ЗАПИСАТЬ В МЛ. РАЗРЯД. RLF ANOD,1 /СДВИГ 1 АНОДА НА 1 РАЗРЯД ВЛЕВО. BTFSC ANOD,3 /ЕСЛИ УЖЕ ДОШЛИ ДО 3 РАЗРЯДА, GOTO INDZIKLO /ИДЕМ ОБНУЛЯТЬ. INCF SEGD,F /+1 В РЕГИСТР АДРЕСА РАЗРЯДА. GOTO ZIKLC /И ИДЕМ. MRAK MOVLW OFFH /ПОГАСИМ СЕГМЕНТЫ. MOVWF PORTB BTFSS FLA, 0 /ЕСЛИ ИНДИКАЦИЯ ВКЛЮЧЕНА, GOTO INDZIKLO /ПОЙДЕМ СВЕТИТЬ. BTFSC FLA, 2 /ЕСЛИ ВКЛЮЧИЛСЯ ЗВОНОК, GOTO MRAKI /ИДЕМ ВКЛЮЧАТЬ ИНДИКАЦИЮ. BSF INTCON,7 /УСТАНАВЛИВАЕМ БИТ РАЗРЕШЕНИЯ ПРЕРЫВАНИЯ. GOTO MRAK „ ;ЗАЦИКЛИМСЯ. MRAKI BCF FLA, 0 /ВКЛЮЧИМ ИНДИКАЦИЮ. GOTO INDZIKLO /НА ИНДИКАЦИЮ. 123
Устройства с цифровой индикацией ; 7. ВЫБОРКА ИЗ ПАМЯТИ. АКТ BCF FLAG,7 ;СБРОСИМ ФЛАГ СЧИТЫВАНИЯ. CLRF EEADR /НУЛЕВОЙ АДРЕС. CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF SECO /ЗАПИСЬ В РЕГИСТР . . INCF EEADR,1 /1 АДРЕС. CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF SEC1 /ЗАПИСЬ В РЕГИСТР . INCF EEADR,1 /2 АДРЕС. CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. MOVWF SEC2 /ЗАПИСЬ В РЕГИСТР . INCF EEADR,1 /3 АДРЕС. CALL AKTETE /ВЫБОРКА ИЗ ПАМЯТИ. - MOVWF CAT /ЗАПИСЬ В РЕГИСТР . CLRF EEADR /НУЛЕВОЙ АДРЕС. . ' GOTO IND /ОБНОВИМ ИНДИКАЦИЮ. AKTETE BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,RD /ЧТЕНИЕ. BCF STATUS,RPO /БАНК 0. MOVLW .255 /ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА, SUBWF EEDATA,0 /ЗАПИШЕМ -0. BTFSC STATUS,Z Г CALL ’ AKTEO MOVFW EEDATA /ПЕРЕПИШЕМ ДАННЫЕ. RETURN АКТЕО CLRF EEDATA / RETURN ; 8. ЗАПИСЬ В ПАМЯТЬ. ZAPISO CLRF EEADR /ОБНУЛИМ АДРЕС. MOVLW OCH /АДРЕС ПЕРВОЙ ЗАПИСИ В ЕЕDATA. MOVWF ABC /ВО ВРЕМЕННЫЙ РЕГИСТР. ZAPISE MOVFW ABC /ПО КОСВЕННОЙ АДРЕСАЦИИ MOVWF FSR ‘/ЗАГРУЖАЕМ ЗНАЧЕНИЕ MOVFW INDF /РЕГИСТРА. .MOVWF EEDATA /ЗАПИСЫВАЕМ. BCF INTCON,GIE /ЗАПРЕТ ПРЕРЫВАНИЙ. BSF STATUS,RPO /БАНК 1. BSF EECON1A80H, WREN /РАЗРЕШЕНИЕ ЗАПИСИ. MOVLW 55H /ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ MOVWF EECON2A80H // MOVLW OAAH // MOVWF EECON2A80H // BSF EECON1A80H, WR /ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ. ZAPIZ BTFSS EECON1A80H, .4 /ПОКА НЕ БУДЕТ ЗАКОНЧЕНА ЗАПИСЬ - 124
Универсальный таймер GOTO ZAPIZ ;ХОДИМ ПО КРУГУ. ВСЕ EECON1A80H,4 f ВСЕ EECON1A80H,WREN /ЗАПРЕТ'ЗАПИСИ.2 ВСЕ STATUS,RPO ;БАНК 0. INCF EEADR,1 ’ MOVFW EEADR /ЕСЛИ УЖЕ 4, SUBLW .4 BZ EEOO /ТО ИДЕМ ОБНУЛЯТЬ. INCF ABC, 1 ;+1 В СЧЕТЧИК АДРЕСА. GOTO EEOO ZAPISE /ПО КРУГУ ДО КОНЦА ЗАПИСИ CLRF EEADR /ОБНУЛИМ АДРЕС BCF FLAG,3 /И ФЛАГ. GOTO RECONST Г ; 9. УСТАНОВКА - МИНУС. MINUS BCF FLAG,2 ;СБРОСИМ ФЛАГ МИНУСА. BTFSC CAT, 1 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ РАЗРЯДЕ, GOTO MINUS1 /ИДЕМ УСТАНАВЛИВАТЬ ПЕРВЫЙ РАЗРЯД. BTFSC CAT, 2 /ЕСЛИ ЗАПЯТАЯ ВО ВТОРОМ РАЗРЯДЕ, GOTO MINUS2 /ИДЕМ УСТАНАВЛИВАТЬ ВТОРОЙ РАЗРЯД. / DECF SECO,1 /-1 ИЗ РЕГИСТРА МЛАДШЕГО РАЗРЯДА. MOVLW .255 /ЕСЛИ В РЕГИСТРЕ 0, ТО РЕЗУЛЬТАТ =255 SUBWF SECO,0 /ЕСЛИ РАВНО 0, ИДЕМ BZ MINUS9 /НА УСТАНОВКУ 9 В МЛАДШЕМ РАЗРЯДЕ.' GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. MINUS9 MOVLW .9 MOVWF SECO /УСТАНОВКА 9 В МЛАДШЕМ РАЗРЯДЕ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. MINUS1 DECF SEC1,1 /-1 ИЗ РЕГИСТРА СРЕДНЕГО РАЗРЯДА. MOVLW .255 /ЕСЛИ В РЕГИСТРЕ 0, ТО РЕЗУЛЬТАТ =255 SUBWF SEC1,0 /ЕСЛИ РАВНО 0, ИДЕМ BZ MINUS19 /НА УСТАНОВКУ 9 В СРЕДНЕМ РАЗРЯДЕ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. MINUS19 MOVLW .9 MOVWF SEC1 /УСТАНОВКА 9 В СРЕДНЕМ РАЗРЯДЕ.' GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. MINUS2 DECF SEC2,1 /-1 ИЗ РЕГИСТРА СТАРШЕГО РАЗРЯДА. MOVLW .255 /ЕСЛИ В РЕГИСТРЕ 0, ТО РЕЗУЛЬТАТ =255 SUBWF SEC2,0 /ЕСЛИ РАВНО 0, ИДЕМ BZ MINUS29 /НА УСТАНОВКУ 9 В СТАРШЕМ РАЗРЯДЕ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. MINUS29 MOVLW . 9 * MOVWF SEC2 /УСТАНОВКА 9 В СТАРШЕМ РАЗРЯДЕ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. 125
Устройства с цифровой индикацией ; 10. УСТАНОВКА - ПЛЮС. PLUS BCF FLAG,1 ;СБРОС ФЛАГА ПЛЮСА. BTFSC CAT, 1 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ РАЗРЯДЕ, GOTO PLUS1 /ИДЕМ УСТАНАВЛИВАТЬ ПЕРВЫЙ РАЗРЯД. BTFSC CAT, 2 /ЕСЛИ ЗАПЯТАЯ ВО ВТОРОМ РАЗРЯДЕ, GOTO PLUS2 /ИДЕМ УСТАНАВЛИВАТЬ ВТОРОЙ РАЗРЯД. INCF SECO,1 ,-+1 В РЕГИСТР. MOVLW .10 /ЕСЛИ В РЕГИСТРЕ 10, ТО SUBWF SECO,0 BZ PLUSO /ИДЕМ ОБНУЛЯТЬ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. PLUS0 CLRF SECO GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. PLUS1 INCF SEC1,1 /+1 В РЕГИСТР. MOVLW .10 /ЕСЛИ В РЕГИСТРЕ 10, ТО SUBWF SEC1,0 BZ PLUS10 /ИДЁМ ОБНУЛЯТЬ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. PLUS10 CLRF SEC1 GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. PLUS2 INCF SEC2,1 /+1 В РЕГИСТР. MOVLW .10 /ЕСЛИ В РЕГИСТРЕ 10, ТО SUBWF SEC2,0 BZ PLUS20 /ИДЕМ ОБНУЛЯТЬ. GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. PLUS20 CLRF SEC2 GOTO IND /НА УСТАНОВКУ РЕГИСТРОВ ИНДИКАЦИИ. ; 11. ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ. IND ‘ BTFSS FLAG,0 /ЕСЛИ ПУСКА НЕТ, GOTO INDS . /ИНДИЦИРУЕМ В СЕКУНДАХ. BTFSC CAT, 1 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ РАЗРЯДЕ, GOTO INDM /ИНДИЦИРУЕМ В МИНУТАХ. BTFSC CAT, 2 /ЕСЛИ ЗАПЯТАЯ ВО ВТОРОМ РАЗРЯДЕ, GOTO INDH /ИНДИЦИРУЕМ В ЧАСАХ. INDS CLRF ' DEYL /ОБНУЛЯЕМ РЕГИСТРЫ CLRF HOUH ' /СТАРШИХ РАЗРЯДОВ. CLRF HOUL 9 CLRF MINH MOVFW SECO /ЗНАЧЕНИЕ МЛ. РАЗРЯДА УСТАНОВКИ MOVWF SECL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД СЕКУНД. MOVFW SEC1 /ЗНАЧЕНИЕ СРЧ РАЗРЯДА УСТАНОВКИ MOVWF ' SECH /ПЕРЕПИСЫВАЕМ В СТ. РАЗРЯД СЕКУНД 126
Универсальный таймер MOVFW SEC2 /ЗНАЧЕНИЕ СТ. РАЗРЯДА УСТАНОВКИ MOVWF MINL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД .МИНУТ. GOTO RECONST Г INDM CLRF SECL /ОБНУЛЯЕМ РЕГИСТРЫ CLRF SECH /ПРЕДЫДУЩИХ РАЗРЯДОВ. - CLRF HOUH /И СТАРШИХ РАЗРЯДОВ. CLRF DEYL MOVFW SECO /ЗНАЧЕНИЕ МЛ. РАЗРЯДА УСТАНОВКИ MOVWF MINL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД МИНУТ. MOVFW SEC1 /ЗНАЧЕНИЕ СР. РАЗРЯДА УСТАНОВКИ MOVWF MINH /ПЕРЕПИСЫВАЕМ В СТ. РАЗРЯД МИНУТ. MOVFW SEC2 /ЗНАЧЕНИЕ СТ. РАЗРЯДА УСТАНОВКИ MOVWF HOUL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД ЧАСОВ. GOTO RECONST / INDH CLRF SECL /ОБНУЛЯЕМ РЕГИСТРЫ CLRF SECH /ПРЕДЫДУЩИХ CLRF MINL /РАЗРЯДОВ. CLRF MINH Г 1 MOVFW SECO /ЗНАЧЕНИЕ МЛ. РАЗРЯДА УСТАНОВКИ MOVWF HOUL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД ЧАСОВ. MOVFW SEC1 /ЗНАЧЕНИЕ СР. РАЗРЯДА УСТАНОВКИ MOVWF HOUH /ПЕРЕПИСЫВАЕМ В СТ. РАЗРЯД ЧАСОВ. MOVFW SEC2 /ЗНАЧЕНИЕ СТ. РАЗРЯДА УСТАНОВКИ MOVWF DEYL /ПЕРЕПИСЫВАЕМ В МЛ. РАЗРЯД ДНЕЙ. GOTO RECONST Г ; 12. СТОП. STOP BTFSC FLA, 2 /ЕСЛИ ВКЛЮЧЕН ЗВОНОК, GOTO STOPO /ПОЙДЕМ ВЫКЛЮЧИМ ЕГО. CLRF FLAG /ЕСЛИ НАЖАТА ТОЛЬКО КНОПКА СТОП, CLRF FLA /СБРОСИМ ФЛАГИ. BTFSS PORTB,6 /ЕСЛИ ВКЛЮЧЕН СТОП И ЛЛЮС, BSF FLAG,3 /УСТАНОВИМ ФЛАГ ЗАПИСИ. BTFSS PORTB,5 /ЕСЛИ ВКЛЮЧЕН СТОП И МИНУС, BSF FLAG,7 /УСТАНОВИМ ФЛАГ СЧИТЫВАНИЯ. •BTFSS PORTA,3 /ЕСЛИ ВКЛЮЧЕН СТОП И ЗПТ., BSF FLAG,5 /УСТАНОВИМ ФЛАГ НЕПРЕРЫВНОГО РЕЖИМА. TSTF FLAG /ЕСЛИ ЕСТЬ УСТАНОВКА, BTFSC STATUS,2 CLRF PAUSA /ОБНУЛИМ ПАУЗУ. GOTO RECONST f STOPO BCF FLA, 2 /ОБНУЛИМ ФЛАГ ЗВОНКА. BTFSC FLAG,0 /ЕСЛИ НЕПРЕРЫВНЫЙ РЕЖИМ (ПУСК НЕ ВЫКЛЮЧЕН), GOTO SL /ИДЕМ СЧИТАТЬ ДАЛЬШЕ. GOTO RECONST /ИНАЧЕ ЗАВЕРШАЕМ ПРЕРЫВАНИЕ. ; 13. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И 127
Устройства с цифровой индикацией MOVFW STATUS ;STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP BSF STATUS,5 ;БАНК 1. MOVLW B'11110000' /РАЗРЕШАЕМ ВХОДА RB4-RB7 MOVWF TRISBA80H /ДЛЯ СЧИТЫВАНИЯ СОСТОЯНИЯ КНОПОК MOVLW B'10100000' Г MOVWF INTCON BCF STATUS,5 /БАНК 0. BTFSS PORTB,4 /ЕСЛИ НАЖАТА КНОПКА "СТОП", GOTO STOP /ИДЕМ НА СТОП. BTFSC FLAG,0 /ЕСЛИ ФЛАГ ПУСКА =1, GOTO SL /ТО ИДЕМ СЧИТАТЬ. BTFSS PORTA,3 /ЕСЛИ НАЖАТА КНОПКА ЗАПЯТОЙ, GOTO CAT I /ИДЕМ МЕНЯТЬ ЗНАЧЕНИЕ. BTFSC FLAG,3 /ЕСЛИ ФЛАГ ЗАПИСИ УСТАНОВЛЕН, GOTO ZAPISO /ИДЕМ НА ЗАПИСЬ. BTFSC FLAG,1 /ЕСЛИ УСТАНОВЛЕН ФЛАГ ПЛЮСА, GOTO PLUS /ИДЕМ НА ПЛЮС. BTFSC FLAG,2 /ЕСЛИ УСТАНОВЛЕН ФЛАГ МИНУСА, GOTO MINUS /ИДЕМ НА МИНУС. BTFSC FLAG,7 /ЕСЛИ УСТАНОВЛЕН ФЛАГ СЧИТЫВАНИЯ GOTO АКТ /ИДЕМ СЧИТЫВАТЬ. GOTO KEY /НА ОПРОС КЛАВИАТУРЫ. RECONST /ЁОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BSF STATUS,5 /БАНК 1. MOVLW B'OOOOOOOO' /РАЗРЕШАЕМ ВСЕ НА ВЫХОД. MOVWF TRISBA80H BCF STATUS,5 /БАНК 0. MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR / FSR, MOVFW W_TEMP ;W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 14. СЧЕТ В ЧАСОВОМ ФОРМАТЕ. SL BTFSS PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ПУСК, BCF FLA, 0 /ВКЛЮЧИМ ИНДИКАЦИЮ.. TSTF SECL /ЕСЛИ МЛАДШИЙ РАЗРЯД РАВЕН НУЛЮ, BZ SH /ПРОВЕРИМ СТАРШИЙ РАЗРЯД СЕКУНД. DECF SECL,F /ИНАЧЕ -1 ИЗ РЕГИСТРА МЛ. РАЗРЯДА GOTO RECONST Г SH BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF SECH /ЕСЛИ СТАРШИЙ РАЗРЯД РАВЕН НУЛЮ, BZ ML /ПРОВЕРИМ МЛАДШИЙ РАЗРЯД МИНУТ. MOVLW .9 /УСТАНОВИМ MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД. DECF SECH,F /-1 ИЗ СТАРШЕГО РАЗРЯДА СЕКУНД. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. 128
Универсальный таймер ML 1 ВСЕ STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF ' MINL /ЕСЛИ МЛАДШИЙ РАЗРЯД РАВЕН НУЛЮ, BZ MH /ПРОВЕРИМ СТАРШИЙ РАЗРЯД МИНУТ. MOVLW .9, /УСТАНОВИМ MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД. MOVLW .5 9 MOVWF SECH DECF MINL,F /-1 В СТ. РАЗРЯД. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. МН BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF MINH- /ЕСЛИ СТАРШИЙ РАЗРЯД МИНУТ РАВЕН НУЛЮ, BZ HL ,Проверим младший разряд часов. MOVLW .9 /УСТАНОВИМ MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД И MOVWF MINL /РЕГИСТР МЛ. РАЗРЯДА МИНУТ. MOVLW .5 /УСТАНОВИМ MOVWF SECH /РЕГИСТР СТ. РАЗРЯДА СЕКУНД. DECF MINH,F /-1 ИЗ РЕГИСТРА СТ. РАЗРЯДА МИНУТ. BSF FLA, 0 /ВЫКЛЮЧИМ ИНДИКАЦИЮ. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. HL BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF HOUL /ЕСЛИ МЛАДШИЙ РАЗРЯД РАВЕН НУЛЮ, BZ HH /ПРОВЕРИМ СТАРШИЙ РАЗРЯД ЧАСОВ. MOVLW .9 /УСТАНОВИМ ' ’MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД И MOVWF MINL /РЕГИСТР МЛ. РАЗРЯДА МИНУТ. MOVLW .5 /УСТАНОВИМ MOVWF SECH /РЕГИСТР СТ. РАЗРЯДА СЕКУНД И MOVWF MINH /РЕГИСТР СТ. РАЗРЯДА МИНУТ. DECF HOUL,F /-1 ИЗ МЛ. РАЗРЯДА ЧАСОВ. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. НН BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF HOUH /ЕСЛИ СТАРШИЙ РАЗРЯД ЧАСОВ РАВЕН НУЛЮ, BZ DL /ПРОВЕРИМ РАЗРЯД ДНЕЙ. MOVLW .9 /УСТАНОВИМ MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД, MOVWF MINL /РЕГИСТР МЛ. РАЗРЯДА МИНУТ, MOVWF HOUL /РЕГИСТР МЛ. РАЗРЯДА ЧАСОВ. MOVLW .5 * /УСТАНОВИМ MOVWF SECH /РЕГИСТР СТ. РАЗРЯДА СЕКУНД И MOVWF MINH /РЕГИСТР СТ. РАЗРЯДА МИНУТ. DECF HOUH,F /-1 ИЗ СТАРШЕГО РАЗРЯДА РЕГИСТРА ЧАСОВ. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. DL BCF STATUS,2 . /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. TSTF DEYL /ЕСЛИ МЛАДШИЙ РАЗРЯД РАВЕН НУЛЮ, BZ TUSO /ИДЕМ ВКЛЮЧАТЬ ЗВОНОК. MOVLW .9 /ИНАЧЕ УСТАНОВИМ MOVWF SECL /РЕГИСТР МЛ. РАЗРЯДА СЕКУНД, MOVWF MINL /РЕГИСТР МЛ. РАЗРЯДА МИНУТ, 5 Зак. 2418 129
Устройства с цифровой индикацией MOVLW .5 ;УСТАНОВИМ MOVWF SECH /РЕГИСТР СТ. РАЗРЯДА СЕКУНД И .MOVWF MINH /РЕГИСТР СТ. РАЗРЯДА МИНУТ». MOVLW .2 ;УСТАНОВИМ MOVWF HOUH /РЕГИСТР СТ. РАЗРЯДА ЧАСОВ. MOVLW .3 /УСТАНОВИМ MOVWF HOUL /РЕГИСТР МЛ. РАЗРЯДА ЧАСОВ. DECF DEYL,F . /-1 ИЗ РАЗРЯДА ДНЕЙ. GOTO RECONST /НАЧИНАЕМ СНАЧАЛА. TUSO BTFSC FLAG,5 /ЕСЛИ ВКЛЮЧЕН НЕПРЕРЫВНЫЙ РЕЖИМ, GOTO NEPER /ИДЕМ. BSF FLA, 2 /ИНАЧЕ ВКЛЮЧИМ ЗВОНОК. BCF FLAG,0 /ФЛАГ ПУСКА ВЫКЛЮЧАЕМ. GOTO IND /ЗАПИСЬ ИЗ РЕГИСТРОВ УСТАНОВКИ. NEPER INCF COU, 1 /+1 В СЧЕТЧИК. BTFSC COU, 0 /ЕСЛИ МЛАДШИЙ РАЗРЯД 1, BSF FLA, 2 /УСТАНОВИМ ФЛАГ ЗВОНКА. BTFSS COU, 0 /ЕСЛИ МЛАДШИЙ РАЗРЯД 0, BCF FLA, 2 /СБРОСИМ ФЛАГ ЗВОНКА. GOTO АКТ /СЧИТЫВАНИЕ ИЗ ПАМЯТИ. . END = =±2:=== = == = = = = = = = = = =:==:=:========:=: Автомат включения Освещения В настоящее время существует несколько способов включения ночного освещения. Первый — это включение освещения «дедушкиным» способом, т. е. вручную. Более «продвинутый» способ — автоматическое включение и вы- ключение освещения в фиксированное время. И последнее достижение техни- ки — это автоматическое включение освещения по освещенности фотодатчика. У каждого из этих способов свои недостатки. Предлагаю еще один способ включения освещения, который лишен недостатков. Данный автомат может включать и выключать освещение по времени суточ- ного изменения продолжительности дня в течение года независимо от широты и долготы места применения. Предусмотрена также возможность выключения освещения в фиксированное время. Это делает возможным применение авто- мата для досвечивания до необходимого светового дня в теплицах, птичниках, животноводческих фермах, аквариумах или на лестничной площадке. В автомате используются данные изменения светового дня, взятые из пере- кидного календаря на текущий год. Год от года эти данные изменяются за счет прецессии и нутации земной оси и влияния сезонной неравномерности враще- ния Земли в небольших пределах и укладываются в диапазон потребительской точности. Моменты восхода и захода Солнца не могут являться временем включения-выключения освещения, так как из-за рефракции атмосферы есте- ственное освещение предшествует этим моментам. Светлому и темному време- ни суток предшествуют сумерки. Сумерки, при которых не видны даже наибо- лее яркие звезды, называются гражданскими. Продолжительность гражданских 130
Автомат включения освещения сумерек изменяется ежедневно и зависит от положения Солнца на эклиптике (проекция годичной траектории Солнца на небесную сферу) или склонения Солнца. Практически это выражается в ежедневном изменении высоты Солнца над горизонтом. Время продолжительности гражданских сумерек взято из еже- годного школьного астрономического календаря с разбивкой по 15 дней и ап- проксимировано на каждый день. В перекидном календаре даются ежедневные данные продолжительности дня для Москвы. Но эти данные будут отличаться в любом другом пункте, имеющем свою широту и долготу, т. к. в том месте бу- дет действовать свое истинное местное время. Тема времени самая трудная и интересная в астрономии, поэтому во все ее тонкости вникать нет смысла. Зная о поясном времени с разбивкой по земно- му шару через 15 градусов, необходимо упомянуть и о декретном времени. На- пример, в Татарии декретом от 1918 года было установлено, что в республике будет действовать московское время. Хотя фактически поясное время там будет отличаться от московского на один час. Этим же декретом установлено по всей стране декретное время, отличающееся от поясного на один час. Если бы мы жили по поясному времени, то в дни равноденствия восход солнца был бы в 5 часов, а заход — в. 17 часов (вместо 6 и 18 часов). Можно согласиться со сто- ронниками экономии электроэнергии. О действии летнего времени все знают । и поэтому нет смысла о нем говорить. Итожа небольшую прогулку по времени, можно сказать, что в каждом населенном пункте будет свое время начала и [. окончания ночи, а следовательно, свое необходимое время включения и вы- 1 ключения ночного освещения. Чтобы учесть все тонкости изменения местного j истинного времени, в автомате предусмотрено введение утренней и вечерней [ поправки со своим знаком. Можно было бы вводить в программу широту и J долготу местности и по ним вычислять время, но это проще только для про- I граммы, а для потребителя сложнее. Определить координаты местности, даже имея мелкомасштабную Карту, не всем по силам. А определить опытным путем необходимую поправку очень просто. Причем однажды определенные утрен- няя и вечерняя поправки, будут действовать постоянно. В небольших населенных пунктах, с целью экономии электроэнергии, ноч- ное освещение выключают в определенное время (00 часов или в 1 час). Для этого в автомате предусмотрено фиксированное время выключения освещения. Таким образом, применение этого автомата возможно в любом пункте се- верного полушария Земли (кроме Заполярья и экватора). Для южного полуша- рия Земли необходима замена зимнего нулевого дня на летний и наоборот. На других широтах, возможно, потребуется изменение таблицы поправок в про- грамме автомата. Расчет времени включения и выключения освещения производится в следу- ющей последовательности. За нулевой день принят день зимнего солнцестоя- ния, т. е. 22 декабря. Поворотным нулевым днем является день летнего солнце- стояния — 22 иЮня. Для симметричности принято в году 366 дней. Для этого прибавлен день високосного года — 29 февраля. На каждую установленную да- ту (число, месяц) рассчитывается, каким по порядку днем (счетный день) явля- ется данный день, считая от нулевого дня. При достижении дня летнего солн- цестояния, который принят за нулевой летний день, отсчет идет в обратной последовательности. Например, 26 июня будет четвертым счетным днем, и по- правки будут суммироваться ко времени нулевого летнего дня. Это сделано 131
Устройства с цифровой индикацией из-за того, что по косвенной адресации в один восьмиразрядный регистр мож- но записать только 256 значений поправок, но никак не 366. Поэтому в регистр программ записано 183 значения поправки от зимнего дб летнего нулевого дня. Кроме того, расчет поправки занимает довольно много времени (0,7 сек), хотя он и производится один раз в сутки. Если производить расчет поправок от ну- левого дня до 365-го, то это займет около 1,5 секунды, а значит, будет пропу- щено прерывание на увеличение регистра секунд и часы будут отставать. Но в этом нет необходимости, поскольку приращение поправок на каждый день от одного солнцестояния до другого примерно (с бытовой точностью) симметрич- ны, но имеют разные знаки. По номеру счетного дня вычисляются утренняя и вечерняя поправки, сум- мированием всех поправок, начиная от нулевого дня. К полученным поправ- кам прибавляются со своим знаком установочные утренние и вечерние поправ- ки. Далее полученные пЪправки прибавляются к времени включения-выключе- ния освещения нулевого дня, и получаем время включения-выключения освещения на текущую дату. Укрупненный алгоритм работы программы показан на рис. 30. После пуска и инициализации регистров включается предцелитель и таймер TMR0, настро- енные на переполнение таймера через одну секунду. В это время программа выполняет индикацию, если идет установка, и сравнение вычисленного значе- ния времени с текущим временем, если нет установки. При сравнении време- ни, если есть совпадение, переключаются выходы На включение, если вечернее время, или на выключение, если утреннее время. По переполнению таймера происходит прерывание. Увеличиваются значения регистров часов и, если есть изменение даты (00 часов), выполняются расчеты счетного числа, поправок и времени включения-выключения. Если нет изменения даты и нет установки, то программа возвращается из прерывания. Если идет установка, то выполня- ется проверка нажатых кнопок: «режим», «разряд», «установка». Если во время установки были изменения числа или месяца, производится перерасчет време- ни включения-выключения. Если дата не изменялась, то прерывание заверша- ется. Цикл завершается до следующего прерывания. На рис. 31 показана принципиальная схема автомата включения освещения. Выходы микроконтроллера DD1 RAO—RA3 коммутируют катоды светодиодов HG1—HG3. Выход RA4 работает на вход и на выход. На выход он включает сег- мент Н, а в режиме входа принимается состояние, кнопки SB4 — «Установка». Входы RBO—RB6 двунаправленные. В режиме индикации и работы на выход они включают сегменты светодиодов. При работе на вход к выводам RBI, RB2 подключены кнопки SB1, SB2 «Режим» и «Установка». В рабочем режиме выво- ды RB3, RB4 работают на выход, коммутируя реле К1 и К2. Вывод RB7 работает постоянно на вход, управляя включением режима индикации. Цепочка Rl, С1 является схемой сброса микроконтроллера при включении, обеспечивая его нормальное функционирование. От типа часового кварца (плоский, цилиндри- ческий, миниатюрный) на частоту 32768 Гц зависит номинал конденсаторов С2, СЗ, который может лежать в пределах 20...33 пФ. Конденсаторы подбираются по устойчивому запуску микроконтроллера и при подстройке частоты генера- ции кварца. В аварийном режиме резервное питание осуществляется элемента- ми GB1. В обычном режиме питание осуществляется через стабилизатор напря- жения КР142ЕН5А или аналогичный импортный. 132
Автомат включения освещения Рис. 30. Автомат включения освещения. Алгоритм работы программы 133
Устройства с цифровой индикацией УО4КД522Б Рис. 31. Автомат включения освещения - т Автомат может использоваться в единичном экземпляре для частного испо- льзования или в многократном исполнении, например, в коммунальном хозяй- стве. Имея много пунктов коммутации освещения, достаточно иметь один ин- дикатор для установки времени и поправок. Поэтому в схему введен разъем ХР1, через него подсоединяется плата со светодиодами и их резисторами, а так- же с кнопками. В последнем случае кнопка с фиксацией SB3 и резистор R14 не нужны. Вместо них на плате индикации устанавливается перемычка между об- щим выводом GND и выводом UST. На схеме перемычка показана пунктиром. Транзисторы VT1, VT2 и реле KI, К2 включают и выключают пусковое реле КЗ (рис. 32). Реле К1 нормально-разомкнутым контактом К1.1 замыкает цепь питания реле КЗ при высоком уровне на выходе RB3 микроконтроллера. Сво- им контактом К3.1 реле КЗ блокируется. При появлении высокого уровня на выводе RB4 микроконтроллера включится реле К2 и своим нормально-замкну- тым контактом К2.1 разомкнет цепь питания реле КЗ. При срабатывании реле КЗ замкнутся контакты К3.2—К3.4. Эти контакты (в зависимости от положе- ния переключателей SAI—SA3) подключат ту или иную линию освещения ELI—EL3. Пусковые кнопки SB5, SB6, работающие в ручном режиме, остают- ся для работы в аварийном режиме. Печатная плата для единичного изготовления автомата приведена на рис. 33, расположение элементов на ней — рис. 34. Печатная плата для свето- диодов показана на рис. 35. Печатная плата разработана для реле типа РЭС15 134
Автомат включения освещения Рис. 32."Автомат включения освещения. Схема подключения силовых элементов паспорт РС4.591.003. Без переделки платы можно использовать миниатюрные реле типа РЭС49 паспорт РС4.569.426. Назначение кнопок: SB1 — «Режим», выбор режима установки перемещением запятой по раз; - дам индикатора; SB2 — «Разряд», выбор мигающего разряда, в который будет производиться установка; SB3 — «Индикация», кнопка с фиксацией для включения светодиодов и ре- жима установки; SB4 — «Установка», плюс единица в мигающий разряд. Описание режимов работы автомата: 00 00 (запятая в нулевом разряде) — установка знака и значения вечерней поправки; 00 0,0 (запятая в первом разряде) — установка значения фиксированного времени выключения освещения; 00, 00 (запятая во втором разряде) — установка текущего числа и месяца; 0,0 00 (запятая в третьем разряде) — установка знака и значения утренней поправки; 00 00 (запятая за пределами индикатора) — установка текущего времени (часы, минуты). Знаки поправок устанавливаются в третьем разряде. Единица в этом разряде соответствует знаку минус, а ноль — знаку плюс. В нулевом и первом разрядах устанавливается значение поправок в минутах, а во втором разряде — значение поправок в часах. Число устанавливается во втором и третьем разрядах индика- тора. Месяц устанавливается в нулевом и первом разрядах индйкатора. Фикси- 135
Устройства с цифровой индикацией Рис. 33. Автомат включения освещения. Печатная плата SB4 SB1 HDEFG 3 2 к SB3 А В С 0 1 -GBI -9 В KSB1-SB4 Рис. 34. Автомат включения освещения. Расположение элементов на печатной плате Рис. 35. Автомат включения освещения. 4-х разрядный индикатор на АЛ314А. Сторона установки светодиодов 136
Автомат включения освещения рованное время выключения и текущее, время устанавливаются в часах и мину- тах. При установке значений необходимо помнить, что программа не имеет «защиты от дурака» и требует корректных установок (просто не хватило объема памяти). Установка фиксированного времени выключения, равная 25 часам и 99 минутам работать не будет. Это же произойдет: если фиксированное время выключения освещения придется на светлое время суток; если величина по- правки будет очень большой и перехлестнет длительность ночи. Только уста- новка текущего месяца автоматически переустанавливается в единичное значе- ние, если она выполнена некорректно. Собственно, этим можно пользоваться при установке января. Поскольку при изменении даты происходит перерасчет значений времени включения и выключения освещения, после каждой уста- новки в режиме даты индикация кратковременно гаснет (до 0,7 сек). Устанав- ливая значение месяца, равное 24, после перерасчета высветится значение ме- сяца, равное 04. Если установить значение месяца, равное 20 — то высветится значение, равное 01. Десятки месяца можно устанавливать, не переходя на пер- вый разряд. Если на индикаторе ни один разряд не мигает, кнопкой «Установка» можно обнулить значения выбранного режима. При этом обнуляются значения всего индикатора. Для режима часов обнуляются только значения минут и секунд. Переключение времени выключения освещения происходит по состоянию флага, который устанавливается при установке либо утренней поправки, либо фиксированного времени выключения. Из этого следует, что значение фикси- рованного времени (как и значение утренней поправки) может находиться на индикаторе, но не работать. Для того чтобы включились эти режимы, необхо- дима переустановка любого значения на этом режиме. Например, установлены значения: 1,0 25 и 12 0,0. Вы не помните, какой из этих режимов устанавливал- ся Последним. Установите мигающим нулевой разряд в выбранном режиме и установите 0 или 5 еще раз. После установки будет работать тот режим, в кото- ром вы делали переустановку. Для упрощения выполнения расчетов времени включения и выключения освещения текущее время устанавливается смещенным на 12 часов. В 12 часов дня (по часам) необходимо в автомате устанавливать 00 чаеов. И в это время будет смена даты. В 14 часов (по часам) необходимо устанавливать 02 часа и т. п. При смене даты происходит, как упоминалось выше, перерасчет време- ни включения-выключения. Число необходимо устанавливать до обеда (по ча- сам) сегодняшнее, а после обеда — завтрашнее. Сообразуясь со здравым смыс- лом, естественно, что все установки необходимо производить, когда освещение выключено. Поскольку выходы, включающие реле К1 и К2, работают на инди- кацию, то возможно переключение реле от импульсов индикации (как прави- ло, в состояние выключено). При включении индикации состояние выходов запоминается. После выключения индикации состояние выходов возвращается в исходное. В зависимости от типа применяемого реле KI, К2 (различное время срабатывания), возможно, потребуется отключение базы транзистора VT1 на время установки. Особенно это может сказаться при установке даты. Если имеется рубильник для выключения освещения, то лучше его выключить на время установки. Определение поправок эмпирическим путем выполняется следующим обра- зом. Включается автомат с нулевыми поправками на текущую дату. Запомина- 137
Устройства с цифровой индикацией ется время включения и выключения освещения. Если освещение включается, когда еще светло, то вечерняя поправка устанавливается со знаком плюс. Эта поправка будет равна разности времени, на которое необходимо позже вклю- чить освещение. Если необходимо раньше включить освещение, то поправка устанавливается со знаком минус.- То есть устанавливается единица в третьем разряде. Если освещение выключается позже, чем необходимо, т. е. когда уже светло, то поправка устанавливается со знаком минус. Если освещение выклю- чается раньше необходимого времени, когда еще темно, то поправка устанав- ливается со знаком плюс на необходимое время в минутах. Если поправки рав- ны по абсолютной величине и знаку, то есть другой путь их учета. Для этого необходимо установить в автомате время, смещенное на данную величину. На- пример, если вечерняя и утренняя поправки равны плюс 30 минут, то, устанав- ливая время в автомате в 9 часов утра, необходимо установить 21 час 30 минут. Тогда отпадает необходимость в установке поправок. Это возможно в пунктах, имеющих приблизительно равную широту с широтой Москвы. Все определе- ния поправок эмпирическим путем необходимо выполнять в солнечные дни. Если посмотреть на работу устройства в общем, то оно представляет собою автомат для досвечивания светлого времени суток до 24 часов. Изменяя время выключения освещения, можно установить любое время досвечивания, то есть ] продления светового дня до необходимого значения. Это бывает необходимо в теплицах, птичниках, фермах. Для организации досвечивания необходимо из -j 24 часов вычесть время, необходимое вам для досвечивания. Например, необ- j ходимо установить светлое время в теплице, равное 14 часам. 24 часа минус I 14 часов будет равно 10 часов. Таким образом, устанавливаем утреннюю по- правку, равную минус 9 часов (1,9 00), а вечернюю поправку, равную минус 1 1 час (примерная продолжительность гражданских сумерек в осенний, зимний, I весенний периоды). Эти поправки будут действовать до того времени, пока долгота дня будет оставаться меньше или равна 14 часам (примерно до 12 апре- ля). Дальнейшая работа автомата будет некорректной и потребуется выключе- ние или переустановка поправок. ; АВТОМАТ ВКЛЮЧЕНИЯ НОЧНОГО ОСВЕЩЕНИЯ. ; С ВВЕДЕНИЕМ ПОПРАВОК НА МЕСТНОЕ ВРЕМЯ ;. ИЛИ ВЫКЛЮЧЕНИЕМ В ФИКСИРОВАННОЕ ВРЕМЯ. • ; ДЛЯ ЕДИНИЧНОГО ИЗГОТОВЛЕНИЯ РАДИОЛЮБИТЕЛЯМИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ.. ; РАБОЧАЯ ВЕРСИЯ БЕЗ ОГРАНИЧЕНИЯ- ; ФАЙЛ: SVET,ASM. ; ВЕРСИЯ: 14-01-03. ; saes@mail.ru ♦INCLUDE P16F84A.INC __CONFIG 3FF0 ;============================================ ; КВАРЦ = 32768 ГЦ. х256х4х32= 1 СЕК. ; ДЕЛЕЖ ПИРОГА. • s:s=====s:======s:s===s=:=s:==s==:====s==========s: INDF EQU ООН /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01Н ;TMR0. 138
Автомат включения освещения OPTIONR EQU 01H /OPTION (RP0=l). PC - EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /СОСТОЯНИЕ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA EQU 05H Г PORTB EQU 06H INTCON EQU OBH /РЕГИСТР ПРЕРЫВАНИЙ. DAY1 EQU OCH /РЕАЛЬНОЕ ЧИСЛО. MON EQU ODH /СЧЕТНЫЙ МЕСЯЦ. ATT EQU OEH /ПОЛОЖЕНИЕ ЗАПЯТОЙ (ВЫБОР РЕЖИМА). MINI EQU OFH /МИНУТЫ СЧЕТЧИКА. SEC1 EQU 010H /СЕКУНДЫ СЧЕТЧИКА. DAY IL EQU 011H /ЕДИНИЦЫ ДНЕЙ. SCO EQU 0.12 H /ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. SCI EQU 013H /ДЕСЯТКИ МИНУТ ИНДИКАЦИИ. SC2 EQU 014H /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ. SC3 EQU 015H /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ. DAY1H EQU 016H /ДЕСЯТКИ ДНЕЙ. MON IL EQU 017H /ЕДИНИЦЫ МЕСЯЦА. HOU1 EQU 018H /ЧАСЫ. В DEKM EQU 019H /ВЕЧЕРНИЕ МИНУТЫ НУЛЕВОГО ДНЯ. UDEKM EQU 01 AH /УТРЕННИЕ МИНУТЫ НУЛЕВОГО ДНЯ. KATOD EQU 01BH /= АНОДУ, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ (ОБЩИЙ ЭЛЕКТРОД) COUI EQU 01CH /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. FLAG EQU 01DH ; О- УСТАНОВКА ФИКСИРОВАННОГО ВРЕМЕНИ ВЫКЛЮЧЕНИЯ, ; 1- СОСТОЯНИЯ ВЫХОДОВ, ; 2- ГАШЕНИЯ РАЗРЯДА, ; 5- ЗАПЯТОЙ, ANOD EQU 01EH /=КАТОДУ, ПОЗИЦИОННОЕ ЗНАЧЕНИЕ. SEGD EQU 01FH /РЕГИСТР АДРЕСА РАЗРЯДА ИНДИКАЦИИ. CAT EQU 020H /УСТАНОВКА РАЗРЯДА МИГАНИЯ. MONO EQU 021H /НУЛЕВОЙ МЕСЯЦ. DAYO EQU 022H /НУЛЕВОЙ ДЕНЬ. BM EQU 023H /МИНУТЫ ОБЩЕЙ ВЕЧЕРНЕЙ ПОПРАВКИ. W TEMP EQU 024H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 025H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ DSMH EQU 026H /БАЙТ АДРЕСАЦИИ В ПП. LSMH ' EQU 027H /МЛАДШИЙ БАЙТ В ПОДПРОГРАММЕ. HSMH EQU 028H /СТАРШИЙ БАЙТ В ПП. FSR TEMP EQU 029H /ВРЕМЕННЫЙ ДЛЯ FSR. SUMUL EQU 02 AH /МИНУТЫ УТРЕННЕГО ВЫКЛЮЧЕНИЯ ОСВЕЩЕНИЯ. FLAG1 EQU 02BH /ФЛАГ ПОДСЧЕТА ДНЕЙ И ПОПРАВОК. ; О- ВЫПОЛНЕНО СРАВНЕНИЕ ДО КОНЦА НУЛЕВОГО МЕСЯЦА, ; 1- РАВЕНСТВО РЕАЛЬНОГО И СЧЕТНОГО МЕСЯЦА, ; 2- ЗНАК ОБЩЕЙ ПОПРАВКИ, ; 3- ВЫЧИСЛЕНИЯ ВЕЧЕРНЕЙ ПОПРАВКИ, 139
Устройства с цифровой индикацией ; 4- ВЫЧИСЛЕНИЯ УТРЕННЕЙ ПОПРАВКИ, ; 6- ПЕРЕПОЛНЕНИЕ РЕГИСТРА УТРЕННЕЙ ПОПРАВКИ (256) . ; 7- ПЕРЕПОЛНЕНИЕ РЕГИСТРА ВЕЧЕРНЕЙ ПОПРАВКИ. SUMBL EQU 02CH /МИНУТЫ ВЕЧЕРНЕГО ВКЛЮЧЕНИЯ ОСВЕЩЕНИЯ. MON1 EQU 02DH ;СЧЕТНЫЙ МЕСЯЦ. MON1H EQU 02EH /ДЕСЯТКИ УСТАНОВКИ МЕСЯЦА. DAYZ EQU 02FH /ЧИСЛО ДНЕЙ ДО РАСЧЕТА ПОПРАВКИ. DAY EQU ОЗОН /РАБОЧЕЕ ЧИСЛО ДНЕЙ. DATAU EQU 031H /РЕГИСТР ПРЕОБРАЗОВАНИЯ УТРЕННЕЙ ПОПРАВКИ. DATAV EQU 032H /РЕГИСТР ПРЕОБРАЗОВАНИЯ ВЕЧЕРНЕЙ ПОПРАВКИ- SUMU EQU 033H /СУММА УТРЕННИХ ПОПРАВОК ДО РАСЧЕТНОГО ДНЯ. M_LOW EQU ’ 034H /ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ. M_HIGH EQU 035H /ДЕСЯТКИ МИНУТ ИНДИКАЦИИ. H_LOW EQU 036H /ЕДИНИЦЫ ЧАСОВ ИНДИКАЦИИ. H_HIGH EQU 037H /ДЕСЯТКИ ЧАСОВ ИНДИКАЦИИ. POPUO EQU 038H /УТРЕННЯЯ ПОПРАВКА, ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ POPU1 EQU 039H /ДЕСЯТКИ МИНУТ. POPU2 EQU ОЗАН /ЕДИНИЦЫ ЧАСОВ. POPU3 EQU 03BH /ЗНАК УТРЕННЕЙ,ПОПРАВКИ. POPVO. EQU 03CH /ВЕЧЕРНЯЯ ПОПРАВКА, ЕДИНИЦЫ МИНУТ.ИНДИКАЦИИ POPV1 EQU 03DH /ДЕСЯТКИ МИНУТ. POPV2 EQU ОЗЕН /ЕДИНИЦЫ МИНУТ. POPV3 EQU 03FH /ЗНАК ВЕЧЕРНЕЙ ПОПРАВКИ. FIK0 EQU 040Н /ЕДИНИЦЫ МИНУТ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. FIK1 EQU 041Н /ДЕСЯТКИ МИНУТ. FIK2 EQU 042Н /ЕДИНИЦЫ ЧАСОВ. FIK3 EQU 043Н /ДЕСЯТКИ ЧАСОВ". POPUL EQU 044Н /МИНУТЫ УТРЕННЕЙ ПОПРАВКИ. POPVL EQU 045Н /МИНУТЫ ВЕЧЕРНЕЙ ПОПРАВКИ. FI KM EQU 046Н /МИНУТЫ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. FIKH EQU 047Н /ЧАСЫ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. SUMB EQU 048Н ' /СЕММА ВЕЧЕРНИХ ПОПРАВОК ДО РАСЧЕТНОГО ДНЯ. SUMUH EQU 049Н /ЧАСЫ УТРЕННЕГО ВЫКЛЮЧЕНИЯ ОСВЕЩЕНИЯ. SUMBH ’ EQU 04 АН /ЧАСЫ ВЕЧЕРНЕГО ВКЛЮЧЕНИЯ ОСВЕЩЕНИЯ. UM EQU ’ 04ВН /МИНУТЫ УТРЕННЕЙ ПОПРАВКИ. BH EQU 04СН /МИНУТЫ ВЕЧЕРНЕЙ ПОПРАВКИ. UDEKH EQU 04DH /УТРЕННИЕ ЧАСЫ НУЛЕВОГО ДНЯ. BDEKH EQU 04ЕН /ВЕЧЕРНИЕ ЧАСЫ НУЛЕВОГО ДНЯ. UH EQU 04FH /ЧАСЫ УТРЕННЕЙ ПОПРАВКИ. ; 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА. SEGDATA ; 6, 5, 4, 3, 2, 1, О ADDWF PCL,F ; А, В, С, D, Е, F, G RETLW В'01111110' /О RETLW В'00110000' /1 140
Автомат включения освещения RETLW B'OllOllOl' ;2 RETLW B'OllllOOl' /3 RETLW B'OOllOOll' /4 RETLW B'.01011011' /5 RETLW B'OlOlllll' ;6 RETLW B'OlllOOOO' /7 RETLW В'ОИНШ' /8 RETLW В'01111011' ;9 э. ПЕРЕКОДИРОВКА ДЕСЯТИЧНОГО ЗНАЧЕНИЯ ДЕСЯТКОВ В ДВОИЧНОЕ. DECBIN ADDWF PC, 1 RETLW B'00000000' /0 RETLW B'00001010' /10 RETLW B'00010100' /20 RETLW B'OOOllllO' /30 RETLW B'00101000' /40 RETLW B'OOHOOIO' ; 50 RETLW B'OOllllOO' ; 60 RETLW B'OIOOOHO' /70 RETLW B'01010000' ; 80 RETLW B'OIOHOIO' ; 90 ; 4. ПЕРЕЗАПИСЬ УСТАНОВОК В РЕГИСТРЫ. UST4 MOVFW ATT ;КУДА ПОЙТИ ПРИ ADDWF PC, 1 /УСТАНОВКЕ: .. GOTO VETSHI /ВЕЧЕРНЯЯ ПОПРАВКА. GOTO FIKSI /ФИКСИРОВАННОЕ ВРЕМЯ ВЫКЛЮЧЕНИЯ GOTO DAMONI /ДЕНЬ И МЕСЯЦ. GOTO UTROI /УТРЕННЯЯ ПОПРАВКА. GOTO HOMII /ЧАСЫ. ; 5. НАХОЖДЕНИЕ РАСЧЕТНОГО ДНЯ. DUMA MOVFW MON1 ;УСТАНОВОЧНЫЙ.. SUBWF MONO,0 /НУЛЕВОЙ. SKPNZ /ЕСЛИ МЕСЯЦЫ РАВНЫ, GOTO DIMA12 /ВЫЧИСЛЯЕМ В НУЛЕВОМ МЕСЯЦЕ. SKPZ /ЕСЛИ МЕСЯЦЫ НЕ РАВНЫ, CALL DIMA9 /ПРИБАВИМ ДНИ ДО КОНЦА МЕСЯЦА DUMAO MOVFW MON1 /ИНАЧЕ СРАВНИМ УСТАНОВОЧНЫЙ SUBWF MON, 0 /СО СЧЕТНЫМ МЕСЯЦЕМ. SKPNZ /ЕСЛИ ОНИ УЖЕ РАВНЫ, GOTO DUMOO /ПРИБАВИМ ДНИ. MOVFW MON /ОЧЕРЕДНОЙ МЕСЯЦ. CALL DAYMON /СКОЛЬКО ДНЕЙ В МЕСЯЦЕ? ADDWF DAYZ,1 /ПРИБАВИМ ДНИ К СЧЕТЧИКУ. INCF MON, F /УВЕЛИЧИМ СЧЕТНЫЙ МЕСЯЦ. 141
Устройства с цифровой индикацией DU6M MOVLW .183 УЖЕ РАВНО ПОЛОВИНЕ ГОДА SUBWF DAYZ,0 ; ЧИСЛО В СЧЕТЧИКЕ ДНЕЙ? SKPNC ЕСЛИ БОЛЬШЕ ИЛИ РАВНО, CALL DIMF ; ПРОПУСКАЕМ. GOTO DUMA ; :ИНАЧЕ ПРИБАВИМ ЕЩЕ МЕСЯЦ. DIMF BTFSC FLAG1,2 i :ЕСЛИ ЗНАК УЖЕ УСТАНОВЛЕН, RETURN :ВОЗВРАЩАЕМСЯ. BSF FLAG1,2 , ;ИНАЧЕ УСТАНОВИМ ФЛАГ. MOVWF RETURN DAYZ ;ПЕРЕПИШЕМ ЗНАЧЕНИЕ В СЧЕТЧИК. DIMA9 BTFSC FLAG1,O /ЕСЛИ ФЛАГ УСТАНОВЛЕН, RETURN ;ВЕРНЕМСЯ. MOVLW .9 /ПРИБАВИМ ЧИСЛА ДО КОНЦА ADDWF DAYZ,1 /МЕСЯЦА. CLRF MON /УСТАНОВИМ BSF MON, 0 /ЯНВАРЬ. BSF RETURN FLAG1,0 /ФЛАГ ВЫПОЛНЕННОГО СРАВНЕНИЯ УСТАНОВЛЕН. DIMA12 BCF STATUS,0 MOVFW DAYO /СРАВНИМ НУЛЕВОЙ ДЕНЬ С ТЕКУЩИМ. SUBWF 'dayi,0 BC DIMAP /ЕСЛИ БОЛЬШЕ ИЛИ РАВНО, СТАВИМ ФЛАГ ПЛЮСА GOTO DIMAM /ИНАЧЕ СТАВИМ ФЛАГ МИНУСА. DIMAP MOVWF DAYZ /ОСТАТОК ДНЕЙ В РЕГИСТР СЧЕТЧИКА ДНЕЙ. BCF FLAG1,2 /ФЛАГ МИНУСА СБРОСИМ. BSF RETURN FLAG1,1 /УСТАНОВИМ ФЛАГ РАВЕНСТВА МЕСЯЦА. DIMAM ADDLW 0B7H /183 MOVWF DAYZ /ОСТАТОК В СЧЕТЧИК ДНЕЙ. BSF FLAG1,2 /ЗНАК ОТРИЦАТЕЛЬНЫЙ. BSF RETURN FLAG1,1 /УСТАНОВИМ ФЛАГ РАВЕНСТВА МЕСЯЦА. DUMOO BTFSC FLAG1,1 /ЕСЛИ ФЛАГ УСТАНЕОВЛЕН, RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ РАВЕНСТВА МЕСЯЦА. MOVFW DAYI /ПРИБАВИМ ТЕКУЩИЙ ДЕНЬ ADDWF DAYZ,1 /К СЧЕТЧИКУ ДНЕЙ. MOVLW .183 /ПРОШЛО ПОЛГОДА? SUBWF SKPC RETURN DAYZ,0 t /НЕТ MOVWF DAYZ /ДА, ОБНУЛИМ СЧЕТЧИК ДНЕЙ. BTFSC FLAG1,2 /ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ, BCF FLAG1,2 /СБРОСИМ ЕГО. BTFSS FLAG1,2 /И НАОБОРОТ - УСТАНОВИМ. BSF RETURN FLAG1,2 /ЗНАК ПОПРАВКИ ОТРИЦАТЕЛЬНЫЙ. 142
Автомат включения освещения ; б. ТАБЛИЦА ДНЕЙ МЕСЯЦЕВ. DAYMON ADDWF PCL,F NOP ;0 RETLW .31 /1-ЯНВАРЬ RETLW .29 ;2-ФЕВРАЛЬ RETLW .31 /3-МАРТ RETLW .30 ;4-АПРЕЛЬ RETLW .31 ;5-МАЙ RETLW .30 ;6-ИЮНЬ RETLW .31 ; 7-ИЮЛЬ RETLW .31 ;8-АВГУСТ RETLW .30 ;9-СЕНТЯБРЬ RETLW .31 ;10-ОКТЯБРЬ RETLW .30 ;11-НОЯБРЬ RETLW .31 ;12-ДЕКАБРЬ / 7. ВЫБОР РАЗРЯДА УСТАНОВКИ. UST MOVFW CAT /ПО ПОЛОЖЕНИЮ МИГАЮЩЕГО РАЗРЯДА ADDWF PC, 1 /ОПРЕДЕЛЯЕМ РАЗРЯД УСТАНОВКИ. GOTO USTO ;0 GOTO UST1 /1 GOTO UST2 /2 GOTO UST3 /3 GOTO OOOO ;ОБНУЛЕНИЕ. RETURN ; 8. ВЫБОР РЕЖИМА УСТАНОВКИ. АТТК INCF ATT, F /УВЕЛИЧИВАЕМ ЧИСЛО АТРИБУТА. MOVFW ATT SUBLW .5 /ИНДИКАЦИЯ РАЗРЕШЕНА ДО 4 ЦИФРЫ (0-4) SKPNZ /ЕСЛИ НЕ РАВНО НУЛЮ ИДЕМ, CLRF ATT /ИНАЧЕ ОБНУЛЯЕМ АТРИБУТ. ATKU MOVFW ATT /КУДА ПОЙТИ ПРИ ADDWF PCL, 1 /УСТАНОВКЕ: GOTO VETSH /ВЕЧЕРНЯЯ ПОПРАВКА. GOTO FIKS ;ВРЕМЯ ВЫКЛЮЧЕНИЯ. GOTO DAMON /ДЕНЬ И МЕСЯЦ. GOTO UTRO /УТРЕННЯЯ ПОПРАВКА. GOTO HOMI /УСТАНОВКА ЧАСОВ. ; 9. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP f 143
Устройства с цифровой индикацией MOVFW FSR /FSR. MOVWF FSR TEMP 9 * CALL SI ; D1UI ; M1M BTFSC PORTB,7 /ВКЛЮЧЕНА УСТАНОВКА (ВКЛЮЧЕНИЕ НУЛЕМ)? GOTO RETCONT ; НЕТ. BSF STATUS,RPO /БАНК 1. MOVLW B'00010000' /RA4 РАЗРЕШАЕМ ВХОД НА ВРЕМЯ ПРЕРЫВАНИЯ. MOVWF TRISAA80H MOVLW B'10000110 /РАЗРЕШАЕМ ВХОДА НА ВРЕМЯ ПРЕРЫВАНИЯ (В1, В2, В7) MOVWF TRISBA80H BCF STATUS,RPO /БАНК 0. CALL RETCONT KEY /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ BTFSS FLAG,1 9 BSF PORTB,4 1 BTFSC FLAG,1 9 BSF PORTB,3 BSF STATUS,RPO /1 БАНК. MOVLW B'10000000 ' /ВСЕ ВЫХОДЫ, В7- ВХОД. MOVWF TRISBA80H MOVLW B'00000000' /ВСЕ ВЫХОДЫ. MOVWF TRISAA80H BCF STATUS,RPO /БАНК 0. BCF INTCON,2 /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА /(РАЗРЕШАЕМ ПРЕРЫВАНИЯ). .. MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ MOVWF STATUS /РЕГИСТРОВ W И STATUS, MOVFW FSR_TEMP ;FSR. MOVWF FSR 9 MOVFW W_TEMP RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. 10. ПЕРЕЗАПИСЬ ИЗ РЕГИСТРОВ ИНДИКАЦИИ. VETSHI MOVFW SCO /РЕГИСТРЫ ВЕЧЕРНЕЙ ПОПРАВКИ. MOVWF POPVO 9 MOVFW SCI 9 MOVWF POPV1 CALL DECBIN ;ПРЕОБРАЗОВАНИЕ ДЕСЯТКОВ. ADDWF POPVO,0 MOVWF POPVL /МИНУТЫ ПОПРАВКИ. MOVFW SC2 9 MOVWF POPV2 9 MOVFW SC3 MOVWF POPV3 /ЗНАК ПОПРАВКИ. RETURN FIKSI BSF FLAG,.O /УСТАНОВКА ФЛАГА. MQVFW SCO /ФИКСИРОВАННОЕ ВРЕМЯ ВЫКЛЮЧЕНИЯ MOVWF FIK0 9 * 144
Автомат включения освещения MOVFW SCI f MOVWF FIK1 CALL DECBIN ;СУММИРОВАНИЕ- МИНУТ ADDWF FIKO,0 MOVWF FIKM /В ОДНОМ РЕГИСТРЕ МИНУТ. MOVFW SC2 Z MOVWF FIK2 z MOVFW SC3 MOVWF - FIK3 /СУММИРОВАНИЕ ЧАСОВ CALL DECBIN Z ADDWF FIK2,0 MOVWF FIKH /В РЕГИСТРЕ ЧАСОВ. RETURN DAMONI MOVFW SCO /ДЕНЬ И МЕСЯЦ. MOVWF MON IL Z MOVFW SCI MOVWF MON1H /ДЕСЯТКИ МЕСЯЦА. CALL DECBIN ADDWF MONIL,0 /ЕДИНИЦЫ МЕСЯЦА. MOVWF MON1 /СЧЕТНЫЙ МЕСЯЦ. CALL MO1U Z MOVFW SC2 Z MOVWF DAY IL Z MOVFW SC3 Z MOVWF DAY1H • 1 -г CALL DECBIN Z ADDWF DAY1L,0 MOVWF DAYI /СЧЕТНЫЙ ДЕНЬ CALL D1U /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ. CALL DAMON /ПЕРЕПИШЕМ ЗНАЧЕНИЯ В РЕГИСТРЫ ИНДИКАЦИИ. CLRF RETURN FLAG1 /ПОСЛЕ УСТАНОВКИ ТРЕБУЕТСЯ ПЕРЕРАСЧЕТ ПОПРАВОК UTROI BCF FLAG,0 /УТРЕННЯЯ ПОПРАВКА. MOVFW SCO t 7 MOVWF POPUO г MOVFW SCI f MOVWF POPU1 Z CALL DECBIN Z ADDWF POPUO,0 MOVWF POPUL /МИНУТЫ УТРЕННЕЙ ПОПРАВКИ. MOVFW SC2 Z MOVWF POPU2 Z MOVFW SC3 MOVWF RETURN POPU3 /ЗНАК ПОПРАВКИ. HOMII MOVFW SCO* /МИНУТЫ И ЧАСЫ. MOVWF M_LOW Z MOVFW SCI Z MOVWF M_HIGH Z 145
Устройства с цифровой индикацией CALL DECBIN / ADDWF M_LOW,0 MOVWF MINI ;МИНУТЫ- ЕДИНИЦЫ И ДЕСЯТКИ MOVFW SC2 t MOVWF H_LOW 9 MOVFW SC3 f MOVWF H_HIGH 9 CALL DECBIN 9 ADDWF H_LOW,0 mOvwf HOU1 /ЧАСЫ- ЕДИНИЦЫ И ДЕСЯТКИ. RETURN ; 11. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. KEY BTFSS PORTB,1 /ВКЛЮЧЕН ЛИ ВЫБОР РЕЖИМА УСТАНОВКИ? CALL ATTK /ДА. BTFSC PORTB,1 /ЕСЛИ ВЫКЛЮЧЕН ВЫБОР РЕЖИМА, CALL ATKU /ПОМЕНЯЕМ ЗНАЧЕНИЯ. BTFSS PORTB,2 /ВЫБОР РАЗРЯДА УСТАНОВКИ? CALL CATK /ДА. BTFSS PORTA,4 /УСТАНОВКА +1? CALL UST /ДА. BTFSS PORTA,4 9 RETURN BTFSC FLAG1,1 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, RETURN /ЗАВЕРШАЕМ. KEYU CLRF FLAG1 /СБРОСИМ ФЛАГ CLRF DAYZ /И СЧЕТНЫЕ ДНИ. CALL DUMA /ПОДСЧИТАЕМ ЧИСЛО ДНЕЙ. CALL ZET /ПОДСЧИТАЕМ ПОПРАВКИ. CALL OBSAK /ПОДСЧИТАЕМ ВРЕМЯ ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ RETURN • ; 12. ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАЮЩЕГО РАЗРЯДА). САТК INCF CAT, 1 /+1 В СЧЕТЧИК УСТАНОВКИ. MOVFW CAT SUBLW SKPNZ .5 /НЕ БОЛЕЕ 4, ИНАЧЕ ИДЕМ ОБНУЛЯТЬ CLRF RETURN CAT /ОБНУЛЕНИЕ. 9 / 13. ЗАПИСЬ ИЗ РЕГИСТРОВ В РЕГИСТРЫ ИНДИКАЦИИ. VETSH MOVFW POPVO /ВЕЧЕРНЯЯ ПОПРАВКА MOVWF SCO MOVFW POPV1 MOVWF SCI 146
Автомат включения освещения MOVFW POPV2 MOVWF SC2 MOVFW POPV3 MOVWF SC3 RETURN FIKS MOVFW FIKO / ФИКСИРОВАННОЕ ВРЕМЯ ВЫКЛЮЧЕНИЯ. MOVWF SCO MOVFW FIK1 MOVWF SCI MOVFW FIK2 MOVWF SC2 MOVFW FIK3 MOVWF SC3 RETURN DAMON CALL D1U /ПЕРЕКОДИРОВКА ДНЕЙ ДЛЯ ИНДИКАЦИИ. CALL MO1U /ПЕРЕКОДИРОВКА МЕСЯЦА ДЛЯ ИНДИКАЦИИ MOVFW MONIL MOVWF SCO MOVFW MON1H MOVWF SCI MOVFW DAY1L MOVWF SC2 MOVFW DAY1H MOVWF SC3 RETURN UTRO MOVFW POPUO /УТРЕННЯЯ ПОПРАВКА. MOVWF SCO MOVFW POPU1 MOVWF SCI MOVFW POPU2 MOVWF SC2 MOVFW POPU3 MOVWF SC3 RETURN HOMI MOVFW M_LOW /МИНУТЫ И ЧАСЫ. MOVWF SCO MOVFW M_HIGH MOVWF SCI MOVFW H_LOW MOVWF SC2 MOVFW H_HIGH MOVWF SC3 RETURN • ЖЖ88вЗЖ«ЗЖ«383ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ / 14. УСТАНОВОКА. • «зхзжжжжжжжвзжжжжжжжжжжжжжжжжжжжжжжж UST0 MOVLW .2 /ЕСЛИ УСТАНАВЛИВАЕТСЯ SUBWF АТТ,О /МЕСЯЦ, BZ USTOA /ТО УСТАНОВКА В ОДНОМ РАЗРЯДЕ. 147
Устройства с цифровой индикацией INCF MOVLW SUBWF BTFSC CLRF GOTO SCO, 1 .10 SCO, 0 STATUS,0 SCO UST4 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9.. 9 /С (ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. /НА ЗАПИСЬ В РЕГИСТРЫ. USTOA INCF SCO, 1 ;РАЗРЯД'УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF SCO, 0 BTFSC STATUS,0 ;С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. BSF SCI, 0 /УСТАНОВИМ ДЕСЯТКИ МЕСЯЦА. BTFSC STATUS,0 CLRF SCO /ЕДИНИЦЫ ОБНУЛИМ. GOTO UST4 /НА ЗАПИСЬ В РЕГИСТРЫ МЕСЯЦА. UST1 INCF SCI, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. . MOVLW .10 9 SUBWF SCI, 0 9 BTFSC STATUS,0 9 CLRF SCI GOTO UST4 /НА ЗАПИСЬ В РЕГИСТРЫ. UST2 INCF SC2, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF SC2, 0 9 BTFSC STATUS,0 9 CLRF SC2 GOTO UST4 /НА ЗАПИСЬ В РЕГИСТРЫ. UST3 INCF SC3, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF SC3, 0 9 BTFSC STATUS,0 9 CLRF SC3 GOTO UST4 , /НА ЗАПИСЬ В РЕГИСТРЫ. 0000 BTFSC PORTA,4 /ОБНУЛЕНИЕ ВСЕХ GOTO UST4 /РЕГИСТРОВ. BTFSC ATT, 2 /ЕСЛИ ИДЕТ СБРОС ЧАСОВ, CLRF SEC1 /ТО ОБНУЛЯЕМ СЕКУНДЫ BTFSC ATT, 2 /И МИНУТЫ. GOTO OOOS 9 CLRF SC2 CLRF SC3 000S CLRF SCO CLRF SCI GOTO UST4 /НА ЗАПИСЬ В РЕГИСТРЫ. ; 15. ПП. ИНДИКАЦИИ С ВЫХОДОМ 0-7 ; 0-3. ZIKL0 BTFSC PORTB,7 /ИНДИКАЦИИ НЕТ ЕСЛИ ИДЕТ УСТАНОВКА. GOTO KRUG /РАБОТА ПО КРУГУ С ПРОВЕРКОЙ СОВПАДЕНИЙ 148
Автомат включения освещения BSF INTCON,7 ;ЧТОБЫ HE ПРОПУСТИТЬ ПРЕРЫВАНИЯ. MOVLW B'lllOlllO' ; ЗАПИСЬ. НУЛЕВОГО КАТОДА. MOVWF ANOD /ПОЗИЦИОННОЕ ЗНАЧЕНИЕ КАТОДА. CLRF KATOD /ОБНУЛЯЕМ КАТОД 2-10. MOVLW 012H- /ЗАПИСЬ НОМЕРА РЕГИСТРА НУЛЕВОГО РАЗРЯДА. MOVWF SEGD /В РЕРИСТР АДРЕСА РАЗРЯДА. GOTO ZIKL COUZ INCF COUZ KATOD,1 /+1 В РЕГИСТР КАТОДА. INCF COUI,1 /+1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. MOVLW .50 /50- ДЛЯ ОРГАНИЗАЦИИ МИГАНИЯ SUBWF COUI,0 /ВЫБРАННОГО РАЗРЯДА. BNZ COUZ3 /ЕСЛИ НЕ РАВНО 0, ИДЕМ.' COUZ1 CLRF COUI /ОБНУЛИМ СЧЕТЧИК ЦИКЛОВ. BTFSC FLAG,2 /ПРОПУСТИТЬ, ЕСЛИ 0, GOTO' COUZ2 /ИНАЧЕ МЕНЯЕМ ЗНАЧЕНИЕ ФЛАГА НА ПРОТИВОПОЛОЖНОЕ BSF FLAG,2 /УСТАНОВИМ В 1. GOTO COUZ3 Г COUZ2 BCF FLAG,2 /СБРОСИМ ФЛАГ ГАШЕНИЯ В 0. GOTO INDCO /НА ИНДИКАЦИЮ. COUZ3 BTFSS FLAG, 2, /ПРОПУСТИТЬ, ЕСЛИ 1. GOTO INDCO /НА ИНДИКАЦИЮ. MOVFW KATOD /СРАВНИМ НОМЕР КАТОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT, 0 /РАЗРЯДА МИГАНИЯ. BNZ INDCO /ПЕРЕХОД ЕСЛИ НЕ НОЛЬ. INDCG MOVLW B'11111' /ИНАЧЕ ГАСИМ ВСЕ КАТОДЫ MOVWF PORTA /И ИДЕМ МЕНЯТЬ ЗНАЧЕНИЕ GOTO INDC1 /СЕГМЕНТОВ -(РАЗРЯД ПОГАШЕН). INDCO MOVFW KATOD /ЕСЛИ РАЗРЯДЫ СОВПАДАЮТ, SUBWF SKPNZ ATT, 0 /\ /ИДЕМ СВЕТИТЬ С ЗАПЯТОЙ. BSF FLAG,5 /ФЛАГ ЗАПЯТОЙ. GDATA MOVFW SEGD /ЗАГРУЖАЕМ АДРЕС РЕГИСТРА ДЛЯ ИНДИКАЦИИ MOVWF FSR /В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. MOVFW INDF /ВЫБИРАЕМ 2-10 ЗНАЧЕНИЕ. CALL SEGDATA /ПРЕОБРАЗУЕМ В СЕМИСЕГМЕНТНОЕ ДЛЯ ИНДИКАЦИИ MOVWF PORTB /В ПОРТУ в. MOVFW ANOD /ЗНАЧЕНИЯ КАТОДА MOVWF PORTA /В ПОРТ А. BTFSC FLAG,5 /ЕСЛИ ЕСТЬ ЗАПЯТАЯ, BSF PORTA,4 /УСТАНОВИМ ЕЕ. BTFSS FLAG,5 /ИНАЧЕ BCF PORTA,4 /СБРОСИМ ЗАПЯТУЮ. BCF INDC1 FLAG,5 /СБРОСИМ ЗАПЯТУЮ. INCF SEGD, F ,-+1 В РЕГИСТР АДРЕСА РАЗРЯДА. MOVLW B'011101111 '/ЕСЛИ СВЕТИТСЯ КРАЙНИЙ РАЗРЯД, 149
Устройства с цифровой индикацией XORWF ANOD,0 ;TO НЕТ УСТАНОВКИ РАЗРЯДА "С" В 1 BTFSC STATUS,Z /ЕСЛИ 0, ПРОПУСКАЕМ. GOTO ZIKLO ;НАЧНЕМ ИНДИКАЦИЮ С НУЛЯ. INDO BSF STATUS,C /УСТАНОВИТЬ В 1.' RLF ANOD,1 ;СДВИГАЕМ ВЛЕВО. GOTO ZIKL Г KRUG MOVLW OFFH t MOVWF PORTA BTFSS PORTB,7 /ПРИ ВКЛЮЧЕНИИ УСТАНОВКИ GOTO ZIKLO /ИДЕМ НА ИНДИКАЦИЮ. CALL ITOG /ПРОВЕРЯЕМ СОВПАДЕНИЕ. GOTO KRUG ;ЗАЦИКЛИВАЕМСЯ. ; 16. НАХОЖДЕНИЕ ПОПРАВКИ НА РАСЧЕТНЫЙ ДЕНЬ. ZET CLRF SUMU /ОБНУЛИМ CLRF SUMB /РАБОЧИЕ CLRF DAY /РЕГИСТРЫ.’ BTFSS FLAG1,2 /ЕСЛИ ЗНАК ПОЛОЖИТЕЛЬНЫЙ,. GOTO ZETO /НАЧНЕМ С НУЛЯ. MOVLW .183 /ИНАЧЕ MOVWF DAY /ОПРЕДЕЛИМ NEGF DAYZ,0 /ДОПОЛНИТЕЛЬНЫЙ КОД СУММЫ ДНЕЙ. ADDWF DAY, 0 /НАЙДЕМ ДОПОЛНЕНИЕ ДО 182. MOVWF DAYZ /ЗАПИШЕМ В СЧЕТНЫЕ ДНИ. ZETO CALL DELTA /ОПРЕДЕЛИМ ПОПРАВКУ НА ДЕНЬ. CLRF PCLATH /обнулим Старший бит счетчика команд. MOVWF DATAU /ПЕРЕПИШЕМ ЗНАЧЕНИЯ 1 MOVWF DATAV /В ОБА РЕГИСТРА. MOVLW B'OOOOllll' /ЗАМАСКИРУЕМ МЛАДШИЕ БИТЫ. ANDWF DATAV,1 /ЗНАЧЕНИЕ ПИШЕМ В РЕГИСТР ВЕЧЕРНЕЙ ПОПРАВКИ MOVLW B'11110000' /ЗАМАСКИРУЕМ СТАРШИЕ БИТЫ. ANDWF DATAU,1 /ЗАПИШЕМ В РЕГИСТР УТРЕННЕЙ ПОПРАВКИ. SWAPF DATAU,1 /ПОМЕНЯЕМ МЕСТАМИ ПОЛУБАЙТЫ. MOVFW DATAU /ПРИБАВИМ УТРЕННЮЮ ПОПРАВКУ ADDWF SUMU,1 /К ОБЩЕЙ СУММЕ. SKPNC BSF FLAG1,6 /ЕСЛИ ПРОИЗОШЛО ПЕРЕПОЛНЕНИЕ РЕГИСТРА, /УСТАНОВИМ ФЛАГ (256). MOVFW DATAV /ПРИБАВИМ ВЕЧЕРНЮЮ ПОПРАВКУ ADDWF SUMB,1 /К ОБЩЕЙ СУММЕ. SKPNC /ЕСЛИ ПРОИЗОШЛО ПЕРЕПОЛНЕНИЕ РЕГИСТРА, BSF FLAG1,7 f /УСТАНОВИМ ФЛАГ (256). MOVFW DAYZ /СРАВНИМ ЗНАЧЕНИЕ РАСЧИТАННОГО ДНЯ SUBWF DAY, 0 /СО СЧЕТНЫМ. SKPNZ RETURN /ЕСЛИ ОНИ НЕ РАВНЫ, /ТО, В ЗАВИСИМОСТИ ОТ ЗНАКА, BTFSC FLAG1,2 /УМЕНЬШИМ DECF DAY, 1 BTFSS FLAG1,2 /ИЛИ УВЕЛИЧИМ INCF DAY, 1 /РАССЧЕТНЫЙ ДЕНЬ. GOTO ZETO /ПОВТОРИМ ЦИКЛ. 150
Автомат включения освещения / 17. СЧЕТЧИКИ С. М. Ч. Д. МЕСЯЦЕВ. S1 MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,F /ПРИБАВИТЬ 1 В СЕКУНДЫ. RETURN 9 ' Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. М1М MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW- -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MIN1,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /MINI >W. M1U MOVWF DSMH /W >DSMH. ' CALL BINDECH /ПЕРЕХОД В-ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF M LOW /W > M LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF M_HIGH /W > M_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ. CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH /И МП. RETURN 9 Hl CLRF MINI /ОБНУЛЯЕМ РЕГИСТР МИНУТ. CLRF M_LOW /ОБНУЛЯЕМ ЕДИНИЦЫ МИНУТ. CLRF M HIGH /ОБНУЛЯЕМ ДЕСЯТКИ МИНУТ. HIH MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H ,•- 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. MOVFW HOU1 /HOU >W. H1U MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF H LOW ,-W > Н LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF H_HIGH ,-W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH /И МП. RETURN 9 НЮ CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF H LOW /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF H_HIGH „ /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. D1UI MOVFW MON1 CALL DAYMON /СКОЛЬКО ДНЕЙ В МЕСЯЦЕ? 151
Устройства с цифровой индикацией SUBWF DAYI,0 /УЖЕ КОНЕЦ МЕСЯЦА? ВС DOI /ДА. ИДЕМ УСТАНАВЛИВАТЬ. INCF DAYI,F ;НЕТ. +1 К ЧИСЛАМ. - D1U MOVFW DAYI /ПЕРЕКОДИРОВКА ДНЕЙ НА ДЕСЯТКИ И ЕДИНИЦЫ. MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF DAY IL /W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF DAY1H /W >'h_high в регистр индикации десятков часов CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH /МЛ. BTFSS PORTB,7 /ЕСЛИ ИДЕТ УСТАНОВКА, RETURN /ВОЗВРАЩАЕМСЯ. BTFSC FLAG1,1 /ЕСЛИ СРАВНЕНИЕ ВЫПОЛНЕНО, INCF DAYZ,1 /УВЕЛИЧИМ СЧЕТНЫЙ ДЕНЬ. CALL KEYU /РАССЧИТАЕМ НОВЫЕ ЗНАЧЕНИЯ ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ. RETURN Г DOI MOVLW 01H /УСТАНОВКА В ЕДИНИЦУ. MOVWF DAYI /НУЛЕВОГО ЧИСЛА НЕТ. MOVWF DAY IL CLRF DAY1H /ОБНУЛЕНИЕ ДЕСЯТКОВ ДНЕЙ. INCF DAYZ,1 /УВЕЛИЧИМ СЧЕТНЫЙ ДЕНЬ. MO1U MOVFW MON1 /ПЕРЕКОДИРОВКА МЕСЯЦА НА ДЕСЯТКИ И ЕДИНИЦЫ. MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF MON IL /W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF MON1H /W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH BTFSC PORTB,7 /ЕСЛИ НЕТ УСТАНОВКИ, INCF MON, 1 /УВЕЛИЧИМ РАБОЧИЙ РЕГИСТР. BTFSC PORTB,7 /ЕСЛИ НЕТ'УСТАНОВКИ, GOTO MOD BCF STATUS,2 /НИЖЕ ВСЕ ДЛЯ УСТАНОВКИ. TSTF MON1 /ПРОТЕСТИРУЕМ НА НОЛЬ. BTFSC STATUS,2 /ЕСЛИ РАВНО НУЛЮ, ИДЕМ НА GOTO MOO /УСТАНОВКУ, НУЛЕВОГО МЕСЯЦА НЕТ. RETURN MOD MOVFW MON1 ADDLW -OCH /УЖЕ 12 МЕСЯЦЕВ? BC MOO ;ДА. INCF MON1,F /ТО +1 В МЕСЯЦ CALL KEYU /РАССЧИТАЕМ НОВЫЕ ЗНАЧЕНИЯ ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ. RETURN MOO MOVLW 01H /УСТАНОВИМ 1 МЕСЯЦ (0-НЕТ). 152
Автомат включения освещения MOVWF MON1 MOVWF MON CALL KEYU /РАССЧИТАЕМ НОВЫЕ ЗНАЧЕНИЯ ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ. RETURN • z:r:===x~=======================================x======x===== ; 18. ТАБЛИЦА ПОПРАВОК С 22.12 ПО 21.06. DELTA MOVLW HIGH 021B MOVWF PCLATH MOVFW DAY ADDWF PC, 1 RETLW OOH ;0 RETLW OOH ; 1 RETLW 01H ;2 RETLW' 01H ;3 RETLW OOH ;4 RETLW 01H ;5 RETLW 01H ; 6 RETLW 01H ;7 RETLW 01H ;8 RETLW 01H ;9 31.ДЕКАБРЯ. RETLW 02H ;10 RETLW 01H ;H RETLW 01H ;12 RETLW 11H ; 13 RETLW 12H ; 14 RETLW 11H ;15 RETLW 12H ;16 RETLW 01H ; 17 RETLW 12H ;18 RETLW UH ;19 RETLW 12H ;20 RETLW 12H RETLW 12H ;1 ДЕКАБРЯ. RETLW 11H RETLW 12H RETLW 12H RETLW 01H RETLW UH RETLW 12H RETLW 12H RETLW 12H ;30 RETLW 22H RETLW 12H RETLW 12H RETLW 12H RETLW 22H RETLW 22H RETLW 12H RETLW 22H RETLW 11H RETLW UH ;40 31 ЯНВАРЯ RETLW UH - 153
Устройства с цифровой индикацией RETLW 12H RETLW 12H RETLW 22H RETLW 22H RETLW 22H RETLW 23H RETLW 22H RETLW 22H RETLW 32H ;50 RETLW 22H RETLW 22H ;1 НОЯБРЯ. RETLW 23H RETLW 22H RETLW 22H RETLW OOH RETLW 21H RETLW 22H RETLW 33H RETLW 22H ;60 RETLW 22H RETLW 32H RETLW 22H RETLW 32H RETLW 22H RETLW 23H RETLW 32H RETLW 22H RETLW OOH RETLW 21H ;70 1 МАРТА RETLW 32H RETLW 22H RETLW 22H RETLW 32H RETLW 22H RETLW 32H RETLW 33H RETLW 22H RETLW 32H RETLW 22H ;80 RETLW 32H RETLW 22H RETLW 32H ;1 ОКТЯБРЯ. RETLW 32H RETLW 21H RETLW 22H RETLW 22H RETLW 32H RETLW 32H RETLW 22H ;90 RETLW 32H RETLW 22H RETLW 32H RETLW 32H RETLW 22H RETLW 32H 154
Автомат включения освещения RETLW 32H RETLW 32H RETLW 32H RETLW 32H ;100 RETLW 33H ;1 АПРЕЛЯ. RETLW 33H RETLW 22H RETLW 32H RETLW 22H RETLW 32H RETLW 32H RETLW 22H RETLW 32H RETLW 22H RETLW 32H RETLW 23H RETLW 32H ;110 1 СЕНТЯБРЯ RETLW 22H RETLW 32H RETLW 33H RETLW 32H RETLW 22H RETLW 32H RETLW 22H ;12 0 RETLW 32H RETLW 22 H RETLW 22H RETLW 32H RETLW 22H RETLW 32H RETLW 32H RETLW 32H RETLW 32H RETLW 32H ; 130 RETLW 33H ;1 МАЯ. RETLW 33H RETLW 23H RETLW 33H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H ;140 RETLW 22H RETLW 22H RETLW 22H RETLW 22H ;1 АВГУСТА RETLW 22H RETLW 23H RETLW 23H RETLW 22H RETLW 22H RETLW 22H ;150 RETLW 22H 155
Устройства с цифровой индикацией RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 22H /160 RETLW 22H RETLW 22H /1 ИЮНЯ. RETLW 22H RETLW 22H RETLW 22H RETLW 22H RETLW 12H RETLW 12H RETLW 11H RETLW 11H ;170 RETLW 10H RETLW UH RETLW 11H RETLW UH /1 ИЮЛЯ. RETLW UH RETLW 01H RETLW 01H RETLW 01H RETLW 01H RETLW 01H /180 RETLW 01H RETLW ООН /21 ИЮНЯ RETLW ООН /22 ИЮНЯ ; 19. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /БАНК 1. MOVLW B'00000100' /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, K=32 ...100. MOVWF OPTION_REGA80H MOVLW B' 10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА, MOVWF INTCON MOVLW B'00000000' /RA0-RA4-HA ВЫХОД. MOVWF TRISAA80H MOVLW. B'lOOOOOOO' /RB0-RB6-HA ВЫХОД, БВ7-ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /БАНК 0. CLRF TMR0 CLRF SEC1 CLRF MINI CLRF HOUl CLRF M_LOW CLRF M_HIGH CLRF H_LOW CLRF H_HIGH CLRF HSMH 156
Автомат включения освещения CLRF LSMH CLRF ATT CLRF MON CLRF DAYZ CLRF CAT CLRF FLAG CLRF FLAG1 CLRF POPUO CLRF POPU1 CLRF POPU2 CLRF POPU3 CLRF POPUL CLRF POPVO CLRF POPV1 CLRF POPV2 CLRF POPV3 CLRF POPVL CLRF FIKO CLRF FIK1 CLRF FIK2 CLRF FIK3 CLRF FIKM CLRF FIKH MOVLW .12 MOVWF MONO /МЕСЯЦ=12. MOVWF MON1 MOVLW .22 MOVWF DAYO /ЧИСЛО=22. MOVWF DAY1 GOTO ZIKLO ; 20. ПП. ПЕРЕКОДИРОВКИ 2-_-2-10. BINDECH MOVLW .10 /ПЕРЕКОДИРОВКА С БИНАРНОГО В 2-10 КОД /10 >W. BDH BSF STATUS,0 /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS. SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ. РЕГИСТРА 10 > DSMH. BNC BINDECL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH /ПОВТОРИТЬ. BINDECL MOVF DSMH,0 ADDLW .10 /Ю+W >W. MOVWF LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. RETURN / ; 21. ВЫЧИСЛЕНИЕ ОБЩЕЙ ПОПРАВКИ. OBSAK BTFSC FLAG1,2 ;ЕСЛИ ЗНАК ПОЛОЖИТЕЛЬНЫЙ, CALL POPIOty /ПРОПУСКАЕМ. BTFSS FLAG1,2 . /ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ, CALL POPDEK /ПРОПУСКАЕМ. 157
Устройства с цифровой индикацией BTFSC POPU3,0 ЗНАК УТРЕННЕЙ ПОПРАВКИ ОТРИЦАТЕЛЬНЫЙ, CALL NEGATU ИДЕМ. BTFSC POPV3,0 ЕСЛИ ЗНАК ВЕЧЕРНЕЙ ПОПРАВКИ-ПОЛОЖИТЕЛЬНЫЙ, CALL NEGATB ПРОПУСКАЕМ. BTFSS POPU3,0 ЗНАК УТРЕННЕЙ ПОПРАВКИ ПОЛОЖИТЕЛЬНЫЙ, CALL POLU ИДЕМ. BTFSS POPV3,0 ЕСЛИ ЗНАК ВЕЧЕРНЕЙ ПОПРАВКИ ПОЛОЖИТЕЛЬНЫЙ, CALL POLB ИДЕМ. GOTO POLUM СЧИТАЕМ ОБЩУЮ ПОПРАВКУ. POPION MOVLW .30 ЗАГРУЖАЕМ ВРЕМЯ ВОСХОДА И ЗАХОДА MOVWF UDEKM ЛЕТНЕГО НУЛЕВОГО ДНЯ MOVLW .32 MOVWF BDEKM 22 ИЮНЯ. MOVLW .10 MOVWF BDEKH MOVLW .14 MOVWF UDEKH RETURN POPDEK MOVLW .5 ЗАГРУЖАЕМ ВРЕМЯ ВОСХОДА И ЗАХОДА MOVWF BDEKH ЗИМНЕГО НУЛЕВОГО ДНЯ MOVLW .20 22 ДЕКАБРЯ. MOVWF UDEKH CLRF UDEKM CLRF BDEKM RETURN NEGATU MOVFW POPU2 УТРЕННЮЮ ОТРИЦАТЕЛЬНУЮ ПОПРАВКУ SUBWF UDEKH,0 ОТНИМАЕМ ОТ НУЛЕВОГО ДНЯ. MOVWF SUMUH /ЧАСЫ. MOVFW POPUL МИНУТЫ. BSF STATUS,0 SUBWF UDEKM,0 BTFSC STATUS,0 MOVWF SUMUL • BTFSC STATUS,0 RETURN MOVLW .60 /ЕСЛИ НУЖНО, ADDWF UDEKM,0 /ТО ДЕЛАЕМ MOVWF SUMUL ; ЗАЕМ MOVFW POPUL /ИЗ SUBWF SUMUL,1 ;РАЗРЯДА DECF SUMUH,1 ;ЧАСОВ. RETURN NEGATE BSF STATUS,0 /ВЕЧЕРНЮЮ ОТРИЦАТЕЛЬНУЮ MOVFW POPV2 /ПОПРАВКУ SUBWF BDEKH,0 /ОТНИМАЕМ .BTFSS STATUS,0 /ОТ НУЛЕВОГО ДНЯ. CALL NEGB24 /ЕСЛИ НАДО, ДОБАВИМ 24 ЧАСА. MOVWF SUMBH /ЧАСЫ. MOVFW POPVL /МИНУТЫ. 158
Автомат включения освещения BSF STATUS,0 9 - SUBWF BDEKM,0 9 BTFSC STATUS,0 9 ‘ MOVWF SUMBL 9 BTFSC RETURN STATUS,0 9 MOVLW .60 ;ДЕЛАЕМ ADDWF BDEKM,0 ; ЗАЕМ MOVWF SUMBL /ИЗ MOVFW POPVL /РАЗРЯДА SUBWF SUMBL,1 ;ЧАСОВ. DECF RETURN SUMBH,1 Г NEGB24 MOVLW .24 /ДЛЯ КОРРЕКТНОСТИ. ADDWF BDEKH,0 /ПРИБАВИМ 24 ЧАСА MOVWF SUMBH MOVFW POPV2 /И СНОВА SUBWF RETURN SUMBH,0 /ВЫЧТЕМ. POLU MOVFW UDEKH /ПРИБАВИМ УТРЕННЮЮ ПОПРАВКУ ADDWF POPU2,0 /В ЧАСАХ К НУЛЕВОМУ ДНЮ. MOVWF SUMUH /В ОБЩИЙ РЕГИСТР ПОПРАВОК. MOVFW UDEKM /АНАЛОГИЧНО ПРИБАВИМ ADDWF POPUL,0 /И МИНУТЫ. MOVWF RETURN SUMUL 9 POLB MOVFW BDEKH /ПОВТОРИМ ВСЕ С ВЕЧЕРНЕЙ ADDWF POPV2,0 /ПОПРАВКОЙ. > MOVWF SUMBH 9 MOVFW BDEKM г ADDWF POPVL,0 9 MOVWF RETURN SUMBL 9 ; 22. ВРЕМЯ ВКЛЮЧЕНИЯ - . ВЫКЛЮЧЕНИЯ. POLUM CLRF UM /ОБНУЛИМ CLRF UH ;РАБОЧИЕ CLRF BM /РЕГИСТРЫ. GLRF BH 9 CALL HDECU 9 CALL HDECB BTFSC FLAG1,2 /ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ, CALL NEGBM /ТО ИДЕМ. BTFSS FLAG1,2 /ЕСЛИ ЗНАК ПОЛОЖИТЕЛЬНЫЙ, CALL RETURN POLSUM /ТО ИДЕМ. HDECU BSF STATUS,0 9 159
Устройства с цифровой индикацией MOVLW .60 /ПРЕОБРАЗУЕМ УТРЕННЮЮ ОБЩУЮ SUBWF SUMU,1 /ПОПРАВКУ В МИНУТАХ BTFSC STATUS,0 /В ЧАСЫ И МИНУТЫ. INCF UH, 1 9 , BTFSC STATUS,0 г GOTO HDECU г BTFSS FLAG1,6 г GOTO HDCU г BCF FLAG1,6 9 INCF UH, 1 9 GOTO HDECU 9 HDCU MOVLW .60 9 ADDWF SUMU,0 9 MOVWF UM 9 RETURN HDECB BSF STATUS,0 MOVLW .60 /ПРЕОБРАЗУЕМ ВЕЧЕРНЮЮ ОБЩУЮ SUBWF SUMB,1 /ПОПРАВКУ В МИНУТАХ BTFSC STATUS,0 /В ЧАСЫ И МИНУТЫ. INCF BH, 1 9 BTFSC STATUS,0 9 GOTO HDECB 9 BTFSS FLAG1,7 9 GOTO HDCB 9 BCF FLAG1,7 9 INCF BH, 1 9 GOTO HDECB 9 HDCB MOVLW .60 9 ADDWF SUMB,0 9 MOVWF BM 9 RETURN POLSUM MOVFW UH /ПРИ ПОЛОЖИТЕЛЬНОМ ЗНАКЕ УТРЕННЯЯ SUBWF SUMUH,1 /ПОПРАВКА ВЫЧИТАЕТСЯ MOVFW UM /ИЗ ОБЩЕЙ СУММЫ. BSF STATUS,0 9 SUBWF SUMUL,1 9 BTFSC STATUS,0 9 GOTO POLBM 9 MOVLW .60 9 ADDWF SUMUL,1 9 DECF SUMUH,1 9 POLBM MOVFW BH /ВЕЧЕРНЯЯ ПОПРАВКА ADDWF SUMBH,1 /ПРИБАВЛЯЕТСЯ MOVFW BM /К ОБЩЕЙ ADDWF SUMBL,1 /СУММЕ. PLBM MOVLW .60 /ПРИ ПЕРЕПОЛНЕНИИ BSF STATUS,0 /УВЕЛИЧИВАЕМ SUBWF SUMBL,1 /РЕГИСТР BTFSC STATUS,0 /ЧАСОВ. 160
Автомат включения освещения INCF SUMBH,1 9 BTFSC STATUS,0 9 GOTO PLBM 9 MOVLW .60 9 ADDWF SUMBL,1 9 RETURN NEGBM MOVFW BH /ПРИ ОТРИЦАТЕЛЬНОМ ЗНАКЕ SUBWF SUMBH,1 ;ВЕЧЕРНЯЯ ПОПРАВКА ВЫЧИТАЕТСЯ MOVFW BM /ИЗ. BSF STATUS,0 9 SUBWF SUMBL,1 9 »BTFSC STATUS,0 GOTO NEGUM /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ. MOVLW . 60 /ЕСЛИ ЕСТЬ, ТО УМЕНЬШИМ ADDWF SUMBL,1 /РЕГИСТР DECF SUMBH,1 /ЧАСОВ. GOTO NEGO 9 NEGUM BTFSC STATUS,0 9 CALL PLBM 9 NEGO MOVFW UH /УТРЕННЯЯ ПОПРАВКА ADDWF SUMUH,1 /ПРИБАВЛЯЕТСЯ. MOVFW UM / ADDWF SUMUL,1 / NGUM MOVLW .60 /ПРОВЕРКА НА ПЕРЕПОЛНЕНИЕ BSF STATUS,0 SUBWF SUMUL,1 /РЕГИСТРА МИНУТ. BTFSC STATUS,0 9 INCF SUMUH,1 9 BTFSC STATUS,0 9 GOTO NGUM 9 MOVLW .60 9 ADDWF SUMUL,1 9 RETURN ; 23. СРАВНЕНИЕ С РЕАЛЬНЫМ ВРЕМЕНЕМ. ITOG ' BTFSC FLAG,0 /ЕСЛИ УСТАНОВЛЕН ФЛАГ ФИКСИРОВАННОГО GOTO FITOG /ВЫКЛЮЧЕНИЯ ИДЕМ ТУДА. MOVFW SUMUH /СРАВНИМ РАСЧЕТНОЕ УТРЕННЕЕ ВРЕМЯ SUBWF HOU1,0 /ЧАСОВ С РЕАЛЬНЫМ ВРЕМЕНЕМ. SKPZ /ЕСЛИ ОНИ НЕ СОВПАДАЮТ, GOTO ITOGB /ПРОВЕРИМ ВЕЧЕРНЕЕ ВРЕМЯ. MOVFW SUMUL /ИНАЧЕ СРАВНИМ МИНУТЫ. BCF STATUS,2 SUBWF MINI,0 /ЕСЛИ И ОНИ СОВПАДАЮТ, BZ RETURN WUXODU /ПЕРЕКЛЮЧИМ ВЫХОДЫ. FITOG MOVFW FIKH /СРАВНИМ ФИКСИРОВАННОЕ ВРЕ}МЯ SUBWF HOU1,0 /ВЫКЛЮЧЕНИЯ С РЕАЛЬНЫМ ВРЕМЕНЕМ. 6 Зак. 2418 161
Устройства с цифровой индикацией SKPZ GOTO ITOGB ;ЕСЛИ ОНИ HE СОВПАДАЮТ, /ПРОВЕРИМ ВЕЧЕРНЕЕ ВРЕМЯ. MOVFW FI KM f BCF STATUS,2 SUBWF MINI,0 BZ WUXODU /ПЕРЕКЛЮЧИМ ВЫХОДЫ. RETURN ITOGB MOVFW SUMBH /ПРОВЕРИМ НА СОВПАДЕНИЕ SUBWF HOUl,0 /ВРЕМЯ ВКЛЮЧЕНИЯ ОСВЕЩЕНИЯ. SKPZ Г RETURN MOVFW SUMBL f BCF STATUS,2 SUBWF MINI,0 BZ WUXODB /ПЕРЕКЛЮЧИМ ВЫХОДЫ. RETURN WUXODU BCF PORTB,3 /ВЫКЛЮЧЕНИЕ ПРЯМОГО BSF PORTB,4 /И ВКЛЮЧЕНИЕ ИНВЕРСНОГО ВЫХОДОВ. BCF FLAG,1 /СБРОСИМ ФЛАГ. СОСТОЯНИЯ ВЫХОДА. RETURN WUXODB BSF PORTB,3 / ВКЛЮЧЕНИЕ ПРЯМОГО ‘ BCF PORTB,4 /И ВЫКЛЮЧЕНИЕ ИНВЕРСНОГО ВЫХОДОВ BSF , FLAG,1 /УСТАНОВИМ ФЛАГ СОСТОЯНИЯ ВЫХОДА RETURN END Счетчик витков Данное устройство разработано для применения в качестве счетчика витков при намотке трансформаторов. Устройство может быть использовано как вось- миразрядный низкочастотный счетчик с частотой счета до 15 кГц. Например, это может &Ить шагомер, велоодометр, или счетчик посетителей. При совпаде- нии установленного значения со счетным включается звуковая сигнализация. Счетчик реализован на двух микросхемах: микроконтроллере PIC16F84A, дешифраторе К555ИД7, блоке светодиодов АЛС318А и на трех мембранных кнопках установки. Алгоритм работы программы счетчика витков показан на рис. 36. После включения счетчика и обнуления рабочих регистров начинается ин- дикация первого разряда. Индикация всех разрядов идентична и состоит из за- грузки в рабочий регистр значения регистра индикации, установки в выходные регистры портов значений сегментов и разрядов и временной задержки Длите- льностью около 3 мс. Но в нулевом и первом разрядах происходит еще сравне- ние и проверка нажатых кнопок установки. После индикации нулевого разряда проверяется флаг установки. Если уста- новка не производится, процессор начинает сравнение всех разрядов индика- ции с нулем. Если все разряды индикации нулевые (счет еще не начинался или 162
Счетчик витков Рис. 36. Алгоритм работы программы счетчика витков 163
Устройства с цифровой индикацией после обнуления), звуковая сигнализация не производится и процессор идет выполнять выдержку времени, равную 3 мс. Если хотя бы один разряд индика- ции не равен нулю, производится сравнение регистров "установки и регистров индикации. Если нет равенства регистров, процессор возвращается на выпол- нение выдержки времени — 3 мс. Если есть совпадение, устанавливается флаг совпадения, а при индикации следующего разряда на выходе RA4 нулевым по- тенциалом включится зуммер. Индикация каждого разряда заканчивается вы- держкой времени. После индикации первого разряда производится проверка нажатых кнопок установки. Если установка уже производится, флаг установки включен, запре- щаются все прерывания (запрет счета). Проверяется кнопка выбора разряда. Если кнопка нажата, регистр выбора разряда инкрементируется. Аналогично проверяется кнопка установки и, если она нажата, прибавляется единица в выбранный разряд. Далее проверяется состояние кнопки выбора разряда. Если кнопка нажата, то не имеет значения за индикатором разряд или нет, все рав- но установка продолжится в следующих циклах. Поэтому, проверив кнопку обнуления, программа перейдет к отработке выдержки времени. Если кнопка выбора разряда не нажата, проверяется значение выбранного разряда. Если значение равно 8, ни один разряд не мигает, устанавливается флаг и разреша- ются прерывания. В режиме разрешения счета устройство может отреагиро- вать только на нажатие одной кнопки, кнопки обнуления. При обнулении, ес- ли разрешен счет, сбрасываются значения разрядов индикации и флагов счета и равенства. Поэтому после обнуления возможно перемещение мигающего разряда, при нажатии кнопки выбора разряда. Если идет установка, то обнуля- ются и разряды установки. Если флаг установки нулевой (установки нет), то разрешаются прерывания, проверяется нажатие кнопки обнуления и отрабатывается выдержка времени для первого разряда. После окончания выдержки времени седьмого разряда производится индикация нулевого разряда и весь цикл повторяется. В режиме счета разрешены прерывания по спаду сигнала на входе RB0. Прерывание возможно с любой точки программы, на на рис. 36 оно условно показано от индикации нулевого разряда. Как обычно, при прерывании проис- ходит сохранение значений регистров. Инкрементируется счетчик и восстанав- ливаются значения регистров. На рис. 37 показана схема счетчика витков. Выходы микроконтроллера DD2 RBI—RB13 используются для вывода значений сегментов индикатора. Выходы RAO—RA2 выдают значения разрядов в двоично-десятичном коде на дешифра- тор DD1. Выход RA4 включает зуммер' НСМ1206х. На выход RB0 подаются счетные импульсы. Срабатывание счетчика происходит по перепаду из высоко- го в низкий уровень ТТЛ. Это удобно для подключения герконового или кон- тактного датчика оборотов. Вход зашунтирован резисторами Rll, R 12 и кон- денсаторами С6, С7 для уменьшения влияния импульсов коммутации светоди- одов. Такое же назначение имеют и конденсаторы СЗ, С4. Если счетчик будет использоваться с малым уровнем помех по питанию или как цифровая шкала, то резисторы Rll, R12 можно не устанавливать. Печатная плата счетчика витков показана на рис. 38, а расположение эле- ментов на ней — рис. 39. 164
Счетчик витков Работать с устройством очень просто. После включения напряжения на ин- дикаторе высвечиваются нули, а нулевой разряд будет мигать. Кнопкой «Раз- ряд» выбирается необходимый разряд для установки значения количества вит- ков. Кнопкой «Установка» набирается необходимое число в данном разряде. Скорость перемещения мигающего разряда и установка осуществляются с час- тотой около одного герца. Если числа набраны неверно, можно сбросить все показания, нажав кнопку «Обнуление». После обнуления мигающий разряд не изменит своего положения. При выборе разряда переход от седьмого разряда к нулевому необходимо выполнять, не отрывая пальца от кнопки «Разряд». После выполнения установки кнопкой «Разряд» мигающий разряд убирается за преде- лы индикатора. После отпускания кнопки устройство переходит в режим счета. На индикаторе будут высвечиваться установленные значения, а, значит, счет- чик выдаст звуковой сигнал совпадения набранного и индицируемого значения. Это свидетельствует об исправности счетчика и звуковой сигнализации. После нажатия кнопки .«Обнуление» звуковой сигнал прекратится, а все разряды уста- новятся в ноль. Можно включать намоточный станок. При выборе датчика обо- ротов лучше использовать оптопару. Датчик на герконе прост, но на частоте вращения около 10 Гц (ручная «моталка» с редуктором 1:10) он «залипает». Проверить работоспособность устройства можно, если подключить вход IN к выводу 1 (RA2) микроконтроллера. Перейти в режим установки можно после обнуления показаний индикатора и смещения мигающего разряда в зону индикатора. При обнулении индикатора установочные значения не обнуляются. То есть если вам необходимо намотать одинаковое количество витков несколько раз, то делать установку не надо. 165
Устройству с цифровой индикацией 55 А И7! -5 В D Е F G SAI SA2 Рис. 38. Счетчик витков. Печаткная плата BF1 SA2 SAI G F Е D -5 В Рис. 39. Счетчик витков. Расположение элементов на плате Необходимо отметить, что совпадение и звуковая сигнализация происходят только на частоте до 150 Гц. На большей частоте подпрограмма сравнения не успевает отслеживать изменения в разрядах индикации. Увеличения частоты сравнения и счета в 2,5 раза можно добиться применением микроконтроллера с тактовой частотой 10 МГц (PIC16F84A-10I/P). При этом если необходима предварительная установка, потребуется увеличение разрядности счетчика установки (ведь частота установки тоже увеличится в 2,5 раза). Потребляемый ток при напряжении питания 5 В составляет 30 мА. Если вы будете использовать это устройство как цифровую шкалу с питанием от гальва- нических элементов, то потребляемый ток при напряжении питания 3 В соста- вит 10 мА. ; СЧЕТЧИК ВИТКОВ. МАКСИМАЛЬНАЯ ЧАСТОТА СЧЕТА ДО 15 КГЦ. ; 8 РАЗРЯДОВ ИНДИКАЦИИ С УСТАНОВКОЙ ЧИСЛА СОВПАДЕНИЯ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru 166
Счетчик витков ; ПРОГРАММА = SETSIK.ASM ; ВЕРСИЯ: 05-02-03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. 9 ♦include pl6f84a.inc CONFIG 3FF2H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 4,0 МГЦ. ; СПЕЦ РЕГИСТРЫ. INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H ; OPTION (RP0-1) . PC EQU 02H ;СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU • 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В.ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 8 6H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. SCO EQU 0CH /МЛАДШИЙ РАЗРЯД СЧЕТЧИКА. SCI EQU 0DH 9 SC2 EQU 0EH 9 SC3 EQU 0FH 9 SC4 EQU 10H 9 SC5 EQU 11H 9 SC6 EQU 12H SC7 EQU 13H ;СТАРШИЙ РАЗРЯД. CAT EQU 14H /ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАНИЯ) ANOD EQU 15H /КАТОД, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ(0-7). SEG EQU 16H /СЕГМЕНТЫ- COUI EQU 025H /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. В ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. FLAG EQU 17Н / 0-> ВКЛЮЧЕНИЕ ЗВОНКА. / 1-> ФЛАГ УСТАНОВКИ 1 СЕК. / 2-> МИГАНИЕ ЗА ИНДИКАТОРОМ. / з-> РАБОТА. / 4-> СЧЕТЧИКА ГАШЕНИЯ ИНДИКАЦИИ. 5»-> ГАШЕНИЕ РАЗРЯДА ИНДИКАЦИИ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. SECL EQU 18Н /СЧЕТЧИК УСТАНОВКИ исо EQU 19Н /ЕДИНИЦЫ. 167
Устройства с цифровой индикацией UC1 EQU 1AH ; ДЕСЯТКИ. UC2 EQU 1BH ; СОТНИ. UC3 EQU 1CH ; ТЫСЯЧИ. UC4 EQU 1DH ; ДЕСЯТКИ ТЫСЯЧ. UC5 EQU 1EH / сотни тысяч. UC6 EQU 1FH ; МИЛЛИОНЫ. UC7 EQU 02 OH / ДЕСЯТКИ миллионов. ; ВРЕМЕННЫЕ РЕГИСТРЫ. W TEMP EQU 021H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS TEMP EQU 022H ;БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR TEMP EQU 023H /ВРЕМЕННЫЙ ДЛЯ FSR. C0U3 EQU 024H /СЧЕТЧИК ВЫДЕРЖКИ ИНДИКАЦИИ СЕГМЕНТА. ; 1. ПУСК. f ORG 0 GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B' 00000000' /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ. MOVWF OPTION REGA80H MOVLW B' 10010000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ИЗМЕНЕНИИ СИГНАЛА ПОРТВ, B0. MOVWF INTCON MOVLW B’ 00001000' /RAO, RAI, RA2, RA4 - НА ВЫХОД, RA3 - НА ВХОД. MOVWF TRISAA80H MOVLW B' 00000001' / RB1-RB7-HA ВЫХОД, RBO-ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И1 УСТАНАВЛИВАЕМ CLRF SCO CLRF SCI CLRF SC2 CLRF SC3 CLRF SC4 f CLRF SC5 CLRF SC6 CLRF SC7 CLRF UCO ✓ ' CLRF UC1 CLRF UC2 CLRF UC3 CLRF UC4 CLRF UC5 CLRF UC6 CLRF UC7 168
Счетчик витков CLRF CLRF CLRF GOTO SEG SECL CAT ZIKL /ИДЕМ НА ИНДИКАЦИЮ. ; 3. ОБНУЛЕНИЕ. KZO CLRF SCO /ОБНУЛЯЕМ РЕГИСТРЫ ИНДИКАЦИИ CLRF SCI CLRF SC2 CLRF SC3 CLRF SC4 , CLRF SC5 CLRF SC6 CLRF SC7 BCF FLAG,3 /ЧТОБЫ МОЖНО БЫЛО ДВИГАТЬ. BCF FLAG, 1' /ЧТОБЫ САМО НЕ ПОШЛО. BCF FLAG,0 /ЧТОБЫ ЗАМОЛЧАЛ. BTFSC FLAG,2 /В РЕЖИМЕ СЧЕТА РЕГИСТРЫ' RETURN ;УСТАНОВКИ HE СБРАСЫВАЮТСЯ. . CLRF UC0 /ОБНУЛЯЕМ РЕГИСТРЫ УСТАНОВКИ CLRF UC1 CLRF UC2 CLRF UC3 CLRF UC4 CLRF UC5 CLRF UC6 CLRF UC7 RETURN ; 4. ВЫБОР РАЗРЯДА УСТАНОВКИ. САТК BTFSS FLAG,1 /УСТАНОВКА РАЗРЕШЕНА ЕСЛИ ПРОШЛА 1 СЕК RETURN BCF FLAG,2 /ЗАКОНЧИЛИ РЕЖИМ СЧЕТА. BCF FLAG,1 /ЧТОБЫ ЖДАТЬ ДО СЛЕДУЮЩЕЙ СЕКУНДЫ. MOVFW CAT , /9 РАЗРЯД = 0. SUBLW .8 BZ CATKO /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. INCF CAT, 1 /+1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. RETURN f САТКО CLRF CAT /ОБНУЛЯЕМ. BCF INTCON,7 /ЗАПРЕТ ПРЕРЫВАНИЙ НА ВРЕМЯ УСТАНОВКИ. BCF FLAG,2 /СБРОСИМ ФЛАГ 8 РАЗРЯДА.* BCF FLAG,3 /РЕЖИМ СЧЕТА. GOTO UST8 /ВЫСВЕТИМ УСТАНОВКУ. / 5. ЗАПИСЬ УСТАНОВОК В в» РЕГИСТРЫ. UST BTFSS , FLAG,1 /УСТАНОВКА РАЗРЕШЕНА ЕСЛИ ПРОШЛА .1 СЕК. 169
Устройства с цифровой индикацией RETURN ВСЕ FLAG,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW CAT /ПО ПОЛОЖЕНИЮ МИГАЮЩЕГО РАЗРЯДА ADDWF PC, 1 /ОПРЕДЕЛЯЕМ РАЗРЯД УСТАНОВКИ. GOTO USTO /0 GOTO UST1 /1 GOTO UST2 /2 GOTO UST3 /3 GOTO UST4 /4 GOTO UST5 /5 GOTO UST6 /б UST0 GOTO RETURN UST7 /7 INCF UCO, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 Z SUBWF UC0,0 BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ CLRF UCO 9 GOTO UST8 9 UST1 INCF UC1,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC1,0 9 BTFSC STATUS,0 г CLRF UC1 9 UST2 GOTO UST8 9 INCF UC2,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC2, 0 9 BTFSC STATUS,0 9 CLRF UC2 9 GOTO UST8, 9 UST3 INCF UC3,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC3, 0 9 BTFSC STATUS,0 9 CLRF UC3- '’goto UST8 9 UST4 INCF UC4,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC4,0 9 BTFSC STATUS,0 9 CLRF UC4 GOTO UST8 UST5 INCF UC5, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC5, 0 9 BTFSC STATUS,0 9 CLRF UC5 9 170
Счетчик витков GOTO ustfe UST6 INCF UC6,1 ;РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9 MOVLW .10 SUBWF UC6,0 BTFSC STATUS,0 ; CLRF UC6 GOTO UST8 UST7 INCF UC7,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9 MOVLW .10 SUBWF UC7,0 ; \ BTFSC STATUS,0 ; V CLRF UC7 ’ ; GOTO UST8 ; 6. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ. UST8 MOVFW UCO MOVWF SCO MOVFW UC1 MOVWF SCI MOVFW UC2 MOVWF SC2 MOVFW UC3 MOVWF SC3 MOVFW UC4 MOVWF SC4 MOVFW UC5 MOVWF SC5 MOVFW UC6 MOVWF SC6 MOVFW UC7 MOVWF SC7 RETURN ; 7. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. СОМР TSTF SCO /ЕСЛИ ВСЕ РАЗРЯДЫ НУЛЕВЫЕ, SKPZ /ТО СРАВНЕНИЕ НЕ ПРОИЗВОДИТСЯ GOTO COM TSTF SCI SKPZ GOTO COM TSTF SC2 SKPZ GOTO COM TSTF SC3 SKPZ GOTO COM TSTF SC4 SKPZ 171
Устройства с цифровой индикацией GOTO COM TSTF SKPZ scs GOTO COM TSTF SKPZ SC6 GOTO COM TSTF SKPZ SC7 GOTO RETURN COM .DM BSF FLAG,3 /ЕСЛИ ИДЕТ СРАВНЕНИЕ, ЗНАЧИТ РАБОЧИЙ РЕЖИМ. MOVFW SCO /ЗАГРУЖАЕМ РЕГИСТР РАЗРЯДА И SUBWF UC0,0 ;ВЫЧТЕМ ИЗ РЕГИСТРА УСТАНОВКИ. SKPZ /ЕСЛИ РАВНО НУЛЮ, RETURN /ПРОПУСКАЕМ И СРАВНИВАЕМ СЛЕДУЮЩИЙ РАЗРЯД. MOVFW SCI SUBWF SK: Z RETURN UC1,O MOVFW SC2 SUBWF SKPZ UC2,0 RETURN MOVFW зсз ; SUBWF- SKPZ исз,о RETURN MOVFW SC4 SUBWF UC4,0 SKPZ RETURN MOVFW SC5 SUBWF SKPZ RETURN UC5, 0 MOVFW SC6 SUBWF SKPZ UC6, 0 RETURN MOVFW SC7 SUBWF UC7,0 SKPZ RETURN BSF FLAG,0 /ЕСЛИ ВСЕ РАЗРЯДЫ РАВНЫ, СТАВИМ ФЛАГ РАВЕНСТВА RETURN ; 8. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА. SEGDATA / 7, 6, 5, 4, 3, 2, 1, 0. ADDWF ' PCL,F / G, F, Е, D, С, В, A, IN. ; ОБЩИЙ: КАТОД АНОД RETLW В'ОИШП' ; В'ЮООООО' 0 172
Счетчик витков RETLW B'00001101' ; B'1111001' 1 RETLW B'10.110111' ; B'0100100', 2 RETLW B'10011111' ; B'0110000' 3 RETLW B'11001101' ; B'OCHlOOl' 4 RETLW B'11.011011' ; B'0010010' 5 RETLW B'11111011' ; B'0000010' 6 RETLW B'00001111' ; B'1111000' 7 RETLW B'llllllll' ; B'0000000' 8 RETLW B'11011111' ; B'0010000' 9 ; 9. ПП. ИНДИКАЦИИ. ZIKL CLRF ANOD ОБНУЛЯЕМ- РЕГИСТР АНОДА. ZSO MOVFW SCO ПЕРЕПИШЕМ ЗНАЧЕНИЕ НУЛЕВОГО РАЗРЯДА ИНДИКАЦИИ CALL INDZIKL И ПОЙДЕМ НА ИНДИКАЦИЮ. BTFSC FLAG,2 ; ЕСЛИ ЗАПЯТАЯ ЗА ИНДИКАТОРОМ, CALL COMP ИДЕМ НА СРАВНЕНИЕ-. CALL MC4 ВЫДЕРЖКА 3 МС. ZS1 MOVFW SCI ВСЕ РАЗРЯДЫ ИНДИЦИРУЕМ АНАЛОГИЧНО НУЛЕВОМУ. CALL INDZIKL ; BSF STATUS,5 ; ПРОВЕРКА КНОПОК. MOVLW B'00000110' /РАЗРЕШАЕМ ВХОД С RBI, RB2, MOVWF TRISBA80H BCF ST,ATUS>5 BTFSC FLAG,3 ; ЕСЛИ ИДЕТ УСТАНОВКА, GOTO • ZOOS ; ПРОПУСТИМ. BTFSS PORTB,1 ; ЕСЛИ-КНОПКА ВЫБОРА РАЗРЯДА НАЖАТА, CALL CATK ; ИДЕМ СРАВНИВАТЬ РАЗРЯД УСТАНОВКИ. BTFSS PORTB,2 ; ЕСЛИ НАЖАТА КНОПКА УСТАНОВКИ, CALL UST ; ИДЕМ НА УСТАНОВКУ. BTFSS PORTB,1 ; ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА НАЖАТА, GOTO ZOOS ; ПРОПУСКАЕМ УСТАНОВКУ ФЛАГА. MOVFW CAT ; 8 РАЗРЯД ФИКТИВНЫЙ, ЧТОБЫ УБРАТЬ МИГАНИЕ С ИНДИКАТОРА. SUBLW .8 ; НЕ БОЛЕЕ 8, SKPNZ ЕСЛИ РАВНО НУЛЮ, BSF FLAG,2 ; УСТАНОВИМ ФЛАГ "РАЗРЯД ЗА ИНДИКАТОРОМ". SKPNZ ЕСЛИ РАВНО НУЛЮ, BSF INTCON,7 ; ^РАЗРЕШАЕМ ПРЕРЫВАНИЯ. zoos BTFSS PORTA,3 ; ’ЕСЛИ НАЖАТА КНОПКА СБРОСА, CALL KZO ; 'ИДЕМ НА СБРОС. BSF STATUS,5 ; MOVLW В'ОООООООГ ';РАЗРЕШАЕМ ВХОД RB0. MOVWF TRISB^8OH BCF STATUS,5 CALL MC4 ; :ВЫДЕРЖКА 3 МС. ZS2 MOVFW SC2 ; :ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВТОРОГО РАЗРЯДА ИНДИКАЦИИ CALL INDZIKL ; :И ПОЙДЕМ НА ИНДИКАЦИЮ. CALL MC4 i :ВЫДЕРЖКА 3 МС. 173
Устройства с цифровой индикацией ZS3 MOVFW SC3 f CALL INDZIKL f CALL MC4 ZS4 MOVFW SC4 r CALL INDZIKL f CALL MC4 ZS5 MOVFW SC5 ! CALL INDZIKL f CALL MC4 ZS6 MOVFW SC6 ! CALL INDZIKL f CALL MC4 ZS7 MOVFW SC7 ! CALL INDZIKL f CALL MC4 GOTO ZIKL /НАЧНЕМ СНАЧАЛА. INDZIKL CALL SEGDATA /ОПРЕДЕЛИМ ЗНАЧЕНИЯ СЕГМЕНТОВ. MOVWF SEG /ЗАПИСЬ ЗНАЧЕНИЯ РАЗРЯДА ВО ВСПОМОГАТЕЛЬНЫЙ /РЕГИСТР. MOVFW ANOD /СРАВНИМ НОМЕР КАТОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT, 0 /РАЗРЯДА МИГАНИЯ. BNZ COUZ2 /ПЕРЕХОД, ЕСЛИ НЕ НОЛЬ. INCF COUI,1 /ЕСЛИ НОЛЬ, +1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. MOVLW .10 /МОЖНО ПОСТАВИТЬ .5 И МИГАНИЕ БУДЕТ ЧАЩЕ. SUBWF COUI,0 /ВЫЧЛИ. SKPZ /ЕСЛИ РАВНО 0, ПОЙДЕМ УСТАНАВЛИВАТЬ БИТ ГАШЕНИЯ GOTO COUZ /ЕСЛИ НЕ РАВНО НУЛЮ, ИДЕМ НА ИНДИКАЦИЮ. C0UZ1 CLRF COUI /ОБНУЛИЛИ СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. BTFSC FLAG,4 /ПРОПУСТИТЬ,ЕСЛИ 0. BCF FLAG,4 /МЕНЯЕМ ЗНАЧЕНИЕ ФЛАГА НА ПРОТИВОПОЛОЖНОЕ. BTFSS FLAG,4 /ЕСЛИ ЕДИНИЦА, ПРОПУСКАЕМ. BSF FLAG,4 /УСТАНОВКА БИТА ГАШЕНИЯ СЧЕТЧИКА В 1. BTFSC FLAG,4 /ЕСЛИ ЕДИНИЦА, BSF FLAG,5 /УСТАНОВИМ ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ. GOTO COUZ /ИДЕМ НА ИНДИКАЦИЮ. C0UZ2 BCF FLAG,5 /УСТАНОВКА БИТА ГАШЕНИЯ ИНДИКАЦИИ В 0. COUZ BTFSC FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 1, BCF ANOD,4 /ТО РАЗРЕШАЕМ ВКЛЮЧЕНИЕ ЗВОНКА. BTFSS FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 0, BSF ANOD,4 /СБРОСИМ РАЗРЯД ЗВОНКА (ЗВОНОК ВЫКЛЮЧЕН) MOVFW . ANOD /ЗАГРУЖАЕМ НОМЕР КАТОДА MOVWF PORTA /В ПОРТ А. BTFSS FLAG, 5- /ЕСЛИ УСТАНОВЛЕН ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ, MOVFW SEG /ПРОПУСТИМ, ИНАЧЕ ПЕРЕПИШЕМ ЗНАЧЕНИЕ СЕГМЕНТОВ. BTFSC FLAG,5 /ЕСЛИ УСТАНОВЛЕН ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ, 174
Счетчик витков CLRF PORTB /ОБНУЛИМ ПОРТ, ПОГАСИВ ИНДИКАТОРЫ С ОБЩИМ КАТОДОМ BTFSS FLAG,5 /ЕСЛИ ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ НУЛЕВОЙ, MOVWF PORTB /В ВЫХОДНОЙ РЕГИСТР ПОРТА В ПЕРЕПИШЕМ ЗНАЧЕНИЯ /СЕГМЕНТОВ. BCF ANOD,4 /ДЛЯ ВЕРНОСТИ СЧЕТА, СБРОСИМ РАЗРЯД ЗВОНКА. INCF ANOD,1 /+1 В РЕГИСТР КАТОДА. МС4 RETURN MOVLW .250 /ЗАДЕРЖКА НА ИНДИКАЦИЮ 3 МС. МС2 MOVWF COU3 / DECF COU3,1 /ВЫЧИТАЕМ 1 ДО НУЛЯ. NOP NOP NOP NOP NOP NOP NOP SKPZ /ЕСЛИ РАВНО НУЛЮ, ИДЕМ НА УСТАНОВКУ ФЛАГА. GOTO МС2 /ЗАЦИКЛИВАЕМСЯ ДО ОБНУЛЕНИЯ РЕГИСТРА. ; 10. ФЛАГ УСТАНОВКИ. SEC DTFSC FLAG,3 /В РАБОЧЕМ РЕЖИМЕ НЕТ УСТАНОВКИ. RETURN INCF ' SECL,1 /+1 В РЕГИСТР ДО ПЕРЕПОЛНЕНИЯ (256). TSTF SECL /ТЕСТИРУЕМ РЕГИСТР НА НОЛЬ. SKPNZ /ЕСЛИ РАВНО НУЛЮ, BSF FLAG,1 /УСТАНОВИМ ФЛАГ УСТАНОВКИ. RETURN ; 11. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP ; MOVFW FSR /FSR. MOVWF FSR_TEMP GOTO SOI . ;ПРИБАВИМ 1 В СЧЕТЧИК. RECONST ,-ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,1 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ ВО. MOVFW STATUS TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR /FSR, MOVFW W_TEMP /W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 12. СЧЕТ. SOI BTFSS FLAG,2 /ЗАПЯТАЯ ЗА ИНДИКАТОРОМ (РЕЖИМ СЧЕТА). 175
Устройства с цифровой индикацией GOTO RECONST MOVLW .9 ;ЕСЛИ УЖЕ 9, SUBWF SCO, 0 ВС S10 /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ. INCF SCO, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S10 CLRF SCO MOVLW . 9 /ЕСЛИ УЖЕ 9, SUBWF SCI, 0 BC S100 /ИДЕМ НА СРАВНЕНИЕ СОТЕН. INCF SCI, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S100 CLRF SCI MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC2,0 BC S103 /ИДЕМ НА СРАВНЕНИЕ ТЫСЯЧ. INCF SC2, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S103 CLRF SC2 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC3,0 BC S104 /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ ТЫСЯЧ INCF SC3, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S104 CLRF SC3 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC4, 0 BC S105 /ИДЕМ НА СРАВНЕНИЕ СОТЕН ТЫСЯЧ. INCF SC4,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S105 CLRF SC4 MOVLW . 9 /ЕСЛИ УЖЕ 9, SUBWF SC5, 0 BC S106 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC5, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S106 CLRF SC5 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC6, 0 BC S107 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC6,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S107 CLRF SC6 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC7,0 BC S108 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC7, 1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. 176
Кабельный пробник GOTO RECONST S108 CLRF SC7 /ОБНУЛЯЕМ СТАРШИЙ РАЗРЯД. GOTO RECONST END Кабельный пробник Для идентификации проводов в многожильных кабелях применяются при- боры под названием кабельные пробники. Схемы кабельных пробников не раз публиковались в журнале «Радио» [8, 9], но они либо сложны [8], либо имеют ограничение по числу проверяемых проводов [9]. Предлагаемым пробником можно одновременно идентифицировать до 80 проводников с цифровой инди- кацией условного номера проводника на стороне приемника. Применение микроконтроллеров PIC16F84A в устройстве предельно упростило схему проб- ника и работу с ним. Пробник состоит из передатчика и приемника. На стороне передатчика проводники вставляются в пронумерованные зажимы, а на стороне приемника щупом прикасаются к проводникам. На цифровом табло будет высвечиваться номер зажима, к которому подключен данный проводник. Для определения номеров жил необходимо идентифицировать один провод и подключить его к общему выводу приемника и передатчика. Передатчик работает в режиме распределителя импульсов по десяти выво- дам микроконтроллера. Каждый вывод имеет свою константу, к которой при- бавляются десятки в момент смены кода десятков. Для того чтобы все 80 цик- лов распределения импульсов производились за одно и то же время, каждый цикл выполняется за время от одного прерывания до другого. Прерывания вы- полняются по переполнению таймера TMR0. Таймер имеет предварительную установку коэффициента деления, определенную так, чтобы в длительность времени от прерывания к прерыванию поместилось 80 периодов выходных импульсов. Рассмотрим алгоритм работы программы передатчика, показанный на рис. 40. После пуска программы и инициализации регистров обнуляется ре- гистр десятков. Значение регистра десятков переписывается в порт А для ком- мутации мультиплексоров. Далее разрешаются прерывания и по двоичному числу десятков находится его десятичное значение. Десятичное значение при- бавляется к константе первого выхода. Константа для каждого выхода опреде- ляется его номером. То сть первый выход имеет константу К = 1, а десятый выход имеет константу К = 10. При нулевом значении десятков на каждом вы- ходе будет число импульсов, равное номеру выхода. Далее программа проверя- ет регистр К на ноль. Если ноля нет, то из регистра вычитается единица. Вы- читание единицы сопровождается переключением выхода в единичное состоя- ние. Выдерживается пауза на время 24 мкс и выход переводится в нулевое состояние. Нулевое Состояние выхода длится 30 мкс. Следовательно, период импульсов равен 24 + 30 = 54 мкс. После этого программа проверяет регистр на ноль. Если регистр пустой, то программа переходит в ожидание прерыва- 177
Устройства с цифровой индикацией ния. А если значение регистра не равно нулю, то весь цикл формирования им- пульса на выходе повторяется. Таким образом, на выходе будет сформировано такое число импульсов, которое было записано в регистр К. Рис. 40. Алгоритм работы программы передатчика кабельного пробника. Передатчик 178
Кабельный пробник После инициализации регистров включается предделитель, имеющий коэф- фициент деления, равный 32, и таймер с коэффициентом деления, равным 256 — 119 = 137. При кварце с частотой 4 МГц прерывание по переполнению таймера должно быть через 4,38 мс (32 х 137 = 4384 = 4,38 мс), но возврат из прерывания выполняете^ командой без разрешения прерывания. К этому вре- мени прибавляется время циклов до разрешения прерывания и, собственно, время на само выполнение прерывания. Общее среднее число циклов равно 16. Поэтому длительность между прерываниями составляет 4,4 мс. Как не трудно подсчитать (54 х 80 = 4320 = 4,32 мс), 80 периодов импульсов будут длиться 4,32 мс. То есть 80 импульсов не выходят за границы длительности между'пре- рывдниями. После переполнения таймера выполняется обычная процедура сохранения значений регистров при прерывании и прибавляется (можно и вычитать) еди- ница в счетчик прерываний. Значения этого счетчика нигде не используются программой, а сам сч;тчик необходим для выполнения прерывания. Но его удобно использовать при отладке программы. После восстановления значений регистров разрешается прерывание для формирования импульсов со следую- щего выхода. После того как будут сформированы импульсы на десятом выходе, регистр десятков увеличивается на единицу и весь цикл повторится с команды записи двоичного кода десятков в порт А. В новом цикле число сформированных импу- льсов на каждом выходе будет увеличено на десять. Если значение десятков ста- ет равно 8, то цикл формирования импульсов начнется с обнуления регистра десятков. Таким образом, максимальное значение десятков равно семи, а макси- мальное число импульсов будет на десятом выходе (10 + 70 = 80). Все 80 циклов прерываний будут длиться 0,352 секунды (4,4 мс х 80 = 352 мс = 0,352 с). Это время определяет гарантированную длительность паузы между выдачей им- пульсов на каждом выходе. Для одиночного импульса на первом выходе дли- тельность паузы будет увеличена почти на время, равное времени между прерываниями, а для 80 импульсов на 10 выходе пауза будет 0авна 0,352 с. Этот момент необходимо отметить, чтобы лучше понять работу приемника кабельного пробника. Схема передатчика показана на рис. 41. Все выводы порта В настроены на выход и имеют коэффициенты от одного, до восьми. Выводы RAO—RA2 испо- льзуются для выхода значений регистра десятков в двоичном коде. Выводы RA3, RA4 используются как выходы с коэффициентом 9, 10 соответственно. Поскольку выход RA4 имеет открытый сток, то он нагружен резистором R1. Каждый* вход 3 мультиплексоров DD2—DD11 подключен к выходу микроконт- роллера со своим коэффициентом. Адресные входы всех мультиплексоров сое- динены параллельно и подключены к выходам десятков микроконтроллера. Таким образом, при нулевом значении регистра десятков на всех мульти- плексорах будет выбран нулевой адрес. А на выводах 13 всех мультиплексоров будет появляться количество импульсов, равное коэффициенту выхода микро- контроллера, который подключен к входу 3 мультиплексора. На выводе 13 микросхемы DD2 будет постоянно присутствовать только один импульс, а на том же выводе микросхемы DD11 будет 10 импульсов. При увеличении адреса мультиплексора на единицу переключится его выход, а число импульсов на 179
Устройства с цифровой индикацией Рис. 41. Кабельный пробник. Передатчик нем увеличится на десять. Таким образом, на каждом выходе мультиплексоров последовательно будет выдаваться только свое количество импульсов. Нижний по схеме выход необходимо подключать к одному известному проводу, кото- рый будет общим для передатчика и для приемника. Приемник кабельного пробника работает по принципу двухразрядного счет- чика. Регистр счетчика увеличивается на единицу при прерывании от измене- ния сигнала на входе RB0. Алгоритм работы программы приемника показан на рис. 42. После пуска и инициализации программа переходит к выполнению динамической индикации двух светодиодов с общим катодом. Время на инди- кацию одного светодиода равно 5 мс. То есть весь цикл индикации выполняет- ся с частотой 100 Гц. В приемнике используются два прерывания: по переполнению таймера TMR 0 и от изменения сигнала на входе RB0. При поступлении импульса на вход RB0 сохраняются значения текущих регистров. Далее программа проверя- ет источник прерывания. Если прерывание произошло не по переполнению таймера, то инкрементируется счетчик импульсов. Производится переустанов- ка таймера (256 — 120 = 136) и сброс счетчика предделителя. Программа вос- станавливает значения регистров, и продолжается работа по индикации. Таким образом, при поступлении импульсов с входа RB0 таймер постоянно переуста- 180
Кабельный пробник Рис. 42. Алгоритм работы программы кабельный пробник. Приемник навливается. Поэтому невозможно прерывание от переполнения таймера до тех пор, пока на входе присутствуют импульсы. Если на входе длительное время отсутствуют импульсы, то произойдет пре- рывание от переполнения таймера. Для надежности работы приемника время от прерывания до прерывания немного уменьшено по сравнению с передатчи- ком и равно 4,38 мс. Каждое прерывание от переполнения таймера подсчиты- вается счетчиком прерываний. Пауза между импульсами на каждом выходе пе- редатчика равна 80 прерываниям, поэтому счетчик прерываний в приемнике имеет счет до 80. Если за это время не было входных импульсов, то программа перепишет значения регистров счетчиков импульсов в регистры индикации. Индикация обновится. Это будет происходить каждые 0,35 с. Схема приемника показана на рис. 43. Выходы микроконтроллера RBI—RB7 коммутируют сегменты светодиодов HG1, HG2. Выходы RAO, RA1 коммутируют катоды светодиодов. Импульсы со щупа поступают на вход RB0. 181
Устройства с цифровой индикацией Рис. 43. Кабельный пробник. Приемник Зажим щупа подключается к известной жиле кабеля, которая служит общим проводом для приемника и передатчика. Если выход мультиплексора передат- чика не выбран адресом, то на нем будет присутствовать неопределенный уро- вень. Тогда при появлении импульсов на счетчике приемника будет одно лож- ное срабатывание. Это не зависит от установленного перепада срабатывания счетчика то ли из ноля в единицу, то ли из единицы в ноль. Чтобы не было ложных импульсов, вход зашунтирован резистором R1. Питание приемника и передатчика осуществляется от трех элементов типа ДА или ААА. Если предполагается длительная работа с приемником, то жела- тельно использовать плоскую батарею типа 3R12X. В приемнике и передатчике используется кварц на частоту 4 МГц. Без каких-либо переделок схемы и про- граммы можно использовать кварцы на частоты до 1 МГц. При этом соответст- венно увеличится время смены индикации до 4 раз. Коммутация светодиодов останется на приемлемой для глаз частоте (до 25 Гц). Печатная плата для передатчика на 40 выходов показана на рис. 44 (вид со стороны проводников), а на рис. 45 дано расположение элементов. Печатная плата на оставшиеся 40 выходов аналогична приведенной на рис. 44 и 45, но без микросхемы DD1 и с добавлением резистора R1. Две платы расположены одна под одной, а между ними устанавливается пенал для трех элементов типа ААА на уровне микросхемы DD1. Платы стягиваются винтами со стойками. Отверстия под винты на рис. не показаны, так как могут быть просверлены в любом удобном для монтажа месте. Зажимы для проводов самодельные и изготавливаются из листовой пружи- нящей бронзы шириной 2,5 мм. Нижний и верхний зажим впаиваются в плату. Края зажимов загибают под углом, предварительно просверлив в них отверстия 0 1,2 мм. Прижимая верхний и нижний зажим, в совпадающие отверстия вставляют провод. После окончательного монтажа зажимы нумеруются так, чтобы при вращении передатчика (низ стал верхом) были видны их номера. 182
Кабельный пробник Рис. 44. Кабельный пробник. Передатчик. Печатная плата на 40 выводов GND 9 10 б Рис. 45. Кабельный пробник. Передатчик. Расположение элементов на печатной плате Файл передатчика — kabelpd.asm, а для приемника — kabelpm.asm. ; СЧЕТЧИК ВИТКОВ. МАКСИМАЛЬНАЯ ЧАСТОТА СЧЕТА ДО 15 КГЦ. ; 8 РАЗРЯДОВ ИНДИКАЦИИ С УСТАНОВКОЙ ЧИСЛА СОВПАДЕНИЯ. ; -РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru 183
Устройства с цифровой индикацией ; ПРОГРАММА = SETSIK.ASM ; ВЕРСИЯ: 05-02-03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. 9 #include pl6f84a.inc __CONFIG 3FF2H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 4,0 МГЦ. / СПЕЦ РЕГИСТРЫ. INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H /TMR0. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA ' EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. / ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. SCO EQU ОСН /МЛАДШИЙ РАЗРЯД СЧЕТЧИКА. . SCI EQU 0DH / SC2 EQU OEH / SC3 EQU OFH 9 SC4 EQU 10H 9 SC5 EQU 11H 9 SC6 EQU 12H SC7 EQU 13H /СТАРШИЙ РАЗРЯД. CAT EQU 14H . /ВЫБОР РАЗРЯДА УСТАНОВКИ (МИГАНИЯ) ANOD EQU 15H /КАТОД, ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ(0-7). SEG EQU 16H /СЕГМЕНТЫ. COUI EQU 025H /СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. - /============================================ j FLAG EQU 17H i / 0-> ВКЛЮЧЕНИЕ ЗВОНКА. ' / l-> ФЛАГ УСТАНОВКИ 1 СЕК. / 2-> МИГАНИЕ ЗА ИНДИКАТОРОМ. < ; 3-> РАБОТА. ; 4-> СЧЕТЧИКА ГАШЕНИЯ ИНДИКАЦИИ. 5-> ГАШЕНИЕ РАЗРЯДА ИНДИКАЦИИ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. SECL EQU 18Н /СЧЕТЧИК УСТАНОВКИ. 184
Кабельный пробник UCO EQU 19H /ЕДИНИЦЫ. UC1 ’ EQU 1AH /ДЕСЯТКИ. UC2 EQU 1BH /СОТНИ. UC3 EQU 1CH /ТЫСЯЧИ. UC4 EQU 1DH /ДЕСЯТКИ ТЫСЯЧ. UC5 EQU 1EH /СОТНИ тысяч. UC6 EQU 1FH /МИЛЛИОНЫ. UC7 EQU 020H /ДЕСЯТКИ миллионов ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 021H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS-TEMP EQU 022H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ fsr_t£mp EQU 023H /ВРЕМЕННЫЙ ДЛЯ FSR. соиз EQU 024H /СЧЕТЧИК ВЫДЕРЖКИ ИНДИКАЦИИ СЕГМЕНТА. ; 1. ПУСК. ORG О GOTO INIT ORG' 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B100000000' /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ. MOVWF OPTION_REG"80H MOVLW B'lOOlOOOO' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ИЗМЕНЕНИИ СИГНАЛА ПОРТВ, B0. MOVWF INTCON MOVLW B'OOOOIOOO' /RAO, RAI, RA2, RA4 - НА ВЫХОД, RA3 - НА ВХОД. MOVWF TRISAA80H MOVLW B'00000001' / RB1-RB7-HA ВЫХОД, RBO-ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCO CLRF SCI CLRF SC2 CLRF SC3 CLRF SC4 Л CLRF SC5 CLRF SC6 CLRF SC7 CLRF UCO CLRF UC1 CLRF UC2 CLRF , UC3 CLRF UC4 CLRF UC5 CLRF UC6 185
Устройства с цифровой индикацией CLRF UC7 CLRF SEG CLRF SECL CLRF CAT GOTO ZIKL /ИДЕМ НА ИНДИКАЦИЮ. ; 3. ОБНУЛЕНИЕ. KZO CLRF SCO /ОБНУЛЯЕМ РЕГИСТРЫ ИНДИКАЦИИ CLRF SCI CLRF SC2 CLRF SC3 CLRF SC4 CLRF SC5 CLRF SC6 CLRF SC7 BCF FLAG,3 /ЧТОБЫ МОЖНО БЫЛО ДВИГАТЬ. BCF FLAG, 1 /ЧТОБЫ САМО НЕ ПОШЛО. BCF FLAG,0 /ЧТОБЫ ЗАМОЛЧАЛ. BTFSC FLAG,2 /В РЕЖИМЕ СЧЕТА РЕГИСТРЫ RETURN /УСТАНОВКИ НЕ СБРАСЫВАЮТСЯ. CLRF UCO /ОБНУЛЯЕМ РЕГИСТРЫ УСТАНОВКИ CLRF UC1 CLRF UC2 CLRF UC3 CLRF UC4 CLRF UC5 CLRF UC6 CLRF UC7 RETURN ; 4. ВЫБОР РАЗРЯДА УСТАНОВКИ. САТК BTFSS FLAG,1 /УСТАНОВКА РАЗРЕШЕНА ЕСЛИ ПРОШЛА 1 СЕК RETURN BCF FLAG,2 /ЗАКОНЧИЛИ РЕЖИМ СЧЕТА. BCF FLAG,1 /ЧТОБЫ ЖДАТЬ ДО СЛЕДУЮЩЕЙ СЕКУНДЫ. MOVFW CAT /9 РАЗРЯД = 0. SUBLW .8 BZ CATKO /ИНАЧЕ ИДЕМ ОБНУЛЯТЬ. INCF CAT, 1 /+1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. RETURN САТКО /ОБНУЛЯЕМ. CLRF CAT BCF INTCON,7 /ЗАПРЕТ ПРЕРЫВАНИЙ НА ВРЕМЯ УСТАНОВКИ BCF FLAG,2 /СБРОСИМ ФЛАГ &,РАЗРЯДА. BCF FLAG,3 /РЕЖИМ СЧЕТА. GOTO UST8 /ВЫСВЕТИМ УСТАНОВКУ. ; 5. ЗАПИСЬ УСТАНОВОК В РЕГИСТРЫ. UST BTFSS FLAG,1 /УСТАНОВКА РАЗРЕШЕНА ЕСЛИ ПРОШЛА 1 СЕК. 186
Кабельный пробник RETURN BCF FLAG,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOVFW CAT /ПО ПОЛОЖЕНИЮ МИГАЮЩЕГО РАЗРЯДА -ADDWF PC, 1 /ОПРЕДЕЛЯЕМ РАЗРЯД УСТАНОВКИ. GOTO USTO /0 GOTO UST1 /1 GOTO UST2 • /2 GOTO UST3 /3 GOTO UST4 /4 GOTO UST5 /5 GOTO UST6 /6 GOTO RETURN UST7 /7 / USTO INCF UCO, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UCO, 0 BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ CLRF UCO 9 GOTO UST8 9 UST1 INCF UC1, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC1,0 9 BTFSC STATUS,0 9 CLRF UC1 9 UST2 GOTO UST8 9 INCF UC2,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. . MOVLW .10 9 SUBWF UC2,0 9 BTFSC STATUS,0 9 CLRF UC2 9 GOTO UST8 9 UST3 INCF UC3, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC3, 0 9 BTFSC STATUS,0 9 CLRF UC3 9 GOTO UST8 9 UST4 INCF UC4,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC4,0 9 BTFSC STATUS, 0' 9 CLRF UC4 9 GOTO UST8 9 UST5 INCF UC5, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF UC5, 0„ 9 BTFSC STATUS,0 9 CLRF UC5 9 GOTO UST8 9 187
Устройства с цифровой индикацией UST6 INCF UC6, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9 MOVLW .10 t SUBWF UC6, 0 f BTFSC STATUS,0 r CLRF UC6 r GOTO UST8 ! UST7 INCF UC7, 1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9 MOVLW .10 f SUBWF UC7,0 t BTFSC STATUS,0 r CLRF UC7 r GOTO UST8 ! ; 6. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ. UST8 MOVFW UCO MOVWF SCO MOVFW UC1 MOVWF SCI MOVFW UC2 MOVWF SC2 MOVFW UC3 MOVWF SC3 MOVFW UC4 MOVWF SC4 MOVFW UC5 MOVWF SC5 MOVFW UC6 MOVWF SC6 MOVFW UC7 MOVWF SC7 RETURN ; 7. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. COMP TSTF SCO /ЕСЛИ ВСЕ РАЗРЯДЫ НУЛЕВЫЕ, SKPZ /ТО СРАВНЕНИЕ НЕ ПРОИЗВОДИТСЯ GOTO COM TSTF SCI SKPZ GOTO. COM TSTF SC2 SKPZ GOTO COM TSTF SC3 SKPZ GOTO COM TSTF SC4 SKPZ GOTO COM 188
Кабельный пробник TSTF SC5 SKPZ GOTO COM • TSTF SC6 SKPZ GOTO COM TSTF SC7 SKPZ GOTO COM . RETURN j COM BSF FLAG,3 /ЕСЛИ ИДЕТ СРАВНЕНИЕ, ЗНАЧИТ РАБОЧИЙ РЕЖИМ. MOVFW SCO /ЗАГРУЖАЕМ РЕГИСТР РАЗРЯДА И SUBWF UC0,0 /ВЫЧТЕМ ИЗ РЕГИСТРА УСТАНОВКИ. SKPZ /ЕСЛИ РАВНО НУЛЮ, RETURN /ПРОПУСКАЕМ И СРАВНИВАЕМ СЛЕДУЮЩИЙ РАЗРЯД. MOVFW SCI SUBWF UC1,O £kpz RETURN MOVFW SC2 SUBWF UC2, 0 SKPZ RETURN MOVFW SC3 SUBWF UC3, 0 SKPZ RETURN MOVFW SC4 SUBWF UC4,0 SKPZ RETURN MOVFW SC5 SUBWF UC5,0 SKPZ RETURN MOVFW SC6 SUBWF UC6, 0 SKPZ RETURN MOVFW SC7 SUBWF UC7,0 SKPZ RETURN BSF FLAG,0 /ЕСЛИ ВСЕ РАЗРЯДЫ РАВНЫ, СТАВИМ ФЛАГ РАВЕНСТВА RETURN / 8. ТАБЛИЦА СЕГМЕНТОВ ДЛЯ ОБЩЕГО КАТОДА. SEGDATA / 7, 6, 5, 4, 3, 2, 1, 0. ADDWF PCL,F ; G, F, E, D, С, B, A, IN. ; ОБЩИЙ: .КАТОД АНОД RETLW В'ОППШ' / В'ЮООООО' 0 RETLW B'00001101' ; B'llllOOl' 1 ' 189
Устройства с цифровой индикацией RETLW B'10110111' ; B'0100100' 2 RETLW B'lOOlllll' ; B'0110000' 3 RETLW B'llOOllOl' ; B'0011001' 4 RETLW B'llOllOll' ; B'0010010' 5 • RETLW B’11111011' ; B'0000010' 6 RETLW B'00001111' ; B'llllOOO' 7 RETLW В'ПШШ' ; B'0000000’ 8 RETLW B'llOlllll' ; B'OOIOOOO' 9 9. ПП. ИНДИКАЦИИ. ZIKL CLRF ANOD ОБНУЛЯЕМ РЕГИСТР АНОДА. zso MOVFW SCO ПЕРЕПИШЕМ ЗНАЧЕНИЕ НУЛЕВОГО РАЗРЯДА ИНДИКАЦИИ CALL INDZIKL ; •И ПОЙДЕМ НА ИНДИКАЦИЮ. BTFSC FLAG,2 ; ЕСЛИ ЗАПЯТАЯ ЗА ИНДИКАТОРОМ, CALL COMP ; ИДЕМ НА СРАВНЕНИЕ. CALL MC4 ; :ВЫДЕРЖКА 3 МС. ZS1 MOVFW SCI ; :ВСЕ РАЗРЯДЫ ИНДИЦИРУЕМ АНАЛОГИЧНО НУЛЕВОМУ. CALL INDZIKL ; BSF STATUS,5 ; :ПРОВЕРКА КНОПОК. MOVLW B'00000110' РАЗРЕШАЕМ ВХОД С RBI, RB2, MOVWF TRISBA80H BCF STATUS,5 BTFSC FLAG,3 ; ;ЕСЛИ ИДЕТ УСТАНОВКА, GOTO ZOOS ;ПРОПУСТИМ. BTFSS PORTB*, 1 /ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА НАЖАТА, CALL CATK /ИДЕМ СРАВНИВАТЬ РАЗРЯД УСТАНОВКИ. BTFSS PORTB,2 /ЕСЛИ НАЖАТА КНОПКА УСТАНОВКИ, CALL UST /ИДЕМ НА УСТАНОВКУ. BTFSS PORTB,1 /ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА НАЖАТА, GOTO ZOOS /ПРОПУСКАЕМ УСТАНОВКУ ФЛАГА. MOVFW CAT /8 РАЗРЯД ФИКТИВНЫЙ, ЧТОБЫ УБРАТЬ МИГАНИЕ /С ИНДИКАТОРА. SUBLW .8 /НЕ БОЛЕЕ.8, SKPNZ /ЕСЛИ РАВНО НУЛЮ, BSF FLAG,2 /УСТАНОВИМ ФЛАГ "РАЗРЯД ЗА ИНДИКАТОРОМ". SKPNZ /ЕСЛИ РАВНО НУЛЮ, BSF INTCON,7 /РАЗРЕШАЕМ ПРЕРЫВАНИЯ. ' zoos BTFSS PORTA,3 ;ЕСЛИ НАЖАТА КНОПКА СБРОСА, CALL KZO /ИДЕМ НА СБРОС. BSF STATUS,5 MOVLW B'00000001 РАЗРЕШАЕМ ВХОД RB0. MOVWF TRISBA80H BCF STATUS,5 CALL MC4 /ВЫДЕРЖКА 3 МС. ZS2 MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВТОРОГО РАЗРЯДА ИНДИКАЦИИ CALL INDZIKL /И ПОЙДЕМ НА ИНДИКАЦИЮ. CALL MC4 /ВЫДЕРЖКА 3 МС. 190
Кабельный пробник ZS3 MOVFW SC3 CALL INDZIKL CALL MC4 ZS4 MOVFW SC 4 CALL INDZIKL CALL MC4 ZS5 MOVFW SC5 CALL INDZIKL CALL MC4 ZS6 MOVFW SC 6 CALL INDZIKL - ; CALL MC4 ZS7 Ж MOVFW SC7 CALL INDZIKL CALL MC4 GOTO ZIKL /НАЧНЕМ СНАЧАЛА. INDZIKL CALL SEGDATA /ОПРЕДЕЛИМ ЗНАЧЕНИЯ СЕГМЕНТОВ. MOVWF SEG /ЗАПИСЬ ЗНАЧЕНИЯ РАЗРЯДА ВО ВСПОМОГАТЕЛЬНЫЙ РЕГИСТР. MOVFW ANOD /СРАВНИМ НОМЕР КАТОДА С НОМЕРОМ УСТАНОВКИ SUBWF CAT,0 /РАЗРЯДА МИГАНИЯ. BNZ COUZ2 /ПЕРЕХОД, ЕСЛИ НЕ НОЛЬ. INCF COUI,1 /ЕСЛИ НОЛЬ, +1 В СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. MOVLW .10 /МОЖНО ПОСТАВИТЬ .5 И МИГАНИЕ БУДЕТ ЧАЩЕ. SUBWF COUI,0 /ВЫЧЛИ. SKPZ /ЕСЛИ РАВНО 0, ПОЙДЕМ УСТАНАВЛИВАТЬ БИТ ГАШЕНИЯ. GOTO COUZ /ЕСЛИ НЕ РАВНО НУЛЮ, ИДЕМ НА ИНДИКАЦИЮ. COUZ1 CLRF COUI /ОБНУЛИЛИ СЧЕТЧИК ЦИКЛОВ ИНДИКАЦИИ. BTFSC FLAG,4 /ПРОПУСТИТЬ, ЕСЛИ 0. BCF FLAG,4 /МЕНЯЕМ ЗНАЧЕНИЕ ФЛАГА НА ПРОТИВОПОЛОЖНОЕ. BTFSS FLAG,4 /ЕСЛИ ЕДИНИЦА, ПРОПУСКАЕМ. BSF FLAG,4 /УСТАНОВКА БИТА ГАШЕНИЯ СЧЕТЧИКА В 1. BTFSC FLAG,4 /ЕСЛИ ЕДИНИЦА, BSF FLAG,5 /УСТАНОВИМ ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ. GOTO COUZ /ИДЕМ НА ИНДИКАЦИЮ. COUZ2 BCF FLAG,5 /УСТАНОВКА БИТА ГАШЕНИЯ ИНДИКАЦИИ В 0. COUZ BTFSC FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА = 1, BCF ANOD,4 /ТО РАЗРЕШАЕМ ВКЛЮЧЕНИЕ ЗВОНКА. BTFSS FLAG,0 /ЕСЛИ ФЛАГ ЗВОНКА =.0, BSF ANOD,4 /СБРОСИМ РАЗРЯД ЗВОНКА (ЗВОНОК ВЫКЛЮЧЕН). MOVFW ANOD /ЗАГРУЖАЕМ НОМЕР КАТОДА MOVWF PORTA /В ПОРТ А. BTFSS FLAG,5 /ЕСЛИ УСТАНОВЛЕН ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ, MOVFW SEG * /ПРОПУСТИМ, ИНАЧЕ ПЕРЕПИШЕМ ЗНАЧЕНИЕ СЕГМЕНТОВ. BTFSC FLAG,5 /ЕСЛИ УСТАНОВЛЕН ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ, CLRF PORTB /ОБНУЛИМ ПОРТ, ПОГАСИВ ИНДИКАТОРЫ С ОБЩИМ КАТОДОМ. 191
Устройства с цифровой индикацией BTFSS ' FLAG,5 /ЕСЛИ ФЛАГ ГАШЕНИЯ ИНДИКАЦИИ НУЛЕВОЙ, MOVWF PORTB ;В ВЫХОДНОЙ РЕГИСТР ПОРТА В ПЕРЕПИШЕМ ЗНАЧЕНИЯ /СЕГМЕНТОВ. BCF ANOD,4 /ДЛЯ ВЕРНОСТИ СЧЕТА, СБРОСИМ РАЗРЯД ЗВОНКА. INCF RETURN •ANOD,1 ;+1 В РЕГИСТР КАТОДА. MC4 MOVLW .250 /ЗАДЕРЖКА НА ИНДИКАЦИЮ 3 МС. MOVWF COU3 MC2 DECF NOP NOP NOP NOP NOP NOP NOP SKPZ COU3,1 /ВЫЧИТАЕМ 1 ДО НУЛЯ. /ЕСЛИ РАВНО НУЛЮ, ИДЕМ НА УСТАНОВКУ ФЛАГА. GOTO MC2 /ЗАЦИКЛИВАЕМСЯ ДО ОБНУЛЕНИЯ РЕГИСТРА. ' ; 10. ФЛАГ УСТАНОВКИ.' SEC BTFSC RETURN FLAG,3 /В РАБОЧЕМ РЕЖИМЕ НЕТ УСТАНОВКИ. INCF SECL,1 /+1 В РЕГИСТР ДО ПЕРЕПОЛНЕНИЯ (256). TSTF SKPNZ SECL /ТЕСТИРУЕМ РЕГИСТР НА НОЛЬ. /ЕСЛИ РАВНО НУЛЮ, BSF RETURN FLAG,1 /УСТАНОВИМ ФЛАГ УСТАНОВКИ. 11. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS TEMP MOVFW FSR /FSR. MOVWF. FSR TEMP GOTO SOI /ПРИБАВИМ 1 В СЧЕТЧИК. RECONST 1 /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,1 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ ВО. MOVFW STATUS TEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR TEMP MOVWF FSR / FSR, MOVFW W TEMP ;W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ========== / 12. СЧЕТ. • = = SOI BTFSS FLAG,2 ЗАПЯТАЯ ЗА ИНДИКАТОРОМ (РЕЖИМ СЧЁТА). 192
Кабельный пробник GOTO RECONST MOVLW .9 /ЕСЛИ УЖЕ 9,. SUBWF SCO, 0 ВС S10 /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ. INCF SCO,1 ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S10 CLRF SCO movl!w .9 /ЕСЛИ УЖЕ 9, SUBWF SCI, 0 BC S100 /ИДЕМ НА СРАВНЕНИЕ СОТЕН. INCF SCI, 1 ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S100 CLRF SCI MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC2,0 BC S103 /ИДЕМ НА СРАВНЕНИЕ ТЫСЯЧ. INCF SC2,1 ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S103 CLRF SC2 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC3, 0 BC S104 /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ ТЫСЯЧ INCF SC3,1’ ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S104 CLRF SC3 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC4,0 BC S105 /ИДЕМ НА СРАВНЕНИЕ СОТЕН ТЫСЯЧ. INCF SC4,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S105 CLRF SC4 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC5, 0 BC S106 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC5,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S106 CLRF SC5 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC6, 0 / BC S107 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC6,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. GOTO RECONST S107 CLRF SC6 MOVLW .9 /ЕСЛИ УЖЕ 9, SUBWF SC7,0 * BC S108 /ИДЕМ НА ОБНУЛЕНИЕ. INCF SC7,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. 7.Зак. 2418 193
Устройства с цифровой индикацией GOTO RECONST S108 CLRF SC7 /ОБНУЛЯЕМ СТАРШИЙ РАЗРЯД. GOTO RECONST END Радиоохрана . Предлагаемое устройство — модулятор и демодулятор на двух микроконт- роллерах может работать совместно с передатчиком и приемником с частотной или амплитудной модуляцией. Устройство контролирует ежесекундную додачу импульсов с охраняемого объекта. Производится контроль состояния 11 датчи- ков. При пропадании контрольных импульсов из-за значительного удаления от объекта или выключения передатчика включается звуковой сигнал. После включения тревожного сигнала можно определить, по какому из параметров или датчиков включилась сигнализация. Алгоритм работы программы модулятора показан на рис. 46. После пуска и инициализации регистров программа переходит к постоянному контролю дат- чиков на размыкание. Контроль датчиков производится в то время, когда несу- щая включена. Это происходит через одну секунду. Если любой из 11 датчиков сработал, то номер этого датчика переписывается в регистр модуляции. Далее значение регистра модуляции сравнивается на ноль, и если оно не равно нулю, то регистр декрементируется. Устанавливается логическая единица на выходе RA3, включая тем самым модуляцию передатчика. Отработав паузу, равную 2,7 мс, выход устанавливается в нулевое состояние. Программа переходит на сравнение регистра модуляции на ноль. Таким образом, в то время, когда включена несущая, произойдет модуляция количеством импульсов, равным номеру сработавшего датчика. Когда регистр модуляции обнулится, программа выключит несущую и уста- новит флаг выключения несущей по срабатыванию датчика. Далее программа ожидает выключения флага несущей по переполнению таймера. Прерывание по переполнению таймера происходит либо из подпрограммы ожидания вы- ключения флага несущей, либо, если датчик не сработал, из подпрограммы опроса датчиков. При кварцевом резонаторе на частоту 32768 Гц, коэффициенте деления предделителя, равном 32, и коэффициенте деления таймера, равном 256, пре- рывание по переполнению таймера будет происходить каждую секунду. После сохранения регистров проверяется флаг включения несущей. Если несущая была включена, то проверяется флаг выключения несущей по срабатыванию датчиков. Если несущая выключена, то прерывание завершается восстановле- нием регистров. Если несущая не выключена по срабатыванию датчиков, фор- мируется импульс модуляции, выключается несущая и устанавливается флаг выключения несущей по переполнению таймера. Прерывание завершается. Через секунду все повторится с включения несущей и формирования импу- льса модуляции, если не произошло выключение несущей по срабатыванию датчиков. Если датчики сработали, то импульс модуляции не формируется. Та- 194
Радиоохрана ВОССТАНОВЛЕНИЕ РЕГИСТРОВ Рис. 46. Алгоритм работы программы модулятора для радиоохраны ким образом, если ни один датчик не разомкнут, каждую секунду будет форми- роваться импульс модуляции длительностью 2,7 мс. Импульс модуляции будет сформирован в центре»импульса включения несущей. Длительность импульса включения несущей равна 8 миллисекундам. Если же какой-либо датчик сра- ботал, то несущая включится на время формирования количества импульсов 195
Устройства с цифровой индикацией модуляции, равном номеру датчика. Если охранные датчики не сработали, то идет постоянный опрос датчиков и сброс флага выключения несущей по сра- батыванию датчиков. Принципиальная схема модулятора показана на рис. 47. На выходе RA3 по- являются импульсы модуляции положительной полярности. На выходе RA4 появляется единичный потенциал включения несущей. Все остальные входы микроконтроллера задействованы охранными датчиками. Охранное положение датчиков нормально замкнутое. Программно ко всем входам порта «В» под- ключены подтягивающие резисторы, поэтому при размыкании датчиков про- грамма обнаружит единичный потенциал на разомкнутом датчике. Входы пор- та «А» программно не подтягиваются к плюсовому напряжению питания, поэ- тому установлены резисторы Rl—R3. При подключении вывода RA4 к схеме передатчика необходимо иметь в виду, что этот выход имеет открытый сток, поэтому, в зависимости от схемы передатчика, может потребоваться нагрузоч- ный резистор. Алгоритм работы программы демодулятора показан на рис. 48. В демодуля- торе используется два прерывания: по переполнению таймера и по изменению сигнала на входе порта «ВО». После пуска и инициализации программа выпол- няет постоянную индикацию. В дежурном режиме регистр индикации нулевой и все сегменты индикации будут иметь нулевое значение. Для семисегментного индикатора с общим катодом это равносильно выключению индикатора. В дежурном режиме радиоохраны с компаратора приемника будут поступать импульсы на вход RB0 с интервалом в одну секунду. С такой же частотой будет происходить прерывание по входу RB0. После сохранения значений регистров Рис. 47. Радиоохрана. Модулятор передатчика 196
Радиоохрана Рис. 48. Алгоритм работы программы, демодулятора для радиоохраны Рис. 48.1. Алгоритм работы программы демодулятора для радиоохраны 197
Устройства с цифровой индикацией определяется, почему произошло прерывание-. Если прерывание произошло не по переполнению таймера, то проверяется длительность входного импульса. Если длительность импульса короче, чем половина длительности импульса по- сылки с передатчика (т. е. 1,34 мс), то такой импульс воспринимается как по- меха и не подсчитывается счетчиком. Если длительность импульса больше 1,34 мс, то обнуляется таймер, предделитель и счетчик миллисекунд. Если флаг переполнения включен (было переполнение), то инкрементируется регистр счета. Далее процессор проверяет значение регистра счета. Если в регистр за- писано 20 и более импульсов, то регистр обнуляется и включается звуковой сигнал. Ситуация, когда на счетчик приходит 20 импульсов, принята аварий- ной. Это возможно при работе радиоохраны в зоне повышенных помех или по- мех, которые наводятся специально. Каждые 0,125 секунды может происходить прерывание от переполнения таймера. За одну секунду между импульсами, поступающими на вход RB0, про- изойдет 8 прерываний по переполнению таймера. При каждом прерывании бу- дет инкрементироваться счетчик миллисекунд. Но поскольку коэффициент де- ления счетчика миллисекунд равен 11, то переполнения счетчика за одну се- кунду не будет. А каждая новая секунда будет начинаться с обнуления таймера и счетчика миллисекунд. При значении счетчика, равном 5 (0,6 с), переписы- вается значение регистра счета в регистр индикации. Это необходимо для того, чтобы при выходе передатчика из аварийного режима обнулялось предыдущее значение регистра счета. Далее проверяется значение регистра индикации, что- бы оно не превышало число 12. Если значение регистра индикации равно или больше 12, то регистр обнуляется. Последующая проверка регистра счета на число 20 является дублирующей аналогичную проверку при инкрементирова- нии регистра счета. При значении счетчика миллисекунд, равном 7 (0,88 с), выключается звуко- вой сигнал, если он был включен, и сбрасывается флаг переполнения (рис. 48.1). Это также необходимо для нормального выхода из аварийного ре- жима, поскольку эти операции (при значении счетчика 5 и 7) выполняются в интервале времени, равном 1 секунде. Если после последнего импульса, пришедшего на вход, прошло более 1 се- кунды, точнее, 1,125, а это соответствует значению счетчика миллисекунд, рав- ному 9, включится звуковой сигнал и установится флаг переполнения. Включе- ние флага переполнения разрешает подсчет входных импульсов. А при каждом входном импульсе сбрасывается счетчик миллисекунд, таймер и предделитель. Поэтому значение счетчика миллисекунд, равное 11, возможно только тогда, когда приемник выходит из зоны действия передатчика или если передатчик прекратил функционирование. В этой ситуации счетчик миллисекунд обнуля- ется, а звуковой сигнал уже включен. Таким образом, при поступлении импульсов на вход RB0 каждую секунду, что свидетельствует о нормальной работе охраны, сигнал тревоги включаться не будет, а цифровой индикатор не будет светиться. При размыкании любого из датчиков произойдет переполнение счетчика миллисекунд, включится сиг- нал, а на индикаторе можно наблюдать номер сработавшего датчика. Схема демодулятора показана на рис. 49. Вход RB0 подключается к выходу компаратора приемника. Выход компаратора должен быть с уровнями ТТЛ. Остальные выводы порта «В» задействованы под выход сегментов индикатора. 198
Радиоохрана ВХОД С КОМПАРАТОРА ПРИЕМНИКА. Рис. 49. Радиоохрана. Демодулятор К выходу RA4 подключается зуммер НСМ120бх. Кнопка SA1 включает индика- тор. Резистор R1 необходимо подобрать по приемлемой яркости для свечения 3—4 сегментов. Тогда один сегмент будет светиться ярче, а восемь сегментов будут светиться слабее. Для наглядности алгоритма работы программы демодулятора рассмотрим диаграмму, показанную на рис. 50 (для наглядности на диаграмме масштаб не соблюдается). В дежурном режиме каждое включение несущей передатчика со- провождается выдачей импульса модуляции. Импульс модуляции с выхода компаратора приемника будет поступать на демодулятор через одну секунду. В аварийном режиме несущая передатчика будет включаться только на время «t» для формирования импульсов с числом, равным номеру датчика. Учитывая, что период импульсов равен 5,37 мс, максимальное значение «t» будет прибли- зительно равно 0,06 мс (11 импульсов). А максимальное значение длительности паузы между импульсами будет равно 2 — 0,06 = 1,94 с. Счетчик миллисекунд демодулятора до включения аварийного режима имеет коэффициент деления, равный 9, поэтому переполнение счетчика будет происходить через 1,125 се- кунды, что гораздо меньше максимального значения паузы. При первом переполнении счетчика миллисекунд включается флаг перепол- нения. После включения флага переполнения начинает заполняться регистр сче- та. Перезапись в регистр индикации производится спустя 0,6 с после прихода по- следнего импульса. Таким образом, индикация обновляется каждые две секунды. Если число импульсов, поступивших с компаратора, больше 11, то результат не выводится на индикатор как заведомо ложный. Такой вариант возможен при высоком уровне помех. Но даже и в этом случае включение звукового сигнала будет свидетельствовать о несанкционированном вторжении на охраняемый объект. При поступлении более 20 импульсов при любом значении флага пере- полнения включится тревожный сигнал. Это сделано для того, чтобы невозмож- но было вывести систему из строя путем подачи непрерывного сигнала помехи. 199
Устройства с цифровой индикацией Включение несущей передатчика. Дежурные импульсы с компаратора. Включение несущей в аварийном режиме. Аварийные импульсы с номером датчика. Флаг переполнения. Регистр счета. Регистр индикации Рис. 50. Диаграммы работы демодулятора При экспериментировании с подачей сигнала сильной помехи по общему проводу наблюдался самопроизвольный переход микроконтроллеров в режим повышенного энергопотребления. Это я объясняю самопроизвольной переус- тановкой регистра, который определяет установку входа как выход (TRISA, TRISB). Поэтому последовательно охранным датчиком желательно установить токоограничивающие резисторы номиналом 200 Ом. Сами микроконтроллеры необходимо подключать к питанию через резистор номиналом 100 Ом. Перед подключением радиоохраны к приемнику и передатчику желательно проверить ее на совместную работу. Для этого необходимо выход несущей и модуляции с модулятора подать на входы логического элемента микросхемы К561ЛА7 и, инвертировав сигнал еще одним элементом, подать на вход демо- дулятора. При проверке индикации число 10 на индикаторе высвечивается нижней чертой (сегмент d), а число 11 — средней чертой (сегмент g). Все временные характеристики приведены для случая использования квар- цевого резонатора на частоту 32768 Гц. Но если у вас и у соседа будут одинако- вые охранные системы, то трудно будет определить, чья из двух сработала. По- этому, кроме различных частот несущей, можно установить различные значе- ния кварцевых резонаторов. Мною успешно опробованы кварцевые резонаторы на частоты до 4 МГц. Главное условие, чтобы модулятор и демоду- лятор имели одинаковые значения по номиналу. То есть специального подбора кварцев не требуется. Однако если во время проверки с нормально замкнуты- ми датчиками включится звуковой сигнал, то необходимо поменять местами 200
Радиоохрана кварцевые резонаторы. То есть кварц из демодулятора поставить на плату мо- дулятора и наоборот. Из двух одинаковых кварцев один окажется с большей частотой. Соответственно все временные характеристики с другим кварцем бу- дут в столько же раз больше (меньше), в сколько раз «новый» кварц имеет ме- ньшую (большую) частоту. Для кварца 4 МГц все параметры уменьшатся в 122 раза (4000000/32768 = 122). Так, например, 1 с превратится в 8 мс. Конеч- но, на меньших частотах система более помехозащищенная. Файл модулятора: oxpanapd.asm, файл демодулятора: oxpanapm.asm. ; РАДИООХРАНА НА 11 ДАТЧИКОВ, ; МОДУЛЯТОР ПЕРЕДАТЧИКА. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = OXPANAPD.ASM ; ВЕРСИЯ: 11-04-03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. 9 #include pl6f84a.inc __CONFIG 3FF0H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32768 ГЦ. ; RB0=l, RB1=2, RB2=3, RB4=4, RB5=6, RB6=7, RB7=8, ; RA0=9, RAl=10, RA2=11 - ВХОДЫ ДАТЧИКОВ. ; РАЗ-ВЫХОД МОДУЛЯЦИИ, RA4-ВЫХОД ВКЛЮЧЕНИЯ НЕСУЩЕЙ. ; СПЕЦ РЕГИСТРЫ. INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ,АЛУ. FSR . EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 0 6H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. / ОПРЕДЕЛЕНИЕ РЕГИСТРОВ. ' SC EQU ОСН /РЕГИСТР ИНДИКАЦИИ. COU . EQU 0DH ;СЧЕТЧИК'ПАУЗЫ. ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 0EH /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 0FH /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ. 201
Устройства с цифровой индикацией FSR_TEMP EQU ЮН /ВРЕМЕННЫЙ ДЛЯ FSR. ; ОПРЕДЕЛЕНИЕ БИТОВ РЕГИСТРА FLAG. FLAG EQU 11Н ; ; 0-> НЕСУЩАЯ ВЫКЛЮЧЕНА ПО ДАТЧИКУ. ; 1-> НЕСУЩАЯ ВКЛЮЧЕНА ЧЕРЕЗ 1 СЕКУНДУ. ; 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ВЫВОД ИМПУЛЬСОВ МОДУЛЯЦИИ. MOVLW .2 /АНАЛОГИЧНО ПЕРВОМУ. MOVWF SC GOTO IDZ MOVLW .3 MOVWF SC GOTO IDZ • ID4 MOVLW MOVWF GOTO .4 SC IDZ ID5 MOVLW .5 MOVWF SC GOTO IDZ ID6 MOVLW . 6 MOVWF SC GOTO IDZ ID7 MOVLW .7 MOVWF SC GOTO IDZ ID8 MOVLW .8 MOVWF SC GOTO IDZ ID9 MOVLW .9 202
Радиоохрана MOVWF GOTO SC ibz ID10 MOVLW .10 MOVWF SC GOTO IDZ ID11 MOVLW .11 MOVWF SC GOTO IDZ IDl MOVLW MOVWF .1 SC /ЗАПИШЕМ НОМЕР ДАТЧИКА /В РЕГИСТР ИНДИКАЦИИ. IDZ TSTF SC ; ЕСЛИ SKPNZ /РЕГИСТР НУЛЕВОЙ, GOTO IDOI /ИДЕМ НА ЗАВЕРШЕНИЕ. DECF SC, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BSF PORTA,3 /ВКЛЮЧИМ ВЫХОД. CALL ID21 /ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ BCF PORTA,3 /ВЫКЛЮЧИМ ВЫХОД. CALL ID2O /ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ НОЛЯ. GOTO IDZ /НАЧНЕМ СНАЧАЛА. IDOI CLRWDT BCF PORTA,4 /ВЫКЛЮЧИМ НЕСУЩУЮ. BSF FLAG,0 /ВКЛЮЧИМ ФЛАГ ВЫКЛЮЧЕНИЯ НЕСУЩЕЙ. BTFSC FLAG,1 /ЖДЕМ ПОКА ВКЛЮЧИТСЯ ФЛАГ ВКЛЮЧЕНИЯ НЕСУЩЕЙ. GOTO IDOI /ХОДИМ ПО КРУГУ. GOTO KEY /ПРОВЕРИМ ДАТЧИКИ. ; 3. ПАУЗА. ______________________________ । ID20 MOVLW MOVWF .2 COU /ПАУЗА 2,69 МИЛЛИСЕКУНДЫ /ОБЩАЯ ДЛИНА-22 ТАКТА. PAUSA DECF COU, 1 /ВЫЧТЕМ 1. TSTF COU /ПРОТЕСТИРУЕМ НА НОЛЬ. SKPZ /ЕСЛИ НЕ РАВНО НУЛЮ, GOTO PAUSA /ПОВТОРИМ. ID21 RETURN MOVLW .2 /ПАУЗА 2,69 МИЛЛИСЕКУНДЫ MOVWF COU . /ОБЩАЯ ДЛИНА-22 ТАКТА. PAUSA1 DECF COU, 1 /ВЫЧТЕМ 1. CLRWDT NOP NOP TSTF COU /ПРОТЕСТИРУЕМ НА НОЛЬ. 203
Устройства с цифровой индикацией SKPZ /ЕСЛИ НЕ РАВНО НУЛЮ, GOTO PAUSA1 ;ПОВТОРИМ. RETURN ; 4. ОПРОС ДАТЧИКОВ. KEY CLRWDT BTFSS FLAG,1 /ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧЕНА, GOTO KEY ;ОПРОС ДАТЧИКОВ НЕ ПРОИЗВОДИТСЯ. BTFSC PORTB,0 /ЕСЛИ ДАТЧИК РАЗОРВАН, GOTO ID1 /ИДЕМ ФОРМИРОВАТЬ ИМПУЛЬС МОДУЛЯЦИИ BTFSC PORTB,1 GOTO ID2 BTFSC PORTB,2 GOTO ID3 BTFSC PORTB,3 GOTO ID4 BTFSC PORTB,4 GOTO ID5 BTFSC PORTB,5 GOTO ID6 BTFSC PORTB,6 GOTO ID7 BTFSC PORTB,7 GOTO ID8 BTFSC PORTA,0 GOTO ID9 BTFSC PORTA,1 GOTO ID10 ' BTFSC PORTA,2 GOTO ID11 BCF FLAG,0 GOTO KEY /ЕЩЕ РАЗ ПРОВЕРИМ ДАТЧИКИ. ; 5. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR / FSR, MOVFW W_TEMP ,-w. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. 204
Радиоохрана II • 1 II 1 II 1 • ч •<* • ВКЛЮЧЕНИЕ НЕСУЩЕЙ. / S1 BTFSC FLAG,1 /ЕСЛИ НЕСУЩАЯ БЫЛА'ВКЛЮЧЕНА, v GOTO S10 /ТО ИДЕМ ВЫКЛЮЧАТЬ. BSF PORTA,4 /ВКЛЮЧИМ НЕСУЩУЮ, BSF FLAG,1 /ПОСТАВИМ ФЛАГ ВКЛЮЧЕНИЯ. BTFSC FLAG,0 /ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧАЛАСЬ ПО ДАТЧИКУ, RETURN /ИМПУЛЬС НЕ ФОРМИРУЕТСЯ. CALL ID2O /ПАУЗА, РАВНАЯ НУЛЮ. BSF PORTA,3 /ВКЛЮЧИМ ВЫХОД. CALL ID21 /ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ, BCF PORTA,3 /ВЫКЛЮЧИМ ВЫХОД. CALL ID2O /ПАУЗА, РАВЙАЯ НУЛЮ. BCF PORTA,4 /ВЫКЛЮЧИМ НЕСУЩУЮ. RETURN S10 BCF FLAG,1 /СБРОСИМ ФЛАГ ВКЛЮЧЕНИЯ НЕСУЩЕЙ. BTFSC FLAG,0 /ЕСЛИ НЕСУЩАЯ ВЫКЛЮЧАЛАСЬ ПО ДАТЧИКУ, RETURN /ИМПУЛЬС НЕ ФОРМИРУЕТСЯ. BSF PORTA,4 /ВКЛЮЧИМ НЕСУЩУЮ, CALL ID2O /ПАУЗА, РАВНАЯ НУЛЮ. BSF PORTA,3 /ВКЛЮЧИМ ВЫХОД.' CALL ID21 /ОТРАБОТАЕМ ПАУЗУ, РАВНУЮ ДЛИТЕЛЬНОСТИ ЕДИНИЦЫ BCF PORTA,3 /ВЫКЛЮЧИМ ВЫХОД. CALL ID2O /ПАУЗА, РАВНАЯ НУЛЮ. BCF PORTA,4 /ВЫКЛЮЧИМ НЕСУЩУЮ. RETURN ; 7, . ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B’OOOOOIOO’ /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=32 ...100, MOVWF OPTION_REGZ '8ОН /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВКЛЮЧЕНЫ. MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА MOVWF INTCON MOVLW B'00000111' ' /RA3,RA4-HA ВЫХОД, RAO-RA2-BXOfl. MOVWF TRISAA80H MOVLW B'llllllll’ ' /RB0-RB7-HA ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF FLAG CLRF PORTA CLRF COU GOTO KEY /ИДЕМ НА ОПРОС ДАТЧИКОВ. END ; РАДИООХРАНА НА 11 ДАТЧИКОВ, 205
Устройства с цифровой индикацией ; ДЕШИФРАТОР ПРИЕМНИКА. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. / saes@mail.ru ; ПРОГРАММА = OXPANAPM.ASM ; ВЕРСИЯ: 12-04-03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. Г #include pl6f84a.inc CONFIG 3FF0H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32768 ГЦ. ; RB0 - ВХОД. ; RA4 - ВЫХОД СИГНАЛА ТРЕВОГИ. ; RB1-RB7 - ВЫХОД СЕГМЕНТОВ. ; СПЕЦ РЕГИСТРЫ. INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H /TMR0. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РАБОЧИХ РЕГИСТРОВ. SCN EQU ОСН /СЧЕТЧИК ИМПУЛЬСОВ. SMC EQU 0DH ;СЧЕТЧИК МИЛЛИСЕКУНД SIN EQU 0EH /РЕГИСТР ИНДИКАЦИИ. ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 0FH /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 10H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR_TEMP EQU 11H /ВРЕМЕННЫЙ ДЛЯ FSR. ; ОПРЕДЕЛЕНИЕ БИТОВ РЕГИСТРА FLAG. FLAG EQU 12Н ; 0-> ФЛАГ ВКЛЮЧЕНИЯ ПЕРЕПОЛНЕНИЯ. ; 1-> ФЛАГ ВЫПОЛНЕННОЙ ПЕРЕЗАПИСИ. 206
Радиоохрана ; 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF 1 STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW В'01000001 ' ;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=4 ...1. MOVWF OPTION REG л80Н /СРАБАТЫВАНИЕ ПО ПЕРЕДНЕМУ ФРОНТУ. MOVLW B'10110000 ' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ИЗМЕНЕНИИ СИГНАЛА RB0 MOVWF INTCON MOVLW B'00000000 ' /ВСЕ - НА ВЫХОД. MOVWF TRISAA80H MOVLW B'00000001 ' / RB1-RB7-HA ВЫХОД, RBO-ВХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCN CLRF SMC CLRF SIN CLRF PORTB CLRF FLAG GOTO IND /ИДЕМ НА ИНДИКАЦИЮ. / 3. ТАБЛИЦА СЕГМЕНТОВ' ДЛЯ ОБЩЕГО КАТОДА. Г ~ SEGDATA / 7, 6, 5, 4, 3, 2, 1, 0. ADDWF PCL,F / 0, F, Е, D, С, В, A, IN. Z ОБЩИЙ: КАТОД АНОД RETLW В'00000000' / В'1111111' СЕГМЕНТЫ ВЫКЛЮЧЕНЫ. RETLW В'00001100' / В'1111001' 1 RETLW В'10110110' / В'ОЮОЮО' 2 RETLW В'10011110' / В'ОИОООО' 3 RETLW В(11001100' / В'0011001' 4 RETLW В'11011010' / В'ООЮОЮ' 5 RETLW В'11111010' / В'ОООООЮ' 6 RETLW В'00001110' / В'1111000' 7 RETLW В'11111110' / В'0000000' 8 RETLW В'11011110' / В'ООЮООО' 9 RETLW В'ОООЮООО' / В'1110111' 10 RETLW В'ЮОООООО' / В'0111111' 11 ; 4. ПП. ИНДИКАЦИИ. IND MOVFW SIN /ПЕРЕПИШЕМ ЗНАЧЕНИЕ РАЗРЯДА ИНДИКАЦИИ. CALL SEGDATA /ОПРЕДЕЛИМ ЗНАЧЕНИЯ СЕГМЕНТОВ. MOVWF PORTEf /В ВЫХОДНОЙ РЕГИСТР ПОРТА "В" ПЕРЕПИШЕМ ЗНАЧЕНИЯ СЕГМЕНТОВ. GOTO IND /ПОВТОРИМ. 207
Устройства с цифровой индикацией ; 5. СЧЕТЧИК ИМПУЛЬСОВ НОМЕРА ДАТЧИКА. SEC BTFSS PORTB,0 /ДЛЯ ИСКЛЮЧЕНИЯ ИМПУЛЬСА ПОМЕХИ. RETURN /ИМПУЛЬС КОРОЧЕ 1,34 МС. ОТСЕКАЕМ. CLRF SMC /СЧЕТЧИК И ТАЙМЕР СБРАСЫВАЮТСЯ CLRF TMRO /ПРИ КАЖДОМ ИМПУЛЬСЕ. BTFSS FLAG,0 RETURN INCF SCN,1 • /ПРИ ЕДИНИЧНОМ ФЛАГЕ СЧИТАЕМ ИМПУЛЬСЫ MOVLW .20 /ЕСЛИ УЖЕ 20 И БОЛЬШЕ, SUBWF SCN, 0 • 7 SKPNC BCF PORTA,4 /ВКЛЮЧИМ СИГНАЛ. RETURN ; 6. ПЕРЕЗАПИСЬ В РЕГИСТР ИНДИКАЦИИ. SES MOVFW SCN /ПЕРЕПИШЕМ ЗНАЧЕНИЯ СЧЕТЧИКА ИМПУЛЬСОВ MOVWF SIN /В РЕГИСТР ИНДИКАЦИИ. MOVLW .12 /ЕСЛИ УЖЕ 12 И БОЛЬШЕ, SUBWF SIN, 0 9 SKPNC CLRF SIN /ОБНУЛИМ. MOVLW .20 /ЕСЛИ УЖЕ 20 И БОЛЬШЕ, SUBWF SCN, 0 9 SKPNC BCF PORTA,4 /ВКЛЮЧИМ СИГНАЛ. CLRF SCN /ОБНУЛИМ. RETURN ; 7. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR / FSR. MOVWF FSR_TEMP 9 BTFSS INTCON,1 GOTO SOI /ПРИБАВИМ 1 В СЧЕТЧИК. CALL SEC /СБРОСИМ ТАЙМЕР ИЛИ УВЕЛИЧИМ СЧЕТЧИК. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОСИМ ФЛАГ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА BCF INTCON,1 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ RB0 MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR /FSR, MOVFW W_TEMP ,-W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. 208
Электронный домоуправ ; 8. СЧЕТЧИК МИЛЛИСЕКУНД. S01 INCF SMC,1 /ЕСЛИ ДЕЛИТЕЛЬ НА 8, ТО БУДЕТ 1 СЕКУНДА. MOVFW SMC . ADDLW -05Н ;К=5. ЧТОБЫ ОБНУЛИТЬ SKPNZ /СЧЕТЧИК ПОСЛЕ CALL SES /АВАРИЙНОГО РЕЖИМА. MOVFW SMC /ПЕРЕЗАПИСЬ ADDLW -07Н /К=7. ЧТОБЫ РАЗРЕШИТЬ ЗАПИСЬ SKPNZ BCF FLAG,0 /В АВАРИЙНОМ РЕЖИМЕ. SKPNZ /ПОСЛЕ АВАРИЙНОГО РЕЖИМА BSF PORTA,4 /ВЫКЛЮЧИМ СИГНАЛ. MOVFW SMC /ЕСЛИ ДЕЛИТЕЛЬ НА 9, ТО БУДЕТ БОЛЬШЕ 1 СЕКУНДЫ ADDLW -09Н /К=9.. SKPNZ /ПРИ ПЕРЕПОЛНЕНИИ СЧЕТЧИКА BCF PORTA,4 /ВКЛЮЧИМ СИГНАЛ. SKPNZ BSF FLAG,0 /РАЗРЕШИМ СЧЕТ. MOVFW SMC ADDLW -0BH /К=11. SKPNZ CLRF SMC /ОБНУЛИМ СЧЕТЧИК МИЛЛИСЕКУНД. GOTO RECONST . END Электронный домоуправ С проблемой управления домашним хозяйством сталкиваются все, кто по- кидает дом на неделю, на день или на месяц. Как накормить домашних питом- цев, полить цветы или включить освещение и телевизор, имитируя присутствие хозяев? А как заблокировать дверной замок на время отсутствия хозяев? А если вы хотите проснуться утром от включенного телевизора под запах сваренного кофе и чтобы через открытые оконные жалюзи брызги солнца взбодрили на весь рабочий день, как быть тогда? Во всех подобных ситуациях вам поможет электронный домоуправ. Домоуправ — это домашний управляющий автомат. Автомат может управлять 8 сетевыми объектами в любое время суток. Все управляемые объекты могут включаться/выключаться 32 энергонезависимыми установками времени с дискретностью 1 минута. 32 установки можно сделать для управления одним объектом или по 4 уста- новки на все 8 объектов (дважды включить и выключить каждый объект). То есть число установок неизменно, а число устанавливаемы^ выходов зависит от потребителя. Управляющий автомат состоит из трех блоков, которые конструктивно сое- диняются между собой разъемами. Блок управления автомата запрограммиро- ван на микроконтроллере PIC16F84A. Блок индикации состоит из двух дешиф- 209
Устройства с цифровой индикацией раторов: дешифратора из двоичного в семисегментный код и дешифратора из двоичного в позиционный код. Индикатором может служить любая линейка светодиодов с общим катодом. Силовой блок выполнен на симисторах ТС 106, которые включаются оптронами серии АОУ160. Конструкция автомата, сде- ланная на разъемах, позволяет устанавливать имеющиеся в наличии комплек- тующие (с переделкой плат) для силового блока и блока индикации. Алгоритм работы программы домашнего управляющего автомата показан на рис. 51. После пуска и инициализации регистров программы проверяется флаг включения индикации. Если индикация включена, проверяется состояние кно- Рис. 51. Алгоритм работы программы управляющего автомата 210
Электронный домоуправ пок. Если две кнопки не нажаты одновременно, выполняется поразрядная ин- дикация. После каждого отработанного разряда индикации ожидается выпол- нение прерывания. Поскольку прерывание происходит через 4 мс, то индика- ция каждого разряда длится 4 мс. После выполнения прерывания индикация загружается значением следующего разряда и выполняется его индикация. По- дробнее алгоритм работы программы аналогичной индикации рассмотрен в [10]. Через каждые две секунды проверяется состояние кнопок установки. Если нажаты одновременно две кнопки, программа выходит из режима ин- дикации и переходит в режим установки выходов. При этом обнуляется счет- чик адреса и выбирается значение, записанное по этому адресу. В восьмираз- рядном регистре Flash-памяти младшие 4 бита занимают единицы разряда ча- сов (минут), а старшие 4 бита занимают десятки. Но в десятках часов значащими будут только два бита, поскольку максимальное число десятков ча- сов равно 2 (Ю2). А в десятках минут значащими будут 3 бита, при максималь- ном числе десятков минут, равном 5 (IOI2). Свободные биты заполняются раз- рядами номера выхода установок. Максимальное число, которое можно запи- сать в 3 разрядах, равно 8. Именно этим ограничено число устанавливаемых выходов. Младший бит номера установки записывается в 7 бит регистра Flash-памяти минут. Минуты записываются в память с нулевого по 31 адрес, а часы занимают Flash-память с 31 по 63 адрес. Первый и второй биты номера выхода установки записываются в 6 и 7 биты памяти часов. Поэтому значение, считанное из памяти, нуждается в двойной расшифровке. Первая расшифровка выполняется по выделению единиц и десятков, а вторая расшифровка выделя- ет и объединяет биты номера выхода установки. После расшифровки значения часов и минут сравниваются на ноль. Если они равны нулю, а нулевые значения не сравниваются, проверяется значение счетчика адреса. Если значение счетчика адреса равно 31, то он обнуляется и цикл выборки/сравнения повторяется. Если значение счетчика адреса не равно 31, то счетчик инкрементируется и выборка продолжается. Если считанные значения часов и минут не равны нулю, то выполняется сравнение выбранных значений с реальным временем. Если они равны, уста- навливается флаг равенства и по номеру выбранной установки (считанной из памяти вместе с часами и минутами) изменяется значение выхода на противо- положное. Например, если на 7 выходе был логический ноль, то при совпаде- нии установки на выходе станет логическая единица. И наоборот. После вы- полнения установки выхода включается флаг выполненной установки и до тех пор, пока флаг равен единице, сравнение не производится. Флаг установки сбросится через одну минуту в счетчике минут. Поэтому нельзя делать одно- временную установку нескольких выходов. Если такая установка в память про- изведена, то сработает та из них, которая записана в младшем адресе. Минима- льная разница между установками составляет одну минуту. Каждые 2 секунды производится опрос кнопок на изменение режима работы. Во время инициализации включается предделитель с коэффициентом деле- ния, равным 16. Коэффициент деления таймера равен 256. Имея кварц на 4,096 МГц, прерывание по переполнению таймера будет каждые 4 мс. Значе- ние 4 мс выбрано для” организации индикации одного разряда. Прерывание ре- жима индикации выполняется после индикации каждого разряда, а прерыва- ние режима установки выходов возможно из любой точки программы. Поэтому 211
Устройства с цифровой индикацией возврат из прерывания, после восстановления сохраненных значений, в режим индикации выполняется без разрешения прерывания (командой RETURN), а в режим установки выходов — с разрешением прерывания (командой RETFIE). Для дополнения до 1 секунды служит делитель на 250. Счетчики секунд, минут и часов инкрементируются последовательно, как и в любой программе часов. При увеличении счетчика минут сбрасывается флаг выполненной уста- новки, если он был равен единице. При проверке состояния кнопок в режиме индикации производится выбор разряда установки и увеличение индицируемых значений, а также установка и выбор номера выхода, адреса записи и запись в память по выбранному адресу. На рис. 51 алгоритм работы программы проверки кнопок не показан, посколь- ку ранее неоднократно рассматривался автором. Принципиальная схема блока управления автомата показана на рис. 52. В режиме установки выходов все выводы порта «В» настроены на выход. На- стройка порта «А» в обоих режимах одинакова. В режиме индикации выходы RBO—RB3 используются для выдачи двоично-десятичного кода индицируемого числа. На выходе RB4 устанавливается значение запятой. Выход RB8 использу- ется как вход для значения состояния кнопки «Запись». На выходы RAO—RA2 выдается двоично-десятичный код для коммутации катодов индикатора. Выхо- ды RA3, RA4 используются как входы для кнопок «Разряд» и «Установка». Резервное питание на GB1 развязано от питания блока индикации и сило- вого блока диодами VD1—VD3. Поэтому микросхему DA1 можно взять с лю- бой буквой, т. к. избыток напряжения погасится падением напряжения на дио- дах до уровня рабочего напряжения микроконтроллера. Кратковременное про- падание напряжения питания не повлияет на установки выходов. Хуже, если напряжение выключено на время, за которое установка должна была включи- XS1 ХР2 Рис. 52. Управляющий автомат. Блок управления 212
Электронный домоуправ HG1 vpi DD1 КР514ВД1 АЛС318А Рис. 53. Блок индикации управляющего автомата ться и выключится. В таком случае срабатывание управляемого устройства не будет выполнено. Для подключения к блоку управления блока индикации и силового блока используются разъемы типа МРН 14-1. Принципиальная схема блока индикации показана на рис. 53. Дешифратор DD 1 преобразует двоичный код числа в его семисегментный эквивалент. Де- шифратор DD2 преобразует двоичный код в позиционный для динамической коммутации катодов индикатора. Яркость свечения индикатора можно устано- вить подбором номиналов резисторов Rl—R7. Вместо индикатора АЛС318А подойдет линейка светодиодов АЛС314А. Вместо дешифратора КР514ИД1 можно применить дешифратор типа К176ИД2 с небольшим изменением ри- сунка печатной платы. При такой замене на вход 1 дешифратора необходимо подать логическую единицу, а на входы 6 и 7 необходимо подать логический ноль. На питание микросхемы надо подать напряжение 9 вольт от платы блока управления через свободный вывод разъема. Резисторы Rl—R7 из схемы уби- раются. После такой замены ярче будут светиться светодиоды типа АЛС314А. У каждого радиолюбителя существует «своя» любимая схема включения се- тевых устройств. Для примера на рис. 54 показана схема включения нагрузки симистором ТС 106, который управляется оптроном АОУ160А. Схема показана только для первого выхода, а для остальных выходов она идентична. Симисто- ры необходимо снабдить радиаторами, размеры которых зависят от мощности нагрузки. Печатные платы для всех блоков и расположение элементов на них показа- но на рис. 55—60. Кнопки управления находятся на плате блока управления. 213
Устройства с цифровой индикацией Рис. 54. Силовой блок управляющего автомата Рис. 55. Блок управления автомата. Печатная плата Рис. 56. Блок управления автомата. Печатная плата и расположение элементов (сторона установки деталей) 214
Электронный домоуправ Рис. 57. Блок индикации управляющего автомата. Печатная плата Рис. 58. Блок индикации. Печатная плата и расположение элементов (сторона установки деталей) Линейка светодиодов АЛС318А припаивается непосредственно к плате блока индикации так, чтобы кнопки и индикатор были направлены в одну сторону. Назначение кнопок управления Кнопка «Разряд» перемещает запятую по разрядам для выбора разряда уста- новки. Кнопка «Установка» прибавляет единицу в выбранный разряд. Кнопка «Запись» производит запись в память установленных значений по выбранному адресу и для выбранного номера выхода, а также обнуление минут и секунд часов. Одновременное нажатие кнопок «Разряд» и «Установка» изменяет режим работы автомата с периодом 2 секунды с режима индикации на режим установ- ки выходов (рабочий режим). Работа с управляющим автоматом „ Перед выполнением установки необходимо отключить силовой блок от блока управления и подключить к нему блок индикации. После подачи напря- жения питания на блок управления на любом из разрядов индикатора высве- тится ноль, а остальные разряды будут погашены. Включается рабочий режим. Для перехода в режим индикации необходимо кратковременно нажать , одно- временно две кнопки: «Разряд» и «Установка». Высветятся нули во всех разря- дах, а в нулевом разряде будет 9 и запятая. Автомат перейдет в режим индика- ции. Если кнопки продолжать удерживать, то режимы будут изменяться с пе- риодом две секунды. При 9 в нулевом разряде производится установка часов, а при 8 — обнуле- ние минут и секунд. Обнуление происходит корректно при нажатии кнопки «Запись» в пределах плюс/минус минута от часа. Выбрав необходимый разряд, 215
Устройства с цифровой индикацией Рис. 59. Силовой блок управляющего автомата. Печатная плата Рис. 60. Силовой блок. Расположение элементов на плате нажатием кнопки «Разряд» производят установку значения времени кнопкой «Установка». Перемещение запятой и установка производятся с периодом, рав- ным двум секундам. Минуты устанавливаются во втором и третьем разрядах, а часы — в четвертом и пятом разрядах индикатора. При выборе разряда уста- новки запятая движется от младшего к старшему разряду. Прохождение запя- той первого разряда необходимо выполнять, не отрывая пальца от кнопки. Многократное прохождение запятой от пятого к нулевому разряду при уста- 216
Электронный домоуправ новке часов не изменяет показаний индикатора. При установке часов (8 или 9 в нулевом разряде) запятая не мигает. После установки времени перемещают запятую в нулевой разряд и устанав- ливают необходимый для коммутации номер вывода от 0 до 7. Если будет задей- ствовано много выходов, то желательно перед выполнением установки соста- вить на бумаге таблицу, в которой будут указаны: номер вывода (номер выхода от номера вывода отличается на единицу), время включения и выключения и номер адреса записи. Эта таблица окажется полезной при дальнейших переуста- новках. Дело в том, что номер вывода установки можно наблюдать при записи по известному адресу, но при считывании значения из памяти, изменениии ад- реса номер вывода на индикатор не выводится. Высвечивается только номер вывода якобы новой установки. Таблицу необходимо составлять не по возраста- нию времени (от 00 часов до 24 часов), а по возрастанию номеров выводов. При выборке данных сравнение производится по всему массиву памяти и не зависит от очередности по времени. То есть по 31 адресу можно запйсать значение: 00 часов 01 минута. Очередность номеров выводов удобна при записи в память, уменьшается количество переходов в нулевой разряд для изменения номера вывода. Кроме того, легче проследить, чтобы число установок по одному выходу было четным. Поскольку при инициализации программы все выходы обнуляются, а при пе- реходе в режим индикации состояния выходов запоминаются и потом восста- навливаются, то четность установок будет говорить о том, что коммутируемое устройство будет включено и выключено. Каждое совпадение установки по времени изменяет состояние выхода на противоположное. После установки номера вывода запятую перемещают в первый разряд. За- пятая начнет мигать с периодом две секунды. Когда запятая на индикаторе (од- ну секунду), в нулевом и первом разрядах высвечивается адрес записи. Когда запятая исчезает (на одну секунду), в нулевом разряде высвечивается номер вывода, по которому производится запись, а в первом разряде высвечивается ноль. Таким образом, при установке и записи в память на индикаторе можно постоянно контролировать номер вывода и адрес записи. Кнопкой «Установка» набирают в нулевом и первом разрядах необходимый адрес от 0 до 31, при этом запятая находится в первом разряде. Пока нажата кнопка «Установка», нет мигания запятой при любом ее расположении. После набора адреса переходят к установке времени включения/выключения, переме- щая запятую по разрядам. Запись по выбранному адресу производится при на- жатии кнопки «Запись». Запись можно произвести, если запятая не находится в нулевом или первом разрядах. Если запись произведена, запятая переместит- ся в первый разряд для выполнения установки следующего адреса. Если по вы- бранному адресу нет записи, то в разрядах часов и минут высвечиваются нули. Если по выбранному адресу есть запись, то ее значение высветится на индика- торе. Этим удобно пользоваться для просмотра выполненных записей по всем адресам. Нулевые значения записи не отслеживаются. При перемещении запятой с первого в- нулевой разряд мигание запятой бу- дет продолжаться до jex пор, пока не. будет изменен номер вывода. Показания индикатора не изменятся, потому что адрес не изменялся. При переходе в пер- вый разряд после переустановки номера вывода будет высвечиваться предыду- щий адрес с записанными по нему значениями времени. 217
Устройства с цифровой индикацией > Переход в рабочий режим желательно выполнять при запятой в первом раз- ряде. В этом положении запятой, при неодновременном.нажатии двух кнопок, невозможно случайно изменить выполненные установки. После перехода в ра- бочий режим отсоединяется плата блока индикации и подсоединяется плата силового блока. Автомат готов к работе. Если во время работы вам необходимо сделать переустановку времени включения выходов, то ее надо делать в то вре- мя, когда включено минимальное число нагрузок. После переустановки состо- яние выходов не изменяется, поэтому, чтобы получить желаемый результат, переустанавливать необходимо выключенные в данный момент выходы. ; УПРАВЛЯЮЩИЙ АВТОМАТ, ; 8 ВЫХОДОВ, 32 УСТАНОВКИ ВКЛЮЧЕНИЯ/ВЫКЛЮЧЕНИЯ ; ПЕРИФЕРИИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = UPRAT.ASM ; ВЕРСИЯ: 08-04-03'. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. f ♦INCLUDE ; P16F84A.INC - CONFIG 1 3FF1H ; ИСПОЛЬЗУЕТСЯ : KBAPL ' ЧАСТОТОЙ 4,096 МГЦ. ; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 16, ЧТО ВМЕСТЕ ; С TMR0 (256) , ЦИКЛОМ, РАВНЫМ 4 ТАКТAM И ДЕЛИТЕЛЕМ НА 250, ; ДАЕТ НА ВЫХОДЕ 1 СЕКУНДУ (4x16x256x250^4096000). ; СПЕЦ РЕГИСТРЫ. INDF EQU ООН ; ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01Н ; TMR0. OPTIONR . EQU 81Н ; OPTION (RP0=l). PC EQU 02Н ; СЧЕТЧИК КОМАНД. STATUS EQU ОЗН ; РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04Н ; РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ. PORTA EQU 05Н- ; ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06Н ; ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85Н ; НАПРАВЛЕНИЯ- ДАННЫХ ПОРТА А? TRISB EQU 8 6Н ; НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. EEDATA EQU 08Н ; данных пзу; EEADR EQU 09Н ; АДРЕСА ПЗУ. *• EECON1 EQU В8Н ; РЕГИСТРЫ ЧТЕНИЯ-ЗАПИСИ EECON2 EQU 89Н ; ПЗУ. INTCON EQU 0BH ; РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ. SCO EQU 1 ОСН /МЛАДШИЙ РАЗРЯД СЧЕТЧИКА. *SQ1 EQU 1 0DH / 218
Электронный домоуправ SC2 EQU OEH SC3 EQU OFH f SC4 EQU 10H SC5 EQU 11H /СТАРШИЙ РАЗРЯД. COUE EQU 12H /СЧЕТЧИК ЦИКЛОВ СЧИТЫВАНИЯ И ЗАПИСИ SMC EQU 13H /СЧЕТЧИК 4 МИЛЛИСЕКУНД. CAT EQU 14H /УСТАНОВКА РАЗРЯДА ЗАПЯТОЙ. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG. •—газззяз—зззх=звв===з===г===з=============== FLAG EQU 15Н ; 0—> ВКЛЮЧЕНИЯ ИНДИКАЦИИ. ; 1-> НОМЕР ВЫХОДА-АДРЕС. ; 2-> 1 СЕКУНДЫ. ; 3-> ФЛАГ 2 СЕКУНД. ; 4-> ВЫПОЛНЕНА УСТАНОВКА. ; 5-> НЕТ МИГАНИЯ ПРИ УСТАНОВКЕ ЧАСОВ. ; 6-> РАВЕНСТВА УСТАНОВОК И ЧАСОВ. ; 7-> УСТАНОВКА ВЫХОДОВ. • ааааг!ваааа=ааааааа=ааааааааааааааааааа ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ СЧЕТА. - • ааааааааааааааааааааааааааааааааааааа SE.CL EQU 016H ;ЕДИНИЦЫ СЕКУНД. SECH EQU 017H /ДЕСЯТКИ СЕКУНД. MINL EQU 018H /ЕДИНИЦЫ МИНУТ. MINH EQU 019H /ДЕСЯТКИ МИНУТ. HOUL EQU 020H /ЕДИНИЦЫ ЧАСОВ. HOUH EQU 021H /ДЕСЯТКИ ЧАСОВ. • aaaaaaaaa saaaas saaaaaa ааааааааааааа / РЕГИСТРЫ :.УСТАНОВКИ, ВРЕМЕННЫЕ. •aaaaaaaaa ====== saaaaaa ааааааааааааа vux EQU 023H /РЕГИСТР ИНДИКАЦИИ НОМЕРА ВЫХОДА. vuxu EQU 024H /УСТАНОВКА НОМЕРА ВЫХОДА. BUDHEX EQU 025H /ВОСЬМЕРИЧНОЕ ЗНАЧЕНИЕ НОМЕРА УСТАНОВКИ. ANOD EQU 026H /КАТОД. SEG ' EQU 027H /СЕГМЕНТЫ, ДЕСЯТИЧНОЕ ЗНАЧ.(2-10 КОД). PRB УСТАНОВКИ. EQU 028H /РЕГИСТР ХРАНЕНИЯ ЗНАЧЕНИЯ ПОРТА "В" НА ВРЕМЯ W TEMP EQU 029H /СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS TEMP EQU 02 AH /СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ. BUHL EQU 02BH /ЕДИНИЦЫ ЧАСОВ УСТАНОВКИ. BUHH EQU 02CH /ДЕСЯТКИ ЧАСОВ УСТАНОВКИ. TEMP EQU 02DH /ВРЕМЕННЫЙ ДЛЯ ЗАПИСИ/СЧИТЫВАНИЯ КОДА ВЫХОДА. FSRJTEMP EQU 02EH /ВРЕМЕННЫЙ ДЛЯ FSR. BUMHX EQU 02FH /ДЕСЯТКИ МИНУТ УСТАНОВКИ С КОДОМ ВЫХОДА. BUHHX EQU ОЗОН /ДЕСЯТКИ ЧАСОВ УСТАНОВКИ С КОДАМИ ВЫХОДА. BUM EQU 031H /ОБЩИЙ РЕГИСТР МИНУТ УСТАНОВКИ (ЕДИНИЦЫ+ДЕСЯТКИ). BUH EQU 032H /ОБЩИЙ РЕГИСТР ЧАСОВ УСТАНОВКИ (ЕДИНИЦЫ+ДЕСЯТКИ). BUML EQU 033H /ЕДИНИЦЫ МИНУТ УСТАНОВКИ. BUMH EQU 034H /ДЕСЯТКИ МИНУТ УСТАНОВКИ. ACOU EQU 035H* /СЧЕТЧИК ЦИКЛОВ ЗАПИСИ. SCOA EQU 036Н /ВРЕМЕННЫЙ ДЛЯ ЕДИНИЦ АДРЕСАчЗАПИСИ. SC1A EQU 037Н /ВРЕМЕННЫЙ ДЛЯ ДЕСЯТКОВ АДРЕСА ЗАПИСИ. 219
Устройства с цифровой индикацией ; 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'10000011' /ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=16 ...011, MOVWF OPTION_REGA80H /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВЫКЛЮЧЕНЫ. MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ = ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА MOVWF INTCON MOVLW B'00011000' / RA0-RA2-HA ВЫХОД, RA3,RA4-ВХОД. MOVWF TRISAA80H MOVLW B'00000000' ; RB0-RB7-HA ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF PORTB /ОБНУЛИМ ВЫХОДЫ. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF FLAG1 CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCI CLRF SC2 CLRF SC3 CLRF SC4 CLRF SC5 CLRF SECL CLRF SECH CLRF MINL CLRF MINH CLRF HOUL CLRF HOUH CLRF BUML CLRF BUMH CLRF BUHL CLRF BUHH CLRF SMC CLRF VUX CLRF vuxu CLRF CAT CLRF SC0A CLRF SC1A MOVLW .9 MOVWF SCO GOTO ZIKL /ИДЕМ НА ИНДИКАЦИЮ. ; 3. ВЫБОР ВКЛЮЧАЕМОГО/ВЫКЛЮЧАЕМОГО РАЗРЯДА. PCUX MOVFW VUX ~ ;ПО НОМЕРУ ВЫХОДА ADDWF РС,1 ;ОПРЕДЕЛЯЕМ НОМЕР ПОРТА ДЛЯ ИЗМЕНЕНИЯ. 220
Электронный домоуправ GOTO RBO GOTO RBI GOTO RB2 GOTO RB3 GOTO RB4 GOTO RB5 GOTO RB6 GOTO RB7 ; 4. ЗАПИСЬ ЗНАЧЕНИЙ БУДИЛЬНИКОВ. ZAPBIN MOVFW SCI /ПЕРЕКОДИРОВКА ДЕСЯТИЧНОГО ЗНАЧЕНИЯ ADDWF PC, 1 /ДЕСЯТКОВ НОМЕРА УСТАНОВКИ В ДВОИЧНОЕ. RETLW B'00000000' /0. НОМЕР УСТАНОВКИ = АДРЕСУ ЗАПИСИ. RETLW B'00001010' /10 RETLW B'00010100' /20 RETLW B’OOOllllO' /30 RETLW B'00101000' ,,‘40 RETLW B'00110010’ /50 RETLW B'00111100' /60 ZAP IS MOVLW .4 /ЗАПИСЬ В ПАМЯТЬ ВОЗМОЖНА, SUBWF SC1,O /ТОЛЬКО ЕСЛИ ПЕРВЫЙ РАЗРЯД МЕНЬШЕ ИЛИ РАВЕН 3 BTFSC STATUS,0 /ЕСЛИ ЗНАЧЕНИЕ ПЕРЕНОСА ИЗМЕНИЛОСЬ, RETURN MOVLW .2 /ТО ВОЗВРАЩАЕМСЯ. /ЗАПИСЬ В ПАМЯТЬ ВОЗМОЖНА, SUBWF CAT, 0 /ЕСЛИ ЗАПЯТАЯ НЕ В НУЛЕВОМ BTFSS STATUS,0 /И НЕ В ПЕРВОМ РАЗРЯДЕ. RETURN /ИНАЧЕ ВЕРНЕМСЯ. CALL ZAPBIN /ПЕРЕКОДИРОВКА НОМЕРА УСТАНОВКИ ADDWF SCO, 0 /ИЗ ДЕСЯТИЧНОГО В ДВОИЧНОЕ числе MOVWF BUDHEX /ДЛЯ ОПРЕДЕЛЕНИЯ АДРЕСА ЗАПИСИ. ZAPOO MOVLW .32 /ЕСЛИ ДЕСЯТИЧНОЕ ЗНАЧЕНИЕ SUBWF BUDHEX,0 /номера Установки BTFSC STATUS,0 /БОЛЬШЕ ИЛИ РАВНО 32, GOTO ZABOR /ИДЁМ ОБНУЛЯТЬ. ZAPVMH MOVFW BUMH /ПЕРЕПИШЕМ ЗНАЧЕНИЯ ДЕСЯТКОВ МИНУТ MOVWF BUMHX /И ЧАСОВ В РЕГИСТРЫ,КОТОРЫЕ БУДУТ MOVFW BUHH /СОДЕРЖАТЬ РАЗРЯДЫ НОМЕРОВ ВЫХОДА MOVWF BUHHX /УСТАНОВКИ. ZAPVUX - MOVFW vuxu /ПЕРЕПИШЕМ НОМЕР ВЫХОДА УСТАНОВКИ MOVWF TEMP /ВО ВРЕМЕННЫЙ РЕГИСТР. RRF TEMP,1 /СДВИНЕМ ВПРАВО И, BTFSS STATUS,0 /В ЗАВИСИМОСТИ ОТ ЗНАЧЕНИЯ BCF BUMHX,3 /СДВИНУТОГО БИТА, BTFSC STATUS,0 /УСТАНОВИМ СВОБОДНЫЙ БИТ ДЕСЯТКОВ BSF BUMHX,3 /МИНУТ В 1 ИЛИ В 0. RRF TEMP,1 /ЕЩЕ РАЗ СДВИНЕМ РЕГИСТР И, BTFSS STATUS,0 /В ЗАВИСИМОСТИ ОТ ЗНАЧЕНИЯ BCF BUHHX,2 /СДВИНУТОГО БИТА, BTFSC STATUS,0 /УСТАНОВИМ СВОБОДНЫЙ БИТ ДЕСЯТКОВ 221
Устройства с цифровой индикацией BSF RRF BTFSS BUHHX,2 h?EMP, 1 STATUS, ;ЧАСОВ. /АНАЛОГИЧНО ВПИШЕМ 0 /СТАРШИЙ БИТ НОМЕРА ВЫХОДА BCF BUHHX,3 /В СВОБОДНЫЙ БИТ BTFSC STATUS, 0 /ДЕСЯТКОВ BSF BUHHX,3 /ЧАСОВ. ZAPISO SWAPF BUMHX,0 /ЗАПИСЬ МЛАДШЕГО И СТАРШЕГО IORWF BUML,0 /РЕГИСТРОВ МИНУТ MOVWF BUM /В ОДИН РЕГИСТР ЗАПИСИ МИНУТ. SWAPF BUHHX,0 /ЗАПИСЬ МЛАДШЕГО И СТАРШЕГО IORWF BUHL,0 /РЕГИСТРОВ ЧАСОВ MOVWF BUH /В ОДИН РЕГИСТР ЗАПИСИ ЧАСОВ. ZAPISM BTFSC ACOU,0 ;ПРИ ЕДИНИЧНОМ -ЗНАЧЕНИИ СЧЕТЧИКА GOTO ZAPISH /ИДЕМ НА ЗАПИСЬ ЧАСОВ. MOVFW BUDHEX /ПЕРЕПИШЕМ НОМЕР АДРЕСА MOVWF EEADR /В РЕГИСТР АДРЕСА ЗАПИСИ. MOVFW BUM ;ЗАПИСЫВАЕМ МИНУТЫ MOVWF EEDATA /В РЕГИСТР ДАННЫХ. GOTO ZAPISE /ЗАПИШЕМ МИНУТЫ. ZAPISH MOVFW BUDHEX /ЗНАЧЕНИЯ ЧАСОВ ЗАПИСЫВАЕМ ADDLW .32 /НАЧИНАЯ С 32 АДРЕСА. MOVWF EEADR MOVFW BUH /ПЕРЕПИШЕМ ЧАСЫ MOVWF EEDATA /В РЕГИСТР ДАННЫХ. ZAPISE BCF INTCON, GIE /ЗАПРЕТ ПРЕРЫВАНИЙ. BSF STATUS, RP0 /БАНК 1. BSF EECON1A 8ОН,WREN /РАЗРЕШЕНИЕ ЗАПИСИ. MOVLW 55H ;ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ MOVWF EECON2A 80Н // MOVLW OAAH // MOVWF EECON2A 80Н // BSF EECON1A 80H,WR /ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ. ZAPIZ BTFSS EECON1A 80Н,4 /ПОКА НЕ БУДЕТ ЗАПИСИ GOTO ZAPIZ /ХОДИМ ПО КРУГУ. BCF INTCON, б /ЗАПРЕТ ПРЕРЫВАНИЯ ПО ЗАПИСИ В ПАМЯТЬ. BCF EECON1A 80Н,4 / BCF EECON1A 80Н,WREN ;ЗАПРЕТ ЗАПИСИ. BCF STATUS, RP0 /БАНК 0. INCF ACOU,1 /+1 В СЧЕТЧИК ЦИКЛА ЗАПИСИ. MOVLW .2 /ЗНАЧЕНИЕ СЧЕТЧИКА SUBWF ACOU,0 /МОЖЕТ БЫТЬ НЕ БОЛЕЕ 1. BZ EECNOO /ЕСЛИ БОЛЬШЕ, ТО ИДЕМ ОБНУЛЯТЬ. GOTO ZAPISM /ПО КРУГУ ДО КОНЦА ЗАПИСИ МИНУТ И ЧАСОВ ZABOR • CLRF SCO /ОБНУЛИМ НУЛЕВОЙ И CLRF SCI /ПЕРВЫЙ РЕГИТРЫ УСТАНОВКИ. CLRF BUDHEX /ОБНУЛИМ АДРЕС УСТАНОВКИ. RETURN EECNOO CLRF ACOU /ПО ОКОНЧАНИИ ЗАПИСИ ОБНУЛЯЕМ СЧЕТЧИК 222
Электронный домоуправ MOVLW MOVWF RETURN .1 CAT /И УСТАНАВЛИВАЕМ ЗАПЯТУЮ ;B ПЕРВЫЙ РАЗРЯД, ИНДИЦИРУЯ ВЫПОЛНЕННУЮ ЗАПИСЬ ;ВОЗВРАТ. • 8S8SS38S8S SB 88 88 88 88 8S=88 88 88 SB 88 = = SB = = 88 88 88 SB 88 88 = 88 88 CS 88=SB 88 = = ; 5. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ. • 8888SB88S SB 888888 = = 88 = = S S SB88 88 88SB 88 = SB = = SB SB S :=s====s=== KEY BTFSC PORTA,3 /ЕСЛИ НАЖАТА КНОПКА ВЫБОРА РАЗРЯДА, GOTO KEYC /ПРОВЕРИМ КНОПКУ УСТАНОВКИ. BTFSC PORTA,4 /ЕСЛИ НАЖАТА КНОПКА УСТАНОВКИ, GOTO KEYU /ИДЕМ НА УСТАНОВКУ. KEYP BTFSS FLAG,0 /ЕСЛИ ФЛАГ 1, ПОЙДЕМ ДАЛЬШЕ, RETURN /ИНАЧЕ ВЕРНЕМСЯ. BTFSC PORTB,7 /ЕСЛИ НАЖАТА КНОПКА ЗАПИСИ, GOTO ZAP IS /ИДЕМ НА ЗАПИСЬ. RETURN /ИЛИ ВОЗВРАЩАЕМСЯ. KEYC BTFSC PORTA,4 /ЕСЛИ КНОПКА УСТАНОВКИ НАЖАТА, GOTO KEYF /ТО ИДЕМ МЕНЯТЬ ФЛАГ. BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА (ЗАПЯТОЙ) НАЖАТА, GOTO CATK /ИДЕМ УСТАНАВЛИВАТЬ РАЗРЯД. RETURN /ИЛИ ВОЗВРАЩАЕМСЯ. KEYU BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РАЗРЯДА (ЗАПЯТОЙ) НАЖАТА, GOTO KEYF /ТО ИДЕМ МЕНЯТЬ ФЛАГ. BTFSC PORTA,4 /ЕСЛИ НАЖАТА КНОПКА УСТАНОВКИ, GOTO UST /ИДЕМ НА УСТАНОВКУ. RETURN /ИЛИ ВОЗВРАЩАЕМСЯ. KEYF BCF FLAG,3 /СМЕНА ФЛАГА ВОЗМОЖНА ЧЕРЕЗ 2 СЕКУНДЫ. BTFSC FLAG,0 /СМЕНА ФЛАГА ИНДИКАЦИИ GOTO KEYFO /НА ПРОТИВОПОЛОЖНЫЙ. BSF FLAG,0 /УСТАНАВЛИВАЕМ ФЛАГ ИНДИКАЦИИ. MOVFW PORTB /СОХРАНИМ ЗНАЧЕНИЕ ПОРТА MOVWF PRB /В РЕГИСТРЕ ХРАНЕНИЯ. BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'10000000' /RB0-RB6-HA ВЫХОД, ВВ7-ВХОД. MOVWF TRISBA80H /НАПРАВЛЕНИЕ ПОРТА ДЛЯ УСТАНОВКИ. BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. GOTO KEYP /НА ПРОВЕРКУ КНОПКИ ЗАПИСИ. KEYFO BCF FLAG,0 /БРОСИМ ФЛАГ ИНДИКАЦИИ. BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. CLRF . TRISBA80H /RB0-RB7-HA ВЫХОД, ВСЕ ВЫХОДЫ УПРАВЛЯЮЩИЕ. BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. MOVFW PRB /ВОССТАНОВИМ СОХРАНЕННОЕ ЗНАЧЕНИЕ MOVWF PORTB /ПОРТА, БЫВШЕЕ ДО УСТАНОВКИ. RETURN ;ВОЗВРАЩАЕМСЯ. ; б. ВЫБОР РАЗРЯДА УСТАНОВКИ (ЗАПЯТОЙ). * s:=====s:s:========s==s==: = ================ CATK /УСТАНОВКА РАЗРЕШЕНА, ЕСЛИ ПРОШЛА 1 СЕК. BTFSS FLAG,2 RETURN 223
Устройства с цифровой индикацией INCF CAT, 1 ;+1 В СЧЕТЧИК ВЫБОРА РАЗРЯДА. BCF FLAG,2 ;ЧТОБЫ ЖДАТЬ ДО СЛЕДУЮЩЕЙ СЕКУНДЫ MOVFW CAT ;ЗАПЯТАЯ ДВИГАЕТСЯ SUBLW .6 /ДО 5 РАЗРЯДА, BTFSC STATUS,2 CLRF CAT ;ИНАЧЕ ОБНУЛЯЕМ. MOVLW .2 /ПРОВЕРИМ УСТАНОВКУ ЗАПЯТОЙ. SUBWF CAT, 0 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ SKPC /ИЛИ НУЛЕВОМ -РАЗРЯДЕ, GOTO UST /СМЕНИМ ФЛАГ. BSF FLAG,5 /ЗАПРЕТИМ МИГАНИЕ ЗАПЯТОЙ. RETURN ; 1. ВЫБОР РЕЖИМА ИНДИКАЦИИ. •=========================== ATTU BTFSC FLAG,1 /ЕСЛИ УСТАНОВЛЕН АДРЕС, GOTO ATUC /ИДЕМ НА ИНДИКАЦИЮ. MOVLW .9 /ЕСЛИ 9 В НУЛЕВОМ РАЗРЯДЕ, SUBWF SCO, 0 BZ HATU /ИДЕМ НА УСТАНОВКУ ЧАСОВ. MOVLW .8 /ЕСЛИ 8 В НУЛЕВОМ РАЗРЯДЕ, к SUBWF SCO, 0 BZ ATUC ATOO /ИДЕМ НА ОБНУЛЕНИЕ МИНУТ И СЕКУНД. MOVLW .1 /ПРОВЕРИМ УСТАНОВКУ ЗАПЯТОЙ'. SUBWF SKPNZ CAT, 0 /ЕСЛИ ЗАПЯТАЯ В ПЕРВОМ РАЗРЯДЕ, GOTO SKPNC BIN /ИДЕМ НА ИНДИКАЦИЮ УСТАНОВКИ ИЗ ПАМЯТИ. GOTO УСТАНОВКУ. BUST /ЕСЛИ ЗАПЯТАЯ ЗА ПЕРВЫЙ РАЗРЯДОМ, ИДЕМ НА RETURN / 8. ОБНУЛЕНИЕ МИНУТ И СЕКУНД. . ATOO CALL HATU /ПРОИНДИЦИРУЕМ ЧАСЫ. BTFSS RETURN PORTB,7 /ПРОВЕРКА НАЖАТИЯ КНОПКИ ЗАПИСИ. ; НЕТ. MOVLW .9 /ДА. SUBWF MINL,0 /ЕСЛИ В МИНУТАХ 9, BTFSC STATUS, 2 ;НАДО УВЕЛИЧИТЬ CALL HL /ЗНАЧЕНИЕ ЧАСОВ. • _ CLRF SECL /ОБНУЛЯЕМ ДЛЯ РУЧНОЙ УСТАНОВКИ CLRF SECH /ПО СИГНАЛАМ ТОЧНОГО CLRF ' MINL /ВРЕМЕНИ. CLRF MINH GOTO HATU /ПРОИНДИЦИРУЕМ НОВОЕ ЗНАЧЕНИЕ. / 9. УСТАНОВКА РАЗРЯДОВ ИНДИКАЦИИ. > •============== UST ========= ______==_== BTFSC RETURN PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РЕЖИМА НАЖАТА, ;ВОЗВРАЩАЕМСЯ. 224
Электронный домоуправ BCF FLAG,3 ;СБРОСИМ ФЛАГ 2 СЕКУНД. MOVFW CAT /ПО ПОЛОЖЕНИЮ ЗАПЯТОЙ ADDWF PC, 1 ;ОПРЕДЕЛЯЕМ РАЗРЯД УСТАНОВКИ. GOTO USTO /0 GOTO UST1 /1 GOTO UST2 /2 GOTO . UST3 /3 GOTO UST4 /4 GOTO UST5 ;5 USTO BSF FLAG,5 /ЗАПРЕЩАЕМ МИГАНИЕ ЗАПЯТОЙ. BTFSC FLAG,1 /ЕСЛИ БЫЛА ЗАПИСЬ НОМЕРА УСТАНОВКИ, CALL USTAV /ПЕРЕПИШЕМ НОМЕР УСТАНОВКИ. BCF FLAG,1 /СБРОСИМ ФЛАГ ПЕРВОГО РАЗРЯДА. BTFSS PORTA,4 /ЕСЛИ КНОПКА УСТАНОВКИ НЕ НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. INCF SCO, 1 /УВЕЛИЧИМ ЗНАЧЕНИЕ НУЛЕВОГО РАЗРЯДА. MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF SCO, 0 BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF SCO /ОБНУЛИМ РАЗРЯД, ЕСЛИ БОЛЬШЕ 9. MOVLW .8 /ЕСЛИ ЗНАЧЕНИЕ РАЗРЯДА МЕНЬШЕ 8, SUBWF SC0,0 BNC USTV /ТО ИДЕМ НА ЗАПИСЬ НОМЕРА ВЫХОДА. GOTO HATU /ЕСЛИ 8 И БОЛЕЕ, ТО ИДЕМ НА УСТАНОВКУ ЧАСОВ. USTAV MOVFW VUXU /ПЕРЕПИШЕМ НОМЕР ВЫХОДА ИЗ РЕГИСТРА УСТАНОВКИ MOVWF SCO /В РЕГИСТР ИНДИКАЦИИ. CLRF SCI /ПЕРВЫЙ РАЗРЯД ОБНУЛИМ. RETURN USTV MOVFW SCO /ПЕРЕПИШЕМ ЗНАЧЕНИЕ РАЗРЯДА MOVWF VUXU ,-в регистр' установки номера выхода. CLRF SCI /ПЕРВЫЙ РАЗРЯД ОБНУЛИМ. RETURN UST1 BCF FLAG,5 /РАЗРЕШИМ МИГАНИЕ ЗАПЯТОЙ. BTFSS FLAG,1 /ЕСЛИ БЫЛА УСТАНОВКА НОМЕРА ВЫХОДА, CALL USTA /ЗАГРУЗИМ АДРЕС ЗАПИСИ. BSF FLAG,1 /УСТАНОВИМ ФЛАГ ПЕРВОГО РАЗРЯДА. BTFSS PORTA,4 /ЕСЛИ'КНОПКА УСТАНОВКИ НЕ НАЖАТА, RETURN ;ВОЗВРАЩАЕМСЯ. MOVFW SCI /ЕСЛИ ДЕСЯТКИ ADDLW -3H /РАВНЫ 3, BZ UST10 /ПРОВЕРИМ ЕДИНИЦЫ. MOVFW SCO /ЕСЛИ ЕДИНИЦЫ РАВНЫ 9, ADDLW -9H BZ USTO1 /УВЕЛИЧИМ ДЕСЯТКИ. INCF ' SCO,1 /ИНАЧЕ УВЕЛИЧИМ ЕДИНИЦЫ. ! GOTO USTAlT /СОХРАНИМ УСТАНОВКИ. UST10 MOVFW SCO /НОМЕР УСТАНОВКИ ДОЛЖЕН БЫТЬ НЕ БОЛЕЕ 31. в Зак. 2418 225
Устройства с цифровой индикацией ADDLW -1H /ЕСЛИ ЕДИНИЦЫ =1, BZ USTOO /ИДЕМ ОБНУЛЯТЬ. INCF SCO, 1 /ИЛИ ПРИБАВИМ ЕДИНИЦУ. GOTO USTAL /СОХРАНИМ УСТАНОВКИ. USTA MOVFW SCOA /ВОССТАНОВИМ АДРЕС ЗАПИСИ MOVWF SCO /НУЛЕВОГО И MOVFW SC1A /ПЕРВОГО РАЗРЯДОВ. MOVWF SCI RETURN USTAL MOVFW SCO /СОХРАНИМ АДРЕС ЗАПИСИ MOVWF SCOA /НУЛЕВОГО И MOVFW SCI /ПЕРВОГО РАЗРЯДОВ. . MOVWF SC1A RETURN USTOO CLRF SCO /ОБНУЛИМ ЕДИНИЦЫ. CLRF SCI /ОБНУЛИМ ДЕСЯТКИ. GOTO USTAL /СОХРАНИМ УСТАНОВКИ. USTO1 CLRF SCO • /ОБНУЛИМ ЕДИНИЦЫ. INCF SCI, 1 /УВЕЛИЧИМ ДЕСЯТКИ. GOTO USTAL /СОХРАНИМ УСТАНОВКИ. ======== —————————— ============================= UST2 INCF SC2,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW •10 9 SUBWF SC2, 0 9 BTFSC STATUS,0 9 CLRF SC2 GOTO UST6 /ПРОИНДИЦИРУЕМ УСТАНОВЛЕННОЕ ЗНАЧЕНИЕ UST3 INCF SC3,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 5. MOVLW .6 9 SUBWF SC3, 0 9 BTFSC STATUS,0 9 ‘ CLRF SC3 GOTO UST6 /ПРОИНДИЦИРУЕМ УСТАНОВЛЕННОЕ ЗНАЧЕНИЕ UST4 - INCF SC4,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. MOVLW .10 9 SUBWF SC4,0 9 BTFSC STATUS,0 9 CLRF . SC4 GOTO UST6 /ПРОИНДИЦИРУЕМ УСТАНОВЛЕННОЕ- ЗНАЧЕНИЕ UST5 INCF SC5,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. MOVLW .3 9 SUBWF SC5, 0 9 BTFSC STATUS,0 CLRF SC5 GOTO UST6 /ПРОИНДИЦИРУЕМ УСТАНОВЛЕННОЕ ЗНАЧЕНИЕ 226
Электронный домоуправ • ============ ; 10. ЗАПИСЬ S===================== УСТАНОВОК В РЕГИСТРЫ. • ====== = ===== ====================== UST6 BTFSC FLAG,1 /ЕСЛИ БЫЛ НОМЕР УСТАНОВКИ, GOTO BUST /ЗАПИШЕМ В РЕГИСТРЫ УСТАНОВКИ. BTFSS FLAG,1 /ЕСЛИ ЗАПЯТАЯ В НУЛЕВОМ РАЗРЯДЕ GOTO HUST /ЗАПИШЕМ В РЕГИСТРЫ ЧАСОВ. RETURN * ================================================== ; 11. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ. BUST HUST BCF FLAG,5 /РАЗРЕШИМ МИГАНИЕ ЗАПЯТОЙ. MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ РЕГИСТРОВ ИНДИКАЦИИ MOVWF BUML /В РЕГИСТРЫ УСТАНОВОК. MOVFW SC3 9 MOVWF BUMH 9 MOVFW SC4 ! MOVWF BUHL 9 MOVFW SC5 9 MOVWF BUHH 9 RETURN MOVFW SC2 /ПЕРЕПИШЕМ ЗНАЧЕНИЯ РЕГИСТРОВ ИНДИКАЦИИ MOVWF MINL /В РЕГИСТРЫ ЧАСОВ. MOVFW SC3 ' / MOVWF MINH 9 MOVFW SC4 9 MOVWF HOUL 9 MOVFW SC5 9 MOVWF HOUH 9. RETURN ; 12. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА. • ====================== ================ = HATU BTFSC PORTA,3 /ЕСЛИ КНОПКА ВЫБОРА РЕЖИМА НАЖАТА RETURN /ВОЗВРАЩАЕМСЯ. BSF FLAG,5 /НЕТ МИГАНИЯ 0 И 1 РАЗРЯДОВ. MOVFW MINL /ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ MOVWF SC2 /ЗНАЧЕНИЯ РЕГИСТРОВ ЧАСОВ. MOVFW MINH 9 , MOVWF SC3 9 MOVFW HOUL 9 ’ MOVWF SC4 9 MOVFW HOUH 9 MOVWF SC5 9 RETURN 9 BIN BSF FLAG,1 CALL USTA* /ЗАПОЛНИМ НУЛЕВОЙ И 1 РАЗРЯДЫ. BCF FLAG,5 /РАЗРЕШАЕМ МИГАНИЕ ЗАПЯТОЙ. / CALL ZAPBIN /ПЕРЕКОДИРОВКА НОМЕРА УСТАНОВКИ 227
Устройства с цифровой индикацией ADDWF SC0,0 /ИЗ ДЕСЯТИЧНОГО В ДВОИЧНОЕ MOVWF BUDHEX /ЧИСЛО. MOVWF COUE /ПЕРЕПИШЕМ ЕГО В СЧЕТЧИК АДРЕСА. BlNHB CALL AKTETE /СЧИТАЕМ ЗНАЧЕНИЕ УСТАНОВКИ MOVFW EEDATA /ПО ЭТОМУ АДРЕСУ. MOVWF BUML „ / РАСШИФРУЕМ ЗНАЧЕНИЕ ПО МЛАДШЕМУ MOVLW B'OOOOllll'z ANDWF BUML,1 MOVFW EEDATA MOVWF BUMHX /И СТАРШЕМУ РЕГИСТРАМ МИНУТ. MOVWF TEMP /МЛАДШИЙ БИТ НОМЕРА ВЫХОДА ЗАПИСАН В СТАРШЕМ БИТЕ RLF TEMP, 1 /СЧИТАННОГО РЕГИСТРА МИНУТ.' BTFSS STATUS,0 /ВЫДЕЛИМ' И ПЕРЕПИШЕМ МЛАДШИЙ БИТ BCF VUX,0 /В НУЛЕВОЙ БИТ РЕГИСТРА ВЫХОДА BTFSC STATUS,0 /В ЗАВИСИМОСТИ ОТ'ЕГО ЗНАЧЕНИЯ BSF VUX,0 /ЛИБО 0, ЛИБО 1. SWAPF BUMHX,1 /ВЫДЕЛИМ 3 ЗНАЧАЩИХ РАЗРЯДА MOVLW В'00000111'/ДЕСЯТКОВ МИНУТ ANDWF BUMHX,0 /В РЕГИСТР УСТАНОВКИ MOVWF BUMH /ДЕСЯТКОВ МИНУТ. MOVLW .32 /МИНУТЫ ЗАПИСАНЫ ДО 31 АДРЕСА, ADDWF COUE,1 /ЧАСЫ С 32 АДРЕСА. CAJjL AKTETE /СЧИТАЕМ ЗНАЧЕНИЕ ЧАСОВ. MOVFW EEDATA /РАСШИФРУЕМ ЗНАЧЕНИЕ ПО-МЛАДШЕМУ MOVWF BUHL MOVLW B'OOOOllll'z ANDWF BUHL,1 MOVFW EEDATA MOVWF BUHHX /И СТАРШЕМУ РЕГИСТРАМ ЧАСОВ. MOVWF TEMP /ВЫДЕЛИМ ВТОРОЙ БИТ RLF TEMP,1 /НОМЕРА ВЫХОДА BTFSS STATUS,0 /И ПЕРЕПИШЕМ ЕГО ЗНАЧЕНИЕ BCF VUX,2 >В РЕГИСТР ВЫХОДА. BTFSC STATUS,0 ; BSF VUX,2 RLF TEMP,1 /ВЫДЕЛИМ ПЕРВЫЙ БИТ BTFSS STATUS,0 /НОМЕРА ВЫХОДА BCF VUX,1 /И ПЕРЕПИШЕМ ЕГО ЗНАЧЕНИЕ BTFSC STATUS,0 /В РЕГИСТР ВЫХОДА. BSF VUX,1 SWAPF BUHHX,1 /ВЫДЕЛИМ ДВА ЗНАЧАЩИХ РАЗРЯДА MOVLW В'00000011'/ДЕСЯТКОВ ЧАСОВ ANDWF BUHHX,0 /И ПЕРЕПИШЕМ ИХ MOVWF BUHH /В РЕГИСТР ЧАСОВ УСТАНОВОК. MOVLW .32 /ПРИВЕДЕМ ЗНАЧЕНИЕ / SUBWF COUE,1 /СЧЕТЧИКА АДРЕСА В ДИАПАЗОН МИНУТ. BTFSS FLAG,0 /ЕСЛИ ВКЛЮЧЕН ФЛАГ ИНДИКАЦИИ, RETURN % . /ПРОПУСТИМ ВОЗВРАТ. MOVFW BUML /ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ 228
Электронный домоуправ MOVWF SC2 /СЧИТАННЫЕ ЗНАЧЕНИЯ УСТАНОВОК MOVFW BUMH /ПЕРЕПИШЕМ ЗНАЧЕНИЯ МИНУТ MOVWF SC3 /В РЕГИСТРЫ ИНДИКАЦИИ. MOVFW BUHL /ПЕРЕПИШЕМ ЗНАЧЕНИЯ ЧАСОВ MOVWF SC4 /В РЕГИСТРЫ ИНДИКАЦИИ. MOVFW BUHH f MOVWF SC5 t RETURN ; 13. ПП. ИНДИКАЦИИ С ВЫХОДОМ В ДВОИЧНО-ДЕСЯТИЧНОМ КОДЕ. ZIKL ZIKL BTFSC FLAG,3 ./РАЗ В ДВЕ СЕКУНДЫ CALL BCF . KEY FLAG,7 /ПРОВЕРИМ КНОПКИ. /СБРОСИМ ФЛАГ УСТАНОВКИ. CLRF ANOD /ОБНУЛЯЕМ РЕГИСТР АНОДА. ZSO BSF BTFSC GOTO BTFSC INTCON,7 FLAG,5 ZSOO FLAG,3 /РАЗРЕШАЕМ ПРЕРЫВАНИЯ. /ЕСЛИ ИНДИКАЦИЯ БЕЗ ЗАПЯТОЙ, /ИНДИЦИРУЕМ НУЛЕВОЙ РАЗРЯД. /ИЛИ, ЕСЛИ ПРОШЛО 2 СЕКУНДЫ, MOVFW BTFSS VUXU FLAG,3 /НОМЕР УСТАНАВЛИВАЕМОГО ВЫХОДА. /ЕСЛИ ПРОШЛО 2 СЕКУНДЫ, ZSOD MOVFW CALL SCO INDZIKL /ПЕРЕПИШЕМ ЗНАЧЕНИЕ НУЛЕВОГО РАЗРЯДА ИНДИКАЦИИ /И ПОЙДЕМ НА ИНДИКАЦИЮ. ZSO1 BTFSS INTCON,7 /ЖДЕМ ПРЕРЫВАНИЯ. GOTO ZS1 /ПОСЛЕ ОТРАБОТКИ ПРЕРЫВАНИЯ /РАЗРЯДУ. ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ZS1 GOTO ZS01 /ХОДИМ ПО КРУГУ. BSF BTFSC GOTO BTFSS INTCON,7 FLAG,5 ZS10 FLAG,3 / РАЗРЕШАЕМ .ПРЕРЫВАНИЯ. /ЕСЛИ ИНДИКАЦИЯ БЕЗ ЗАПЯТОЙ, /ОБНУЛЯЕМ. /ЕСЛИ ПРОШЛО 2 СЕКУНДЫ, MOVFW BTFSC SCI FLAG,3 /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ПЕРВОГО /ЕСЛИ ПРОШЛО 2 СЕКУНДЫ; РАЗРЯДА ИНДИКАЦИИ, ZS10 ZS12 MOVLW CALL BTFSS .0 INDZIKL INTCON,7 /ПЕРВЫЙ РАЗРЯД РАВЕН НУЛЮ. /ПОЙДЕМ НА ИНДИКАЦИЮ. /ЖДЕМ ПРЕРЫВАНИЯ. GOTO ZS2 /ПОСЛЕ ОТРАБОТКИ ПРЕРЫВАНИЯ /РАЗРЯДУ. ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ ZS2 GOTO ZS12 /ХОДИМ ПО КРУГУ. BSF INTCON,7 /РАЗРЕШАЕМ ПРЕРЫВАНИЯ. ZS23 MOVFW CALL BTFSS SC2 INDZIKL INTCON,7 /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВТОРОГО /И ПОЙДЕМ НА ИНДИКАЦИЮ. /ЖДЕМ ПРЕРЫВАНИЯ. РАЗРЯДА ИНДИКАЦИИ GOTO ZS3 /ПОСЛЕ ОТРАБОТКИ ПРЕРЫВАНИЯ /РАЗРЯДУ. ПЕРЕХОДИМ К СЛЕДУЮЩЕМУ 229
Устройства с цифровой индикацией GOTO ZS23 ;ХОДИМ ПО КРУГУ. ZS3 BSF INTCON,7 /ВСЕ ОСТАЛЬНЫЕ РАЗРЯДЫ ИНДИЦИРУЕМ АНАЛОГИЧНО ;ВТОРОМУ. MOVFW SC3 / CALL INDZIKL CALL ATTU ;ПРОИНДИЦИРУЕМ ЗНАЧЕНИЯ РЕЖИМОВ. ZS34 BTFSS INTCON,7 9 / GOTO ZS4 9 GOTO ZS34 9 ZS4 BSF INTCON,7 9 MOVFW SC4 9 CALL INDZIKL 9 ZS45 DTFSS INTCON,7 9 GOTO ZS5 9 GOTO ZS45 9 ZS5 BSF INTCON,7 9 MOVFW SC5 9 CALL INDZIKL 9 ZS50 BTFSS INTCON,7 9 GOTO ZIKL 9 GOTO ZS50 9 INDZIKL BTFSS FLAG,0 /ЕСЛИ ФЛАГ УСТАНОВКИ НУЛЕВОЙ, GOTO INDVUX /ИДЕМ УСТАНАВЛИВАТЬ ВЫХОДЫ. MOVWF SEG ;ЗАПИСЬ ЗНАЧЕНИЯ РАЗРЯДА ВО ВСПОМОГАТЕЛЬНЫЙ РЕГИСТР BTFSC FLAG,5 ;ЕСЛИ ФЛАГ ВКЛЮЧЕН, GOTO INDZ /ИДЕМ ИНДИЦИРОВАТЬ ЗАПЯТУЮ. BTFSC FLAG,3 /ЕСЛИ ПРОШЛО 2 СЕКУНДЫ, GOTO INDZO ;ИНДИЦИРУЕМ БЕЗ ЗАПЯТОЙ INDZ MOVFW ANOD /ЗАГРУЖАЕМ НОМЕР КАТОДА. SUBWF CAT, 0 /СРАВНИВАЕМ С ПОЛОЖЕНИЕМ ЗАПЯТОЙ. SKPNZ /ЕСЛИ ОНИ СОВПАДАЮТ, BSF SEG, 4 /ТО УСТАНОВИМ РАЗРЯД ЗАПЯТОЙ. SKPZ 9 INDZO BCF SEG, 4 /ИНАЧЕ СБРОСИМ ЗАПЯТУЮ. MOVFW SEG /ПЕРЕПИШЕМ СФОРМИРОВАННОЕ ЗНАЧЕНИЕ MOVWF PORTB /В ВЫХОДНОЙ РЕГИСТР ПОРТА В. MOVFW ANOD /ЗАГРУЖАЕМ НОМЕР КАТОДА MOVWF PORTA /В ПОРТ А. INCF ANOD,1 ;+1 В РЕГИСТР КАТОДА. RETURN /ПЕРЕЙДЕМ К СЛЕДУЮЩЕМУ РАЗРЯДУ. / 14. УСТАНОВКА ВЫХОДОВ. INDVUX BSF INTCON,7 /РАЗРЕШАЕМ ПРЕРЫВАНИЯ. 230
Электронный домоуправ BTFSC FLAG,3 /РАЗ В ДВЕ СЕКУНДЫ CALL KEY ;ПРОВЕРИМ КНОПКИ. BSF FLAG,7 /ВКЛЮЧИМ ФЛАГ УСТАНОВКИ выходов. BTFSC FLAG,0 /ЕСЛИ ВКЛЮЧЕН ФЛАГ ИНДИКАЦИИ, GOTO ZIKL /ПОЙДЕМ НА ИНДИКАЦИЮ. CALL BUDC /ПРОВЕРИМ СОВПАДЕНИЕ УСТАНОВОК И ЧАСОВ BTFSS FLAG, 6' ; /ЕСЛИ СРАВНЕНИЕ ВЫПОЛНЕНО, GOTO ' INDVUX /ЖДЕМ СБРОСА ФЛАГА. BTFSC FLAG,4 /ЕСЛИ УСТАНОВКА УЖЕ ВЫПОЛНЕНА, GOTO INDVUX /ЖДЕМ СЛЕДУЮЩЕЙ УСТАНОВКИ. BSF FLAG,4 /ВКЛЮЧИМ ФЛАГ ВЫПОЛНЕННОЙ УСТАНОВКИ. GOTO PCUX /УЗНАЕМ, "КАКОЙ ВЫХОД УСТАНАВЛИВАТЬ. RBO BTFSC PORTB,0 /ЕСЛИ НА ВЫХОДЕ БЫЛА- ЛОГ. 1, GOTO t RBOQ /УСТАНОВИМ ЛОГ. 0. BSF PORTB,0 /ИНАЧЕ УСТАНОВИМ ЛОГ. 1. GOTO INDVUX /ИДЕМ ЖДАТЬ СЛЕДУЮЩЕЙ УСТАНОВКИ. RBOO BCF PORTB,0 /УСТАНОВИМ ЛОГ. 0. GOTO INDVUX /ИДЕМ ЖДАТЬ СЛЕДУЮЩЕЙ УСТАНОВКИ. RBI BTFSC PORTB,1 /ОСТАЛЬНЫЕ ВЫХОДЫ, ' АНАЛОГИЧНО GOTO RB10 /НУЛЕВОМУ, ИЗМЕНЯЮТ BSF PORTB,1 /УРОВЕНЬ НА ПРОТИВОПОЛОЖНЫЙ. GOTO INDVUX 9 RB10 BCF PORTB,1 9 GOTO INDVUX 9 RB2 BTFSC PORTB,2 9 ч GOTO RB20 9 BSF PORTB,2 9 GOTO INDVUX 9 RB20 BCF PORTB,2 9 GOTO INDVUX 9 RB3 BTFSC PORTB,3 9 GOTO RB30 9 BSF PORTB,3 9 GOTO INDVUX RB30 BCF PORTB,3 9 GOTO INDVUX 9 v 1 RB4 BTFSC PORTB,4 9 GOTO RB40 9 BSF PORTB,4 9 GOTO INDVUX 9 RB40 BCF PORTB,4 9 GOTO INDVUX 9 RB5 BTFSC PORTB,5 9 231
Устройства с цифровой индикацией GOTO RB50 BSF PORTB,5 GOTO INDVUX RB50 BCF ' PORTB,5 GOTO INDVUX RB6 BTFSC PORTB,6 GOTO . RB60 BSF PORTB,6 GOTO INDVUX RB60 BCF PORTB,6 GOTO INDVUX RB7 . BTFSC PORTB,7 GOTO RB70 BSF PORTB,7 GOTO INDVUX RB70 BCF PORTB,7 GOTO INDVUX / = * ; 15. СРАВНЕНИЕ РЕГИСТРОВ УСТАНОВОК И ЧАСОВ. — — — — — - BUDC BTFSC FLAG,6 ;СРАВНЕНИЕ ВЫПОЛНЕНО? RETURN /ДА. BTFSC FLAG,0 /ИДЕТ УСТАНОВКА? RETURN /ДА. CLRF COUE ;НАЧНЕМ СРАВНЕНИЕ С НУЛЕВОГО ЗНАЧЕНИЯ СЧЕТЧИКА /АДРЕСА. ; СРАВНЕНИЕ НА НОЛЬ, НУЛЕВЫЕ ЗНАЧЕНИЯ НЕ СРАВНИВАЮТСЯ. BUDOO CALL BINHB /СЧИТАЕМ ЗНАЧЕНИЕ ИЗ ПАМЯТИ И РАСШИФРУЕМ ЕГО MOVLW .0 BCF STATUS,2 SUBWF BUML,0 /ЕСЛИ ХОТЯ БЫ ОДИН BTFSS STATUS,2 /РЕГИСТР НЕ РАВЕН НУЛЮ, GOTO BUDM /ИДЕМ НА СРАВНЕНИЕ УСТАНОВОК С ЧАСАМИ. MOVLW .0 BCF STATUS,2 SUBWF BUMH,0 BTFSS STATUS,2 GOTO BUDM MOVLW .0 BCF STATUS,2 SUBWF BUHL,0 BTFSS STATUS,2 GOTO BUDM 232
Электронный домоуправ MOVLW .0 BCF STATUS,2 /ЕСЛИ ВСЕ РЕГИСТРЫ SUBWF BUHH,0 ;РАВНЫ НУЛЮ, BTFSC STATUS,2 /ТО УВЕЛИЧИМ АДРЕС GOTO BUDM1 /И ПРОВЕРИМ СЛЕДУЮЩУЮ ЗАПИСЬ ; СРАВНЕНИЕ УСТАНОВОК С ЧАСАМИ. BUDM MOVFW BUML ; СРАВНИМ' ЗАПИСАННЫЕ МИНУТЫ SUBWF MINL,0 /С РЕАЛЬНЫМИ. SKPZ GOTO BUDM1 /ЕСЛИ НЕТ РАВЕНСТВА, /ТО УВЕЛИЧИМ АДРЕС. MOVFW BUMH ;ИНАЧЕ СРАВНИМ ДЕСЯТКИ МИНУТ. SUBWF MINH,0 f SKPZ GOTO BUDM1 ;УВЕЛИЧИМ АДРЕС. / MOVFW BUHL /СРАВНИМ ЗАПИСАННЫЕ ЧАСЫ SUBWF HOUL,0 ;С РЕАЛЬНЫМИ. SKPZ GOTO BUDM1 /ЕСЛИ НЕТ РАВЕНСТВА, /ТО УВЕЛИЧИМ АДРЕС. MOVFW BUHH /ИНАЧЕ СРАВНИМ ДЕСЯТКИ ЧАСОВ. SUBWF HOUH,0 SKPNZ BSF FLAG,6 /ЕСЛИ ЕСТЬ ПОЛНОЕ СОВПАДЕНИЕ РЕГИСТРОВ, /ТО УСТАНОВИМ ФЛАГ РАВЕНСТВА УСТАНОВКИ И ЧАСОВ BTFSC STATUS,2 /ЕСЛИ ЕСТЬ ПОЛНОЕ СОВПАДЕНИЕ РЕГИСТРОВ BCF FLAG,4 ' /СБРОСИМ ФЛАГ ВЫПОЛНЕННОЙ УСТАНОВКИ, BTFSC STATUS,2 /ЧТОБЫ СДЕЛАТЬ НОВУЮ УСТАНОВКУ. BUDM1 RETURN BCF STATUS,0 INCF COUE,1 /УВЕЛИЧИМ ЗНАЧЕНИЕ СЧЕТЧИКА АДРЕСА СЧИТЫВАНИЯ. MOVLW .32 /ЗНАЧЕНИЕ СЧЕТЧИКА АДРЕСА SUBWF COUE,0 /МОЖЕТ БЫТЬ НЕ БОЛЕЕ 31. BTFSC STATUS,0 /ЕСЛИ УЖЕ 32, RETURN GOTO BUDOO /ЗАКОНЧИМ СРАВНЕНИЕ. /ИЛИ ПОЙДЕМ НА ВЫБОРКУ ДРУГОГО ЗНАЧЕНИЯ. ; 16. ВЫБОРКА ИЗ ПАМЯТИ. AKTETE MOVFW COUE /УСТАНОВИМ АДРЕС И НАЧНЕМ MOVWF EEADR /СЧИТЫВАНИЕ. BSF STATUS,RPO /БАНК 1. BSF EECON1A80H,RD ;ЧТЕНИЕ. BCF STATUS, RPO /БАНК 0. MOVLW .255 /ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА, SUBWF EEDATA,0 /ЗАПИШЕМ -0. BTFSC STATES, Z CLRF ' RETURN EEDATA /ОБНУЛИМ, Т.К. 255 НЕКОРРЕКТНО Г 233
Устройства с цифровой индикацией ; 17. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК СЕКУНД. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИИ. BCF INTCON,2 /СБРОС ФЛАГА (T0IF) ПЕРЕПОЛНЕНИЯ ТАЙМЕРА ,• (РАЗРЕШАЕМ ПРЕРЫВАНИЯ) . , MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /•STATUS, MOVFW FSR_TEMP MOVWF FSR /FSR, MOVFW W_TEMP / W. BTFSS FLAG,7 /ЕСЛИ ИДЕТ УСТАНОВКА, RETURN /ТО ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ БЕЗ РАЗРЕШЕНИЯ /ПРЕРЫВАНИЯ. RETFIE /ИНАЧЕ ВОЗВРАТ С РАЗРЕШЕНИЕМ ПРЕРЫВАНИЯ. / 18. СЧЕТ Ч-М-С. \ S1 INCF SMC,1 /ДЕЛИТЕЛЬ HA 250. MOVFW SMC ADDLW -OFAH /250=0FAH. 244=F4 -ДЛЯ КВАРЦА 4.0 МГц. BZ SLF /ПРИ ПЕРЕПОЛНЕНИИ СЧЕТЧИКА, ИДЕМ ДАЛЬШЕ RETURN SLF CLRF SMC /ОБНУЛИМ 1СЧЕТЧИК МИЛЛИСЕКУНД. BSF FLAG,2 /УСТАНОВИМ ФЛАГ 1 S. BTFSS SECL,0 BSF FLAG,3 /УСТАНОВИМ ФЛАГ 2 СЕКУНД. BTFSC SECL,0 BCF FLAG,3 /СБРОСИМ ФЛАГ 2 СЕКУНД. MOVLW .9 /ЕСЛИ УЖЕ 9 СЕКУНД, SUBWF SECL,0 BC SH /ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД. INCF SECL,1 /ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ. RETURN SH CLRF SECL /ОБНУЛИМ СЕКУНДЫ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW SECH /ЕСЛИ ДЕСЯТКИ СЕКУНД ADDLW -5H /РАВНЫ 5, BZ ML /ИДЕМ СРАВНИВАТЬ МИНУТЫ. INCF SECH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД. RETURN ML CLRF SECH /ОБНУЛИМ ДЕСЯТКИ СЕКУНД. BCF FLAG,6 /СБРОСИМ ФЛАГ РАВЕНСТВА (ПРОШЛА МИНУТА) 234
Электронный домоуправ ВСЕ MOVFW ADDLW STATUS,2 MINL -9H ;СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. /ЕСЛИ ЕДИНЙЦЫ МИНУТ /РАВНЫ 9, BZ MH /ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ. INCF MINL,1 /ИНАЧЕ УВЕЛИЧИМ МИНУТЫ. RETURN MH CLRF MINL /ОБНУЛИМ ЕДИНИЦЫ МИНУТ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW MINH /ЕСЛИ ДЕСЯТКИ МИНУТ ADDLW -5H /РАВНЫ 5, BZ HL /ИДЕМ СРАВНИВАТЬ ЧАСЫ. INCF MINH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ RETURN HL CLRF MINH /ОБНУЛИМ ДЕСЯТКИ МИНУТ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW HOUH /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -2H /РАВНЫ 2, BZ HL4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. MOVFW HOUL /ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9, ADDLW -9H BZ HH /УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ. INCF HOUL,1 /ИНАЧЕ УВЕЛИЧИМ ЕДИНИЦ^ ЧАСОВ RETURN HL4 BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW HOUL /ЕСЛИ ЕДИНИЦЫ ЧАСОВ ADDLW -3H /РАВНЫ 3, BZ HH /ИДЕМ ОБНУЛЯТЬ. INCF HOUL,1 /ИЛИ ПРИБАВИМ ЕДИНИЦУ. RETURN HH CLRF HOUL /ОБНУЛИМ ЕДИНИЦЫ ЧАСОВ. BCF STATUS,2 /СБРОСИМ БИТ ПРИЗНАКА НУЛЯ. MOVFW HOUH /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -2H /РАВНЫ ДВУМ, BZ DL /ИДЕМ ОБНУЛЯТЬ. INCF HOUH,1 /ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ RETURN DL CLRF HOUH /ОБНУЛИМ ДЕСЯТКИ ЧАСОВ. RETURN END 235
Устройства с индикацией точечными светодиодами Предлагаю несколько интересных вариантов устройств без привычной циф- ровой индикации. Два автомата суточного включения нагрузки Устройство предназначено для включения и выключения нагрузки в фикси- рованное время в течение суток. Нагрузкой могут быть телефон или квартир- ный звонок с отключением их на ночь, насос для поливки на даче или охран- ная сигнализация. Рассматриваются два варианта устройства. Первый вариант предусматривает предварительную установку часов и времени включения и вы- ключения нагрузки при помощи двух кнопок и двух светодиодов. Второй вари- ант автомата устанавливает время включения и выключения нагрузки при по- мощи одной кнопки. Кнопка нажимается в необходимый момент времени включения и. выключения нагрузки. Устройство с установкой часов и времени включения и выключения удобно использовать, если необходимо делать установки за один раз и изменять их че- рез некоторое время. Индикация установок осуществляется двумя светодиода- ми красного и желтого цвета. Под каждым светодиодом ставится кнопка уста- новки, которая далее будет называться цветом своего светодиода (красная кнопка, желтая кнопка). Светодиод красного цвета индицирует значение реги- стра десятков часов, а светодиод желтого цвета индицирует значение регистра единиц часов. Поскольку индикация всех установок одинакова, то отличить их можно только по частоте мигания светодиодов. Рассмотрим алгоритм работы программы автомата суточного включения нагрузки, показанный на рис. 61. После пуска и инициализации регистров проверяется флаг установки. Если установки нет,, гасятся светодиоды и еще раз проверяется флаг установки. Если подтверждается отсутствие установки, производится сравнение значения регистра часов с регистром времени вклю- чения. При их совпадении выход устанавливается в единицу и сравнение по- вторяется. Если регистры не совпадают, проверяется совпадение значений ре- гистра часов и времени выключения. При их совпадении выход обнуляется и сравнение повторяется. Во время работы устройства процессор выполняет по- стоянное сравнение. После нажатия двух кнопок одновременно во время прерывания (будет по- казано ниже) сбрасывается флаг сравнения, и устройство переходит в режим установки. На две секунды включаются оба светодиода. После отработки двух секунд проверяются нажатые кнопки. По тому, какая кнопка нажата, устанав- 236
Два автомата суточного включения нагрузки Рис. 61. Алгоритм работы программы автомата суточного включения нагрузки ливается соответствующий флаг, и программа зацикливается еще на две секун- ды. Это необходимо для устранения дребезга контактов и предотвращения не- верного срабатывания при неодновременном нажатии (отпускании) кнопок. Пока кнопки нажаты, установок и индикации нет. После отпускания кнопок гасятся светодиоды и проверяется выбранный режим индикации установки. В соответствии с выбранным режимом производится индикация времени включения, выключения или часов. Все три режима индикации идентичны и отличаются лишь временем свечения светодиодов. 237
Устройства с индикацией точечными светодиодами Алгоритм работы программы индикации показан на рис. 61.1. Сначала про- веряется флаг красного светодиода. Если флаг установлен, программа идет на индикацию красного светодиода, в противном случае — выключается (ёсли он горел) красный светодиод. Затем проверяется на ноль регистр индикации жел- того светодиода. Если значение регистра равно нулю, программа идет на инди- кацию красного светодиода. Если регистр не нулевой, проверяется регистр па- узы для данного режима. Это необходимо для синхронизации включения и вы- К ПРОВЕРКЕ УСТАНОВКИ Рис. 61.1. Алгоритм работы программы автомата суточного включения нагрузки. Индикация ПРЕРЫВАНИЕ Рис. 61.2. Алгоритм работы программы автомата суточного включения нагрузки. Прерывание 238
Два автомата, суточного включения нагрузки ключения светодиодов. После отработки паузы вычитается единица из регистра индикации желтого светодиода и устанавливается флаг выполненного вычитания. Включается желтый светодиод, и снова выдерживается пауза, рав- ная времени свечения светодиода. После отработки паузы желтый светодиод выключается. Теперь отрабатывается пауза, необходимая для индикации погас- шего светодиода, и сбрасывается флаг вычитания. Далее регистр индикации снова проверяется на ноль. Если регистр еще не нулевой, индикация повторя- ется. Когда регистр индикации обнулится, устанавливается флаг красного све- тодиода и производится запись в регистры индикации установленных значений ' для данного режима. Заканчивается цикл индикации проверкой флага установ- ки рис. 61. Для красного светодиода вся работа программы повторяется, но со своими значениями паузы. Прерывание программы происходит при переполнении таймера каждую четверть секунды рис. 61.2. Счетчик миллисекунд имеет коэффициент деления, равный 4, и предназначен для организации коротких вспышек светодиодов. За счетчиком миллисекунд последовательно инкрементируются регистры часов, t Далее проверяется установка флага двух секунд. Если две секунды не прошли, прерывание завершается восстановлением значений сохраненных регистров. В противном случае проверяется, нажаты ли одновременно две кнопки. Если кнопки нажаты, включается флаг установки и производится смена режима ин- дикации. Пока кнопки нажаты, установок нет и прерывание завершается. По- сле нажатия и отпускания красной или желтой кнопки прибавляется единица в соответствующий регистр установки выбранного режима. Это произойдет через ‘ две секунды после отпускания кнопок. Завершаются установки восстановлени- ' ем значений регистров. Если в течение пяти минут не нажимались одновре- менно две кнопки, программа сбрасывает флаг индикации и переходит к по- стоянному сравнению значений регистров. Схема автомата очень простая и показана на рис. 62. Прямой выход RA0 выдает логическую единицу при включении нагрузки. Инверсный выход RA1 DD1 Рис. 62. Автомат суточного включения нагрузки 239
Устройства с индикацией точечными светодиодами зарезервирован для случая необходимости включения нагрузки логическим ну- лем. Светодиоды HL1, HL2 могут быть любыми, желательно миниатюрными. Порядок работы с автоматом следующий. После подачи напряжения пита- ния на две секунды загораются оба светодиода. Светодиод красного цвета ин- дицирует значение установки десятков часов, а светодиод желтого цвета — установку единиц часов. По умолчанию первым включается режим индикации установки времени включения. Поскольку установок нет и регистры индика- ции нулевые, светодиоды будут выключены. Нажмите желтую кнопку на время не менее 2 секунд и отпустите ее. Через две секунды зажжется желтый светоди- од. Аналогично включается красный светодиод. После повторного нажатия желтой кнопки число вспышек светодиода увеличится на единицу. Нажатием двух кнопок одновременно изменяется режим индикации установки. После от- пускания двух кнопок сначала высветится значение предыдущего режима, так как установка уже была сделана, а новая установка в регистр индикации запи- шется только через две секунды после отпускания кнопок. Поэтому после оче- редной смены режима достоверная информация будет считана только после выполнения полного цикла индикации (красный — желтый). Определить, ка- кая установка в данный момент производится, можно по длительности свече- ния светодиодов. Для того чтобы невозможно было спутать короткие и длин- ные вспышки, разбег по их длительности очень большой. Короткая вспышка длится 1/4 с, а длинная — 1 с. Желтая вспышка короткая, а красная — длинная — индикация времени включения. Желтая вспышка длинная, а красная — короткая — индикация времени вы- ключения. Оба светодиода мигают короткими вспышками — индикация установки ча- сов. Очередность переключения режимов следующая: включение — выключе- ние — часы — включение... При каждой установке часов обнуляется регистр минут, поэтому часы необ- ходимо устанавливать вблизи определенного часа. Значение этого времени и устанавливается. Например, вы начали установку в 19,55, значит, необходимо установить две вспышки красного светодиода (20). Установку надо выполнять как можно ближе к 20 часам. Установка значений 25 или 30 часов не поддер- живается, и регистр единиц, в первом случае, или регистр десятков, во втором случае, обнулится. Включение и выключение нагрузки будет производиться при смене часа. То есть дискретность установки равна одному часу. Через 5 минут после нажатия двух кнопок индикация выключается. Этого времени с избытком достаточно для установки одного значения единиц и десятков часов. Схема второго автомата включения нагрузки еще проще и показана на рис. 63. Это устройство хорошо использовать, когда необходимо один раз устано- вить время включения и выключения нагрузки и забыть о нем. Ну, возможно, если кварц окажется нестабильным, придется один раз в год сделать переуста- новку. Нагрузкой в данном случае может быть телефон или квартирный зво- нок, который отключается на ночь. Алгоритм работы программы этого автома- та предельно прост и не нуждается в иллюстрации. При включении устройства в любое время начинают работать «внутренние» часы. Не имеет значения, ка- 240
Два автомата суточного включения нагрузки DD1 PIC16F84A С1 ZQ1 32768 Гц Рис. 63. Автомат суточного включения нагрузки кое время «на часах» внутри микроконтроллера. В момент реального времени, когда необходимо выключить нагрузку, нажимается кнопка SA1. Нагрузка вы- ключится. В момент реального времени, когда необходимо включить нагрузку, снова нажимается кнопка. Нагрузка включится. Кнопку необходимо удержи- вать не менее 2...3 секунд. В момент нажатия кнопки значение регистров часов и минут «внутренних» часов переписывается в регистры сравнения. Каждое на- жатие кнопки изменяет установку. То есть если было установлено время вы- ключения, то следующая установка будет для времени включения. При после- дующих совпадениях значений «внутренних» часов со значениями, записанны- ми в регистры сравнения, будет каждые сутки происходить включение и выключение нагрузки. Время включения и выключения нагрузки будет повто- ряться с точностью до одной минуты. После включения напряжения питания все регистры обнуляются и совпаде- ние значений регистров будет как для включения устройства, так и для выклю- чения. Программно сделано так, чтобы в момент включения питания устройст- во было включено. Поскольку первое нажатие кнопки фиксирует момент вы- ключения нагрузки, то нажимать кнопку необходимо не ранее чем через одну минуту после включения напряжения питания. В этом случае время включения и время выключения нагрузки не будут равны друг другу. Если в течение суток не будет устанавливаться время включения нагрузки, то нагрузка будет включа- ться в то время, когда было подано напряжение питания на автомат. В данном устройстве желательно предусмотреть резервное питание от трех дисковых, ми- ниатюрных элементов. Для подключения к устройствам сетевой нагрузки можно использовать схе- му, показанную на рис. 64 [11]. На рис. 65 [12] показана схема подключения микроконтроллера к телефонной линии для выключения телефона. В данном случае микроконтроллер питается от телефонной сети. Для того чтобы можно было самим сделать ночной звонок, необходимо установить параллельно элек- тронному ключу тумблер (на схеме показан пунктиром). 241
Устройства с индикацией точечными светодиодами Rl*470 R2 100 К выходу микроконтроллера. Рис. 64. Схема коммутации сетевой нагрузки 220 В Рис. 65. Подключение микроконтроллера к телефонной линии Файл для первого варианта устройства: telef.asm, а файл для второго вариан- та устройства: knopka.asm. ; ТАЙМЕР ВЫКЛЮЧЕНИЯ ТЕЛЕФОНА НА НОЧЬ. ; ИНДИКАЦИЯ УСТАНОВКИ ДВУМЯ СВЕТОДИОДАМИ. ; УСТАНОВКА - ДВУМЯ КНОПКАМИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = TELEF.ASM ; ВЕРСИЯ: 20.02.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC _________________CONFIG 3FF0H • s=sx=s=s=es=s=s=s=s==s==s=s=s=»ees=s=sxs==s==s=s===s=s=s=s==es= ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ. 242
Два автомата суточного включения нагрузки СПЕЦ. РЕГИСТРЫ INDF EQU OOH /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H /TMRO. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05П /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRTSB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU OBH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. . ОПРЕДЕЛЕНИЕ ВХОДОВ RB0 > ВХОД КРАСНОЙ КНОПКИ. RB1 > ВХОД ЖЕЛТОЙ КНОПКИ. RB2 > ВЫХОД, КРАСНЫЙ СВЕТОДИОД. RB3 > ВЙХОД, ЖЕЛТЫЙ СВЕТОДИОД. RA0 > ВЫХОД ПРЯМОЙ (1). RA1 > ВЫХОД ИНВЕРСНЫЙ (0). ОПРЕДЕЛЕНИЕ РЕГИСТРОВ SCO EQU 10H /РЕГИСТР ИНДИКАЦИИ ЖЕЛТОГО ДИОДА. SCI EQU 11H /РЕГИСТР ИНДИКАЦИИ КРАСНОГО ДИОДА COUS EQU 12H /СЧЕТЧИК МИЛЛИСЕКУНД. ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG FLAG EQU 14Н ; 0-> ВЫКЛЮЧЕНИЕ ИНДИКАЦИИ. / 1-> ФЛАГ СЧЕТЧИКА МИЛЛИСЕКУНД. / ^-> НАЖАТА КРАСНАЯ КНОПКА. / з-> НАЖАТА ЖЕЛТАЯ КНОПКА. ; 4-> НАЖАТЫ ОБЕ КНОПКИ. / 5-> УСТАНОВКА ВКЛЮЧЕНИЯ. ; 6-> УСТАНОВКА ВЫКЛЮЧЕНИЯ. / 1~> УСТАНОВКА ЧАСОВ. FLAG1 EQU 15Н о-> 0-УСТАНОВКА ЖЕЛТОГО СВ. ДИОДА, 1-УСТАНОВКА КРАСНОГО СВ. ДИОДА / 1-> ФЛАГ УСТАНОВКИ ПОРТА. 0-ПОРТ УСТАНОВКИ ВЫКЛЮЧЕН, 1-ПОРТ УСТАНОВКИ ВКЛЮЧЕН. / 2-> ФЛАГ ДВУХ СЕКУНД (ПАУЗА). ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. UC0 EQU 16Н /ЕДИНИЦЫ ЧАСОВ ВКЛЮЧЕНИЯ. 243
Устройства с индикацией точечными светодиодами UCl EQU 17H /ДЕСЯТКИ ЧАСОВ ВКЛЮЧЕНИЯ. ucwo EQU 18H /ЕДИНИЦЫ ЧАСОВ ВЫКЛЮЧЕНИЯ. UCW1 EQU 19H /ДЕСЯТКИ ЧАСОВ ВЫКЛЮЧЕНИЯ. SEC1 EQU 1AH /СЧЕТЧИК СЕКУНД. MINI EQU 1BH ;СЧЕТЧИК МИНУТ. DSMH EQU 1CH /ВРЕМЕННЫЙ РЕГИСТР ДЛЯ ПЕРЕКОДИРОВКИ LSMH EQU 1DH /ВРЕМЕННЫЙ РЕГИСТР, МЛАДШИЙ РАЗРЯД. HOUl EQU 1EH /СЧЕТЧИК ЧАСОВ. H_LOW EQU 1FH /ЕДИНИЦЫ ЧАСОВ. H_HIGH EQU 20H /ДЕСЯТКИ ЧАСОВ. HSMH EQU 21H /ВРЕМЕННЫЙ, СТАРШИЙ РАЗРЯД. UCW EQU 22H /ВРЕМЯ ВЫКЛЮЧЕНИЯ В ЧАСАХ. UC EQU 23H /ВРЕМЯ ВКЛЮЧЕНИЯ В ЧАСАХ. MIN5 EQU 24H /РЕГИСТР СЧЕТА 5 МИНУТ. ; ВРЕМЕННЫЕ РЕГИСТРЫ. •==========: ==== = W_TEMP EQU 28H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. ’ STATUS_TEMP EQU 29H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR_TEMP EQU 2AH /ВРЕМЕННЫЙ ДЛЯ FSR. COUZ EQU 2BH /СЧЕТЧИК РЕЖИМОВ.’ 1 / 1. ПУСК. •====================: ORG О GOTO INIT ORG 4 GOTO CONST • ====== = ; 2. ИНИЦИАЛИЗАЦИЯ. • ================== INIT BSF STATUS,RPO • /ПЕРЕХОДИМ В БАНК 1. MOVLW B’00000010' /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=8 =...10 MOVWF OPTION_REGA80H MOVLW B’lOlOOOOO’’ /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0.. MOVWF INTCON MOVLW B'00000000' /ВСЕ НА ВЫХОД. MOVWF TRISAA80H MOVLW B’OOOOOOll’ ,-RB0, R31-HA ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF FLAG1 CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCO CLRF SCI CLRF UCO CLRF UCl CLRF UC CLRF UCW CLRF UCWO CLRF UCW1 CLRF J2OUS CLRF "couz 244
Два автомата суточного включения нагрузки BSF COUZ,0 /СЧЕТЧИК РЕЖИМА В 1. CLRF MIN5 CLRF LSMH CLRF HSMH CLRF SEC1 CLRF MINI CLRF HOU1 CLRF PORTB CLRF PORTA . BSF* PORTA,0 GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ. • ===== ; 3. ПРОВЕРКА НАЖАТЫХ КНОПОК. = =============== = = = = ;== = KEY KWK KWUK KHO KOZ MOVFW PORTB ;ЗАГРУЖАЕМ ПОРТ ДЛЯ ОПРЕДЕЛЕНИЯ BCF STATUS,2 ;НАЖАТЫХ ДВУХ КНОПОК. ANDLW В'00000011’/СРАВНИВАЕМ. BTFSC STATUS,2 /ЕСЛИ РАВНО 0, BSF FLAG,4 /УСТАНАВЛИВАЕМ ФЛАГ СМЕНЫ РЕЖИМА. BTFSC FLAG,4 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, BCF FLAG,0 ;СБРОСИМ ФЛАГ ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. BTFSC FLAG,4 /ЕСЛИ ФЛАГ СМЕНЫ РЕЖИМА УСТАНОВЛЕН, GOTO. KOZ. /СМЕНИМ ФЛАГИ РЕЖИМОВ. BTFSS PORTB,0 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, BSF FLAG,2 /УСТАНОВИМ ФЛАГ. BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,2 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, CALL UST‘ /ИДЕМ НА УСТАНОВКУ. BTFSS PORTB,1 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, BSF FLAG,3 /УСТАНОВИМ ФЛАГ. BTFSS PORTB,1 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,3 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, CALL UST /ИДЕМ НА УСТАНОВКУ. RETURN ' /ЕСЛИ НИЧЕГО НЕ НАЖАТО, ВОЗВРАЩАЕМСЯ. BSF FLAG,5 /УСТАНОВИМ ФЛАГ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BCF FLAG,6 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,7 RETURN BSF FLAG,6 /УСТАНОВИМ ФЛАГ УСТАНОВКИ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ BCF FLAG,5 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,7 RETURN BSF FLAG,7 /УСТАНОВИМ ФЛАГ УСТАНОВКИ ЧАСОВ. BCF FLAG,5 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,6 RETURN BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN 245
Устройства с индикацией точечными светодиодами BTFSS PORTB,1 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BCF FLAG,4 ;СБРОСИМ ФЛАГИ. BCF FLAG,3 ;ЧТОБЫ НЕ СРАБОТАЛА УСТАНОВКА BCF FLAG,2 /ПРИ НЕОДНОВРЕМЕННОМ ОТПУСКАНИИ КНОПОК CLRF MIN5 /ЧТОБЫ ПРОДЛИТЬ УСТАНОВКИ НА 5 МИНУТ. BCF FLAG1,2 /ФЛАГ 2 СЕКУНД. BCF STATUS,0 /ЧТОБЫ МЛАДШИЙ РАЗРЯД БЫЛ НУЛЕВЫМ. RLF COUZ,1 /+1 В СЧЕТЧИК РЕЖИМА. BTFSC COUZ,3. /ЕСЛИ ЕДИНИЦА УЖЕ ДОШЛА ДО 3 РАЗРЯДА, CALL KOZO /ПОЙДЕМ НА УСТАНОВКУ. BTFSC couz,o /ЕСЛИ ЕДИНИЦА, CALL. KWK /УСТАНОВИМ ФЛАГ ВКЛЮЧЕНИЯ. BTFSC COUZ,1 /ЕСЛИ ЕДИНИЦА, CALL KWUK /УСТАНОВИМ ФЛАГ ВЫКЛЮЧЕНИЯ. BTFSC COUZ,2 /ЕСЛИ ЕДИНИЦА, CALL KHO /УСТАНОВИМ ФЛАГ ЧАСОВ. RETURN KOZO CLRF COUZ BSF couz,o /УСТАНОВИМ ' РАЗРЯД. RETURN ; 4. ЗАПИСЬ УСТАНОВОК В РЕГИСТРЫ. • SSSSSSSSSSSSSSSSSSSSSSSSSSSS SS=SS= SS SS==J GS SS SS SS SSSSSS SS SS SS SS UST , BTFSS FLAG1,2 /УСТАНОВКА РАЗРЕШЕНА, ЕСЛИ ПРОШЛО 2 СЕК RETURN ' BTFSC FLAG,6 /ЕСЛИ УСТАНОВЛЕН ФЛАГ, GOTO USTW . /ИДЕМ УСТАНАВЛИВАТЬ ВРЕМЯ ВЫКЛЮЧЕНИЯ. BTFSC FLAG,7 /ЕСЛИ УСТАНОВЛЕН ФЛАГ, GOTO USTH /ИДЕМ УСТАНАВЛИВАТЬ ЧАСЫ. BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTO /УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO UST1 /УСТАНОВИМ ДЕСЯТКИ ЧАСОВ. RETURN ; 5. УСТАНОВКА ВРЕМЕНИ ВКЛЮЧЕНИЯ. 1 • SSSSSSSSSSX=SSS5SSSSSSSSS5X=SSSSS5SSS5S5SSSSSSSSSSSSSSSfsSSSS5S5SSSSX5S5SSSSSSSSeSSSSSSSSSSSSSSSS=XSSSSSS UST0 BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF UCO,1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД. UST2 MOVFW UC1 /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -002H /РАВНЫ 2, SKPNZ CALL UST4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ БЫЛА НАЖАТА КРАСНАЯ КНОПКА, RETURN /ТО ИДЕМ УСТАНАВЛИВАТЬ СТАРШИЙ РАЗРЯД MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF UC0,0 BTFSC STATUS,0 /С(ПЕРЕНОС) - 1, ЕСЛИ 10 И БОЛЕЕ. CLRF UCO /ОБНУЛИМ РЕГИСТР. 246
Два автомата суточного включения нагрузки GOTO ’ UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. UST4 MOVFW UCO /ЕСЛИ ДЕСЯТКИ ЧАСОВ РАВНЫ 2, BCF STATUS,0 /А ЕДИНИЦЫ ЧАСОВ ADDLW SKPNC -004H /РАВНЫ ИЛИ БОЛЬШЕ 4, CLRF RETURN UCO /ОБНУЛИМ ЕДИНИЦЫ ЧАСОВ. UST1 INCF UC1,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. CALL UST2 MOVLW .3 f SUBWF UC1,0 BTFSC STATUS,0 /С - 1, ЕСЛИ З'И БОЛЕЕ. CLRF UC1 /ОБНУЛИМ ДЕСЯТКИ ЧАСОВ. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. / б. УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. USTW BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTWO /УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO RETURN USTW1 /УСТАНОВИМ ДЕСЯТКИ ЧАСОВ. USTW0 BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF UCWO,1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД USTW2 MOVFW UCW1 /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -002H /РАВНЫ 2, SKPNZ CALL USTW4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. BTFSC RETURN FLAG,2 MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF UCWO,0 BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF UCWO /ОБНУЛИМ РЕГИСТР. GOTO USTW3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. USTW4 MOVFW UCWO BCF STATUS,0 ADDLW -004H' SKPNC CLRF RETURN UCWO USTW1 INCF UCW1,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. CALL USTW2 MOVLW .3 f SUBWF UCW1,0 BTFSC STATUS,0 /С = 1, ЕСЛИ 3 И БОЛЕЕ. 247
Устройства с индикацией точечными светодиодами CLRF UCW1 /ОБНУЛИМ РЕГИСТР. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO USTW3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ 7. УСТАНОВКА ЧАСОВ USTH BTFSC GOTO FLAG,3 USTHO /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, /УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO USTH1 /УСТАНОВИМ ДЕСЯТКИ ЧАСОВ. RETURN USTHO BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF H_LOW, 1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД USTH2 MOVFW H_HIGH /ЕСЛИ.ДЕСЯТКИ ЧАСОВ ADDLW -002H /РАВНЫ 2, SKPNZ CALL USTH4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 RETURN MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF H_LOW,0 BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF H_LOW /ОБНУЛИМ РЕГИСТР. GOTO USTHOO /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. USTH4 MOVFW H_LOW BCF STATUS,0 ADDLW -004H SKPNC CLRF H_LOW RETURN USTH1 INCF H_HIGH,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. CALL USTH2 MOVLW .3 9 SUBWF H_HIGH,0 BTFSC STATUS,0 /С = 1, ЕСЛИ 3 И БОЛЕЕ. CLRF H_HIGH /ОБНУЛИМ РЕГИСТР. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO USTHOO /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. ; 8. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ. • 88SS=S=SXS3SSS3S3S3SSSXB3S&5=XXS3S3S3S3SSSSS=SS2&5&5553SSS = = = »= = = = =SZZSS=X= 5SSSSSSSSS=S=X=SSS3SSS3S=S=X=S=X3S UST3 MOVFW UCO /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ ЧАСОВ MOVFW UCl /И ДЕСЯТКОВ ЧАСОВ ВРЕМЕНИ ВКЛЮЧЕНИЯ MOVWF SCI /В РЕГИСТРЫ ИНДИКАЦИИ. CALL DECBIN /ДЛЯ УДОБСТВА СРАВНЕНИЯ, ADDWF UCO, 0 /ПЕРЕКОДИРУЕМ ЗНАЧЕНИЯ MOVWF UC /В ОДИН РЕГИСТР. RETURN 248
Два автомата суточного включения нагрузки USTW3 MOVFW UCWO /АНАЛОГИЧНО ДЛЯ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. MOVWF SCO MOVFW UCW1 9 MOVWF SCI 9 CALL DECBIN 9 ADDWF UCW0,0 9 • ! MOVWF UCW 9 RETURN USTHOO CLRF MINI /ОБНУЛЕНИЕ МИНУТ ПРИ КАЖДОЙ УСТАНОВКЕ ЧАСОВ USTH3 MOVFW H_LOW /АЙАЛОГИЧНО ДЛЯ ЧАСОВ. MOVWF SCO 9 MOVFW HJ1IGH 9 MOVWF SCI 9 MOVFW H_HIGH 9 CALL DECBIN 9 ADDWF H_LOW,0 MOVWF HOU1 /ЧАСЫ: ЕДИНИЦЫ + ДЕСЯТКИ. RETURN ; 9. ТАБЛИЦА ПЕРЕКОДИРОВКИ РАЗРЯДА ДЕСЯТКОВ В БИНАРНЫЙ КОД. • ======= ====================== SB = SS = = =3S = == = SS== = = = === = SS ===S = = = DECBIN ADDWF PC, 1 RETLW B'00000000' /0 RETLW B’00001010' /10 RETLW B'00010100 ' /20 ; 10. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. COMP BTFSS FLAG,0 /ЕСЛИ ФЛАГ ВЫКЛЮЧЕНИЯ УСТАНОВКИ НУЛЕВОЙ, GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ.УСТАНОВОК. BCF FLAG,2 BCF FLAG,3 BSF PORTB,2 /ПОГАСИМ ИНДИКАЦИЮ УСТАНОВОК. BSF PORTB,3 MOVFW HOU1 /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF UCW, 0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BZ COMW /ЕСЛИ ОНИ РАВНЫ, ВЫКЛЮЧИМ выходы: MOVFW HOU1 /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF UC, 0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COM /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧИМ ВЫХОДЫ. GOTO COMP /НА СРАВНЕНИЕ. COM BSF PORTA,0 /ВЫХОД ВКЛЮЧЕН (ТЕЛЕФОН}. BCF - PORTA,1 /ВЫКЛЮЧЕН. GOTO COMP /НА СРАВНЕНИЕ. COMW BCF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. BSF PORTA,1 /ВКЛЮЧЕН. GOTO COMP /НА СРАВНЕНИЕ. 249
Устройства с индикацией точечными светодиодами ; 11. ВЫБОР РЕЖИМА ИНДИКАЦИИ. zoo BTFSC FLAG,0 /ЕСЛИ УСТАНОВКА ВЫКЛЮЧЕНА, GOTO COMP /ИДЕМ НА СРАВНЕНИЕ. BTFSS PORTB,0 /ЕСЛИ КРАСНАЯ КНОПКА НАЖАТА, BCF PORTB,3 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS PORTB,1 /ЕСЛИ ЖЕЛТАЯ КНОПКА НАЖАТА, BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД., BTFSS FLAG1,2 /ЕСЛИ 2 СЕКУНДЫ ЕЩЕ НЕ ПРОШЛО, GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,0 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ. GOTO ZOO /ВЕРНЕМСЯ. , BTFSS PORTB,1 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ. GOTO ZOO /ВЕРНЕМСЯ. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BSF PORTB,2 /ПОГАСИМ СВЕТОДИОДЫ. BSF PORTB,3 BTFSC FLAG,6 /ЕСЛИ ФЛАГ ВКЛЮЧЕН, GOTO WUKL /ИДЕМ СВЕТИТЬ ВРЕМЯ ВЫКЛЮЧЕНИЯ. BTFSC FLAG,7 /ЕСЛИ ФЛАГ ВКЛЮЧЕН,- GOTO HOKL /ИДЕМ СВЕТИТЬ ЧАСЫ. ; ===«== := ========: ========================== ; 12. ИНДИКАЦИЯ УСТАНОВКИ ВРЕМЕНИ ВКЛЮЧЕНИЯ. • ===== ;=========: ========================== WKL BTFSC FLAG1,0 /ЕСЛИ ЖЕЛТЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO ZH /ИДЕМ СВЕТИТЬ КРАСНЫЙ. ZL BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. TSTF SCO /ЕСЛИ ЗНАЧЕНИЕ SKPNZ /РЕГИСТРА НУЛЕВОЕ, GOTO ZLO /ИДЕМ ПРОВЕРЯТЬ СТАРШИЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO ZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ ЕДИНИЦА, GOTO ZOL /ДЕКРЕМЕНТИРУЕМ РЕГИСТР. DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА ИНДИКАЦИИ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ДИОД. ZOL BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА УЖЕ НУЛЕВОЙ, GOTO ZOL1 . BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. ZOL1 . TSTF SCO /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, SKPZ GOTO WKL ;ZL /НАЧНЕМ СНАЧАЛА. ZLO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO ZOL • /УСТАНОВКИ ПОРТА. BSF FLAG1,0 /УСТАНОВИМ ФЛАГ КРАСНОГО ДИОДА. 250
Два автомата суточного включения нагрузки BCF GOTO FLAG1,2 ZOO /СБРОСИМ ФЛАГ 2 СЕКУНД. /ВЫДЕРЖКА 2 СЕК. И ПРОВЕРКА НАЖАТЫХ КНОПОК ZH BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. TSTF SCI /ЕСЛИ РЕГИСТР НУЛЕВОЙ, SKPNZ GOTO ZHO /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO ZOH /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS SEC1,0 /ЕСЛИ ЕДИНИЦА, GOTO ZOH /ДЕКРЕМЕНТИРУЕМ РЕГИСТР. DECF SCI, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА ИНДИКАЦИИ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ ДИОД.’ ZOH BTFSC SEC1,O /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO BSF ZOH1 PORTB,3 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. Z0H1 TSTF SCI /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, SKPZ GOTO WKL ;ZH /НАЧНЕМ СНАЧАЛА. ZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO ZOH /УСТАНОВКИ ПОРТА. CALL UST3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ ЖЕЛТОГО ДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. / 13. ИНДИКАЦИЯ УСТАНОВКИ [ ВРЕМЕНИ ВЦКЛЮЧЕНИЯ. WUKL BTFSC FLAG1,0 /ВСЁ АНАЛОГИЧНО ВРЕМЕНИ ВКЛЮЧЕНИЯ. /ЕСЛИ ЖЕЛТЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO UZH /ИДЕМ СВЕТИТЬ КРАСНЫЙ. UZL BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. TSTF SCO /ЕСЛИ НЕТ УСТАНОВКИ, SKPNZ GOTO UZLO /РЕГИСТР НУЛЕВОЙ, /ИДЕМ ПРОВЕРЯТЬ КРАСНЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO UZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS SEC1,O /ЕСЛИ ЕДИНИЦА, GOTO UZOL /ДЕКРЕМЕНТИРУЕМ РЕГИСТР. DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF ' PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ДИОД. UZOL BTFSC SEC1,0 /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO UZOL1 BSF PORTB,2 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. . UZ0L1 TSTF SCO /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, 251
Устройства с индикацией точечными светодиодами SKPZ GOTO WUKL UZLO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO UZOL УСТАНОВКИ ПОРТА. BSF FLAG1,0 УСТАНОВИМ ФЛАГ КРАСНОГО ДИОДА. BCF FLAG1,2 СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. UZH BSF PORTB,2 ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. TSTF SCI /ЕСЛИ РЕГИСТР НУЛЕВОЙ, SKPNZ GOTO UZHO /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO UZOH /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ ЕДИНИЦА, GOTO UZOH /ДЕКРЕМЕНТИРУЕМ РЕГИСТР. DECF SC1,1 /ВЫЧТЕМ ЕДИНИЦУ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ диод. UZOH BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА НУЛЕВОЙ, GOTO UZOH1 -BSF < POR£B,3 /ВЫКЛЮЧИМ выход. UZ0H1 BCF FLAG1,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. TSTF SCI /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ SKPZ Г , GOTO WUKL UZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO UZOH /УСТАНОВКИ ПОРТА. CALL USTW3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ ЖЕЛТОГО ДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. ; 14. ИНДИКАЦИЯ УСТАНОВКИ ЧАСОВ. HOKL /ВСЁ АНАЛОГИЧНО ВРЕМЕНИ ВКЛЮЧЕНИЯ. BTFSC FLAG1,0 ' GOTO HOZH HOZL . BSF PORTB,3 TSTF SCO /ЕСЛИ НЕТ УСТАНОВКИ, SKPNZ /РЕГИСТР НУЛЕВОЙ, GOTO HOZLO /ИДЕМ ПРОВЕРЯТЬ КРАСНЫЙ РЕГИСТР. BTFSC FLAG1,1 Г GOTO HOZOL f BTFSS COUS,0 г GOTO HOZOL DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BSF FLAG1,1 BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ВЫХОД. 252
Два автомата суточного включения нагрузки HOZOL BTFSS FLAG,1 GOTO HOZOL1 BSF PORTB,2 ; ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 ; H0Z0L1 TSTF SCO i ЕСЛИ РЕГИСТР УЖЕ ПУСТОЙ,- SKPZ GOTO HOKL HOZLO BTFSC FLAG1,1 i GOTO HOZOL ; BSF FLAG1,O ; BCF FLAG1,2 9 GOTO ZOO HOZH BSF PORTB,2 TSTF SCI SKPNZ GOTO HOZHO BTFSC FLAG1,1 , GOTO HOZOH BTFSS cous,o GOTO HOZOH 4 DECF SC1,1 ВЫЧТЕМ ЕДИНИЦУ. BSF FLAG1,1 BCF PORTB,3 , /ВКЛЮЧИМ КРАСНЫЙ ДИОД. HOZOH BTFSS FLAG,1 GOTO HOZOH1 BSF PORTB,3 BCF FLAG1,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. H0Z0H1 TSTF SCI /ЕСЛИ РЕГИСТР' УЖЕ ПУСТОЙ, SKPZ GOTO HOKL HOZHO BTFSC FLAG1,1 Г GOTO HOZOH CALL USTH3 /ПЕРЕУСТАНОВИМ ЕГО. BCF FLAG1,0 9 BCF FLAG1,2 GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. ; 15. ПП. ПЕРЕКОДИРОВКИ С БИНАРНОГО В 2-10 КОД (2-_-2-10). BINDECH - MOVLW .10 /10 >W. BDH BSF STATUS,0 /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH. BNC BINDE(fL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH /ПОВТОРИТЬ. 253
Устройства с индикацией точечными светодиодами BINDECL MOVF DSMH,О ADDLW .10 ,-10+W >W. MOVWF LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. RETURN • ================================================================== ; 16. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. ; _= CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS TEMP ; MOVFW FSR /FSR. MOVWF FSR TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. BTFSC FLAG1,2 /ОПРОС КНОПОК ЧЕРЕЗ 2 СЕК. CALL KEY /ПРОВЕРИМ КНОПКИ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF • INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ,. MOVFW STATUS TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /Status, • . MOVFW FSR .TEMP й M6VWF FSR ; FSR, ; MOVLW .150 /MOVWF TMRO MOVFW W TEMP /W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. • ================== / 17. СЧЕТ. SI INCF COUS,1 /+1 В СЧЕТЧИК. BTFSS COUS,0 BSF FLAG,1 BTFSC COUS,0 BCF FLAG,1 MOVLW .4 /ЕСЛИ УЖЕ 1 СЕКУНДА, SUBWF COUS,0 9 SKPZ t RETURN CLRF COUS /ОБНУЛИМ СЧЕТЧИК. MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ,РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,F /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSC SEC1,1 /ЕСЛИ РАЗРЯД ЕДИНИЦА, BSF FLAG1,2 /УСТАНОВИМ ФЛАГ*2 СЕКУНД. RETURN 9 Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. CALL M5M /УВЕЛИЧИМ СЧЕТЧИК 5 МИНУТ. M1M MOVFW MINI ,-загрУзка минут в РАБ. РЕГИСТР. ADDLW -3BH /.-59. 254
Два автомата суточного включения нагрузки BZ INCF RETURN Hl MIN1,F /СРАВНИТЬ HA 0, ЕСЛИ РАВНО, ПЕРЕЙТИ HA Hl. /ПРИБАВИТЬ 1 В МИНУТЫ. 9 Hl CLRF MINI ;ОБНУЛЯЕМ РЕГИСТР МИНУТ. Н1Н . MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H /- 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н10. INCF HOUlfcF /ПРИБАВИТЬ 1 В ЧАСЫ. MOVFW HOU1 /HOU'>W. H1U MOVWF DSMH ,-W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF H_LOW ,-W > H_LOW В. РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF H_HIGH ,-W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. H10 CLRF RETURN LSMH /И МЛ. 9 CLRF’ HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF H_LOW /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF RETURN H_HIGH /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. M5M INCF MIN5,1 /+1 В РЕГИСТР 5 МИНУТ. MOVLW .5 /ЕСЛИ УЖЕ 5 МИНУТ, SUBWF SKPNZ MIN5,0 9 BSF SKPNZ FLAG,0 /УСТАНОВИМ ФЛАГ ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. CLRF RETURN MIN5 /И ОБНУЛИМ СЧЕТЧИК. END ; АВТОМАТ СУТОЧНОГО ВКЛЮЧЕНИЯ НАГРУЗКИ. ; БЕЗ ИНДИКАЦИИ. ; УСТАНОВКА ОДНОЙ КНОПКОЙ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = KNOPKA.ASM / ВЕРСИЯ: 23.02.03. / АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. 9Г ♦INCLUDE P16F84A.INC __CONFIG 3FF0H 255
Устройства с индикацией точечными светодиодами ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ СПЕЦ. РЕГИСТРЫ INDF EQU OOH /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H /TMRO. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU OBH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ОПРЕДЕЛЕНИЕ ВХОДОВ RB0 > ВХОД КНОПКИ. RA0 > ВЫХОД ПРЯМОЙ (1). RA1 > ВЫХОД ИНВЕРСНЫЙ (0) ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG FLAG EQU 14H 0—> НАЖАТОЙ КНОПКИ. 1-> КОММУТАЦИИ РЕЖИМОВ. 2-> 2 СЕКУНД. - ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ SEC1 EQU 1AH /СЧЕТЧИК СЕКУНД. MINI EQU 1BH /СЧЕТЧИК МИНУТ. HOU1 EQU 1EH /СЧЕТЧИК ЧАСОВ. HWK EQU 22H /ВРЕМЯ ВКЛЮЧЕНИЯ В ЧАС. HWUK EQU 23H /ВРЕМЯ ВЫКЛЮЧЕНИЯ В ЧАСАХ. MWK EQU 24H /ВРЕМЯ ВКЛЮЧЕНИЯ В МИНУТАХ. MWUK EQU 25H /ВРЕМЯ ВЫКЛЮЧЕНИЯ В МИНУТАХ ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 28H ;БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 29H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ. FSR TEMP EQU 2АН /ВРЕМЕННЫЙ ДЛЯ FSR. 1. ПУСК. ORG 0 GOTO INIT ORG 4 GOTO CONST 256
Два автомата суточного включения нагрузки / _== =___= ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO ; ПЕРЕХОДИМ В БАНК 1. MOVLW B'00000100' ; • ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=32 = MOVWF OPTION REGA80H ; MOVLW B'10100000' ; г РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0 MOVWF INTCON ; MOVLW B'00000000' ; ВСЕ НА ВЫХОД. MOVWF TRISAA80H MOVLW B'00000001' ; :RB0-HA ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO ; г ПЕРЕХОДИМ В БАНК 0. CLRF FLAG ; ;СБРАСЫВАЕМ ВСЕ ФЛАГИ. CLRF TMRO ; г ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ. CLRF HWK CLRF HWUK CLRF MWK CLRF. MWUK CLRF SEC1 CLRF MINI CLRF HOU1 CLRF PORTB CLRF PORTA BSF PORTA,0 GOTO COMP /HA СРАВНЕНИЕ. ; 3. ПРОВЕРКА НАЖАТЫХ КНОПОК. ' — KEY BTFSS PORTB,0 /ЕСЛИ НАЖАТА КНОПКА, BSF FLAG,0 /УСТАНОВИМ ФЛАГ. BCF FLAG,2 ;СБРОСИМ ФЛАГ 2 СЕКУНД. BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN • BTFSC FLAG,0 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, CALL UST /ИДЕМ НА УСТАНОВКУ. RETURN /ВОЗВРАЩАЕМСЯ. ; 4. УСТАНОВКА. UST BCF FLAG,0 /СБРОСИМ ФЛАГ КНОПКИ. BTFSS FLAG,1 /ЕСЛИ ФЛАГ НУЛЕВОЙ, GOTO UST1 /ИЗМЕНИМ ЕГО ЗНАЧЕНИЕ. BCF FLAG,1 /В ПРОТИВНОМ СЛУЧАЕ, ТОЖЕ ИЗМЕНИМ ЗНАЧЕНИЕ GOTO USTWK /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВРЕМЕНИ ВКЛЮЧЕНИЯ. UST1 BSF FLAG,1 /ФЛАГ В 1. GOTO USTWUK /ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. USTWK MOVFW HOU1 / ;ЗНАЧЕНИЕ ЧАСОВ MOVWF HWK /В РЕГИСТР ВКЛЮЧЕНИЯ. .100. ‘,9 3аГ2418 257
Устройства с индикацией точечными светодиодами MOVFW MINI /ЗНАЧЕНИЯ МИНУТ MOVWF MWK /В РЕГИСТР ВКЛЮЧЕНИЯ. RETURN USTWUK MOVFW HOUl /ЗНАЧЕНИЕ ЧАСОВ MOVWF HWUK /В РЕГИСТР ВЫКЛЮЧЕНИЯ MOVFW MINI /ЗНАЧЕНИЯ МИНУТ MOVWF MWUK /В РЕГИСТР ВЫКЛЮЧЕНИЯ RETURN ; 5. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. • ====== СОМР MOVFW HOUl /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF HWK, 0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BNZ COMP1 /ЕСЛИ ОНИ НЕ РАВНЫ, ПРОВЕРИМ ВРЕМЯ ВЫКЛЮЧЕНИЯ MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF MWK, 0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COM /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧАЕМ ВЫХОД. СОМР1 MOVFW HOUl /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF HWUK,0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BNZ COMP /ЕСЛИ ОНИ НЕ РАВНЫ, НАЧНЕМ СНАЧАЛА. MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF MWUK,0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BZ COMW /ЕСЛИ ОНИ РАВНЫ, ВЫКЛЮЧИМ выходы. GOTO COMP /НА СРАВНЕНИЕ. сом BSF PORTA, 0 /ВЫХОД ВКЛЮЧЕН (ТЕЛЕФОН). BCF PORTA, 1 /ВЫКЛЮЧЕН. GOTO COMP /НА СРАВНЕНИЕ. COMW BCF PORTA, 0 /ВЫХОД ВЫКЛЮЧЕН. BSF PORTA, 1 /ВКЛЮЧЕН. GOTO COMP /НА СРАВНЕНИЕ. • =:===========================s===========s=======:====s============s: ; б. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. ======== ============= ========================================= CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR /FSR. MOVWF FSR_TEMP CALL SI • /ПРИБАВИМ 1' В СЧЕТЧИК. BTFSC FLAG,2 CALL KEY /ПРОВЕРИМ КНОПКИ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ. MOVFW STATUS_TEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR_TEMP MOVWF FSR ; FSR, MOVFW W_TEMP /‘w. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. 258
Часы-будильник 7. СЧЕТ S1 MOVFW ADDLW SEC1 -3BH /ЗАГРУЗКА В РАБ. РЕГИСТР. /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml INCF SEC1,1 /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSC SEC1,1 /ЕСЛИ РАЗРЯД ЕДИНИЦА, BSF FLAG,2 /УСТАНОВИМ ФЛАГ 2 СЕКУНД. RETURN f J Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. M1M MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MIN1,F /ПРИБАВИТЬ 1 В МИНУТЫ. RETURN Hl CLRF MINI /ОБНУЛЯЕМ РЕГИСТР МИНУТ. H1H MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H /- 23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. RETURN H10 CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. RETURN END Часы-будильник Если внимательно посмотреть на алгоритм работы программы автомата су- точного включения нагрузки, то можно заметить, что имеется установка часов и время включения нагрузки. Если добавить в программу установку минут вместо установки времени выключения и соответственно добавить индикацию установки минут, то получим часы с индикацией точечными светодиодами. А если время включения нагрузки использовать для включения зуммера, то получатся часы с будильником. Для этого необходимо только добавить йро- грамму установки и индикации минут будильника. Все четыре алгоритма ра- боты программы установки и индикации одинаковы и отличаются лишь вре- менем мигания светодиодов и загрузкой своих (часы, минуты) значений'в ре- гистры индикации. Алгоритм работы программы часов идентичен алгоритму работы программы автомата суточного включения нагрузки, только в опрос состояния кнопок до- бавляется опрос еще одной кнопки, кнопки индикации часов. Если нажать эту 259
Устройства с индикацией точечными светодиодами кнопку, то светодиоды будут попеременно индицировать значение часов и ми- нут до тех пор, пока нажата кнопка. Схема часов показана на рис. 66. Кнопки SAI, SA2 предназначены для уста- новки времени в десятках или единицах часов и минут. Красный светодиод HL2 индицирует установленное значение в десятках, а желтый светодиод HL1 индицирует установленное значение в единицах. Кнопка SA3 используется для попеременной индикации часов и минут. К прямому выходу RA 0 плюсом под- ключается импортный звуковой излучатель типа НСМ1206х с встроенным ге- нератором. На минус излучателя подается минус 4,5 В. К инверсному выводу RA1 излучатель подключается обратной полярностью. К выходу RA2 можно подключить этот же излучатель без буквы «х» или отечественный пьезоизлуча- тель типа ЗП1. При срабатывании будильника на этот вывод подаются импуль- сы с частотой около 1 кГц с прерыванием через четверть секунды. Рис. 66. Часы с индикацией двумя светодиодами Длительности свечения светодиодов при различных установках (режимах) следующие: • желтый и красный светодиоды мигают длинными импульсами — индика- ция часов; • желтый и красный светодиоды мигают короткими импульсами — индика- ция минут; - • желтый — короткий, красный — длинный — индикация минут будильника; • желтый — длинный, красный — короткий — индикаций часов будильника. Короткая вспышка длится четверть секунды, а длинная — половину секун- ды. Перерывы между вспышками светодиода одного цвета равны длительности вспышек. Цикл индикации заканчивается паузой (светодиоды выключены) с длительностью, равной двум секундам. Логически, для лучшего запоминания, длительность горения светодиодов легко отождествить с режимом установки, если смотреть на желтый светодиод. Если вспышки короткие, значит, идет индикация минут (минуты короче ча- сов!). Если вспышки желтого светодиода длинные, значит, идет индикация ча- сов. При различных вспышках желтого и красного светодиодов — идет индика- ция установки будильника. 260
Часы-будильник Работа с часами. После подачи напряжения питания необходимо установить часы и будильник. Оба светодиода загорятся на две секунды. Программно часы переходят в режим установки часов. Можно делать установку часов. Для смены режима установки и индикации необходимо одновременно нажать красную и желтую кнопки на время не менее одной секунды. При этом оба светодиода включатся. После смены режима достоверная информация будет считываться не ранее, чем через один цикл индикации. Это связано с тем, что нажатие кно- пок можно сделать в любой момент, и, либо регистры индикации могут быть заполнены значениями предыдущей установки, и продолжать индикацию, либо будет заканчиваться индикация предыдущей установки. Желательно нажимать две кнопки во время двухсекундных пауз. Порядок смены режимов установки следующий: установка часов — установка минут — установка часов будильни- ка — установка минут будильника — установка часов... Выключение установки произойдет автоматически через пять минут после последнего нажатия двух кнопок. Каждое нажатие красной или желтой кноп- ки на время не менее одной секунды прибавляет единицу в выбранный ре- гистр и увеличивает число вспышек светодиода на единицу. Некорректная установка исправляется. При нажатии красной или желтой кнопки загорается соответствующий светодиод. Кнопки установки желательно нажимать во вре- мя двухсекундных пауз в начале и в конце каждого цикла. Нулевое значение будильника не отслеживается, поэтому если вам временно не нужен будиль- ник, то его значения необходимо установить равными нулю (светодиоды уста- новки часов и минут не горят). Соответственно, если вам необходимо звуча- ние будильника в ноль часов, ноль минут, то необходимо установить будиль- ник на одну минуту раньше или позже этого времени. Один раз установленное значение будильника будет звонить ежедневно. Время звучания будильника равно одной минуте. Выключить будильник можно, если перейти в режим установки одновременным нажатием двух кнопок. Установки делать необяза- тельно. Через пять минут индикация установок выключится. Прервать звуча- ние будильника также можно, если нажать кнопку индикации часов и удержи- вать ее некоторое время. Индикация значений часов может производиться нажатием кнопки SA3 в любое необходимое время. Во время установки часов и минут также можно включить индикацию часов. Это удобно, если, устанавливая минуты, необхо- димо «вспомнить» установленные часы, не прибегая к смене индикации при помощи нажатия двух кнопок. Если нажать кнопку индикации часов во время установки значений будильника, то индикация часов не включится. Текущее значение часов и минут высвечивается попеременно и не влияет на установки. Паузы длительностью, равной двум секундам, при индикации времени нет. Максимальное время считывания значений часов будет при 19 часах 59 минут. Это время будет равняться 16 секундам. Бели во время индикации значений часов (но не установки!) будут случайно нажаты красная или желтая кнопки, установка не изменится. Случайное нажатие одной кнопки во время транспор- тировки также не изменит сделанных ранее установок. Поскольку после вклю- чения напряжения питания часы уже идут, то при установке минут число вспышек может стать йа единицу больше, чем устанавливаемое. Такие часы хорошо оформить в виде брелока с питанием от трех миниатюр- ных дисковых элементов (часовых). Потребляемый ток без индикации составля- 261
Устройства с индикацией точечными светодиодами ет 0,15 мА, а во время индикации определяется потребляемым током применен- ных светодиодов. Использовать их удобно тем, кто работает в ночное время. ; ЧАСЫ С БУДИЛЬНИКОМ. / ИНДИКАЦИЯ И УСТАНОВКА ДВУМЯ СВЕТОДИОДАМИ. ; УСТАНОВКА - ДВУМЯ КНОПКАМИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = CHASIKI.ASM ; ВЕРСИЯ: 01.03.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC ______________CONFIG 3FF0H • ====================================== ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 .КГЦ. ; СПЕЦ. РЕГИСТРЫ. INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H ;СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. F.SR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ.' ОПРЕДЕЛЕНИЕ ВХОДОВ. ============================================= RB0 > ВХОД КРАСНОЙ КНОПКИ. RB1 > ВХОД ЖЕЛТОЙ КНОПКИ. RB2 > ВЫХОД, КРАСНЫЙ СВЦТОДИОД. RB3 > ВЫХОД, ЖЕЛТЫЙ СВЕТОДИОД. RB4 > ВХОД КНОПКИ ИНДИКАЦИИ ЧАСОВ. RA0 > ВЫХОД ПРЯМОЙ (1). RA1 > ВЫХОД ИНВЕРСНЫЙ (0). RA2 > ВЫХОД С ЧАСТОТОЙ 0,8 КГЦ И ПАУЗОЙ 1/4 СЕК. ================================= ОПРЕДЕЛЕНИЕ РЕГИСТРОВ. SCO EQU 10H /РЕГИСТР ИНДИКАЦИИ ЖЕЛТОГО ДИОДА. SCI EQU 11H /РЕГИСТР ИНДИКАЦИИ КРАСНОГО ДИОДА COUS EQU 12H /СЧЕТЧИК МИЛЛИСЕКУНД. - i :===============================: ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. ============================================ 262
Часы-будильник FLAG EQU 14H ; 0-> ВЫКЛЮЧЕНИЕ ИНДИКАЦИИ УСТАНОВОК. ; 1-> ФЛАГ- СЧЕТЧИКА МИЛЛИСЕКУНД. ; 2-> НАЖАТА КРАСНАЯ КНОПКА. ; 3-> НАЖАТА ЖЕЛТАЯ КНОПКА. ; 4-> НАЖАТЫ ОБЕ КНОПКИ. ; 5-> УСТАНОВКА ЧАСОВ БУДИЛЬНИКА. ; 6-> УСТАНОВКА МИНУТ. л 1 । 1 Г- 1 УСТАНОВКА ЧАСОВ. FLAG1 EQU 15Н ; 0-> ФЛАГ СМЕНЫ ИНДИКАЦИИ СВЕТОДИОДА ; 1-> ФЛАГ УСТАНОВКИ ПОРТА. О-ПОРТ УСТАНОВКИ ВЫКЛЮЧЕН, 1-ПОРТ УСТАНОВКИ ВКЛЮЧЕН. ; 2-> ФЛАГ ДВУХ СЕКУНД (ПАУЗА). ; 3-> МИНУТ БУДИЛЬНИКА. ; 4-> ИНДИКАЦИЯ ЧАСОВ. / . 5-> ФЛАГ 1 СЕКУНДЫ. ==== = ===3========== = ===SS====S3 = === ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. ===зх=г=г===з==========з=5=5==га===заг=ХЕ=з=== BUL EQU 16H /ЕДИНИЦЫ ЧАСОВ БУДИЛЬНИКА. вин EQU 17H /ДЕСЯТКИ ЧАСОВ БУДИЛЬНИКА. MIL EQU 18H /ЕДИНИЦЫ МИНУТ ЧАСОВ. MIH EQU 19H /ДЕСЯТКИ МИНУТ ЧАСОВ. SEC1 EQU 1AH /СЧЕТЧИК СЕКУНД. . MINI EQU 1BH /СЧЕТЧИК МИНУТ. DSMH EQU 1CH /ВРЕМЕННЫЙ РЕГИСТР ДЛЯ ПЕРЕКОДИРОВКИ LSMH EQU 1DH /ВРЕМЕННЫЙ РЕГИСТР, МЛАДШИЙ РАЗРЯД. HOU1 EQU 1EH ;СЧЕТЧИК ЧАСОВ. HOL EQU 1FH /ЕДИНИЦЫ ЧАСОВ. HOH EQU 20H /ДЕСЯТКИ ЧАСОВ. HSMH EQU 21H /ВРЕМЕННЫЙ, СТАРШИЙ РАЗРЯД. BUDO EQU 22H /СУММА ЧАСОВ И МИНУТ БУДИЛЬНИКА. BUD EQU 23H /БУДИЛЬНИК В ЧАСАХ. MIN5 EQU 24H /РЕГИСТР СЧЕТА 5 МИНУТ. BUML EQU 25H /ЕДИНИЦЫ МИНУТ БУДИЛЬНИКА. BUMH EQU 26H /ДЕСЯТКИ МИНУТ БУДИЛЬНИКА. BUDM EQU 27H /ОБЩИЙ МИНУТ БУДИЛЬНИКА. ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 28H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 29H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR_TEMP EQU 2AH /ВРЕМЕННЫЙ ДЛЯ FSR. COUZ EQU 2BH /СЧЕТЧИК РЕЖИМОВ. 1. ПУСК. , ==;; = === = =;□ = ===== = ==»= ORG О GOTO INIT 263
Устройства с индикацией точечными светодиодами ORG 4 GOTO CONST ;₽================= ; 2. ИНИЦИАЛИЗАЦИЯ. t INIT BSF MOVLW STATUS,RP0 В' 00000010' /ПЕРЕХОДИМ В БАНК 1. /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К= =8 =.. .10 MOVWF OPTION_REGA80H ; MOVLW B'lOlOtJOOO' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMRO. MOVWF INTCON MOVLW В'00000000' /ВСЕ НА ВЫХОД. MOVWF TRISAA80H MOVLW B'00010011' /RBO, RBI, RB4-HA ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ. CLRF FLAG1 CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ., CLRF SCO CLRF SCI CLRF HQL CLRF HOH CLRF BUL CLRF BUH' •CLRF MIL CLRF MIH CLRF COUS CLRF COUZ CLRF MIN5 CLRF LSMH CLRF HSMH CLRF SEC1 CLRF MINI CLRF HOUl CLRF BUDO CLRF PORTB CLRF PORTA BSF COUZ,0 /СЧЕТЧИК РЕЖИМА В 1. BSF FLAG, 7, /УСТАНОВИМ ФЛАГ ИНДИКАЦИИ ЧАСОВ. BSF PORTA,1 /ВКЛЮЧИМ ИНВЕРСНЫЙ ВЫХОД. GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ. • ============================ / 3. ПРОВЕРКА НАЖАТЫХ КНОПОК., KEY MOVFW PORTB /ЗАГРУЖАЕМ ПОРТ ДЛЯ ОПРЕДЕЛЕНИЯ BCF STATUS,2 /НАЖАТЫХ ДВУХ КНОПОК. ANDLW B'00000011' /СРАВНИВАЕМ. BTFSC STATUS,2 /ЕСЛИ РАВНО 0, BSF FLAG,4 /УСТАНАВЛИВАЕМ ФЛАГ СМЕНЫ РЕЖИМА. BTFSC FLAG,4 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, BCF FLAG,0 /СБРОСИМ ФЛАГ ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ BTFSC FLAG,4 /ЕСЛИ ФЛАГ СМЕНЫ РЕЖИМА УСТАНОВЛЕН 264
Часы-будильник GOTO KOZ ;СМЕНИМ ФЛАГИРЕЖИМОВ: BTFSS PORTB,0 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, BSF FLAG,2 /УСТАНОВИМ ФЛАГ. BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,2 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, GOTO UST /ИДЕМ НА УСТАНОВКУ. BTFSS PORTB,1 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, BSF FLAG,3 /УСТАНОВИМ ФЛАГ. BTFSS. PORTB,1 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,3 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, GOTO UST /ИДЕМ НА УСТАНОВКУ. BCF * FLAG1,5 RETURN /ЕСЛИ НИЧЕГО НЕ НАЖАТО, ВОЗВРАЩАЕМСЯ. KBUH BSF FLAG,5 /УСТАНОВИМ ФЛАГ ЧАСОВ БУДИЛЬНИКА. BCF FLAG,6 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,7 9 BCF FLAG1,3 9 .RETURN KMIN BSF FLAG,6 /УСТАНОВИМ ФЛАГ УСТАНОВКИ МИНУТ. BCF FLAG,5 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ., BCF FLAG,7 9 BCF FLAG1,3 9 ' RETURN KHO BSF FLAG,7 /УСТАНОВИМ ФЛАГ УСТАНОВКИ ЧАСОВ. BCF FLAG,5 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,6 9 BCF FLAG1,3 9 RETURN KBUM BSF FLAG1,3 /УСТАНОВИМ ФЛАГ МИНУТ БУДИЛЬНИКА. BCF FLAG,5 /ОСТАЛЬНЫЕ ФЛАГИ СБРОСИМ. BCF FLAG,6 9 BCF FLAG,7 9 RETURN KOZ BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSS PORTB,1 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЁТ. RETURN CLRF SCO /ОБНУЛИМ РЕГИСТРЫ CLRF SCI /ИНДИКАЦИИ. BCF FLAG1,0 /СБРОСИМ ФЛАГ СМЕНЫ СВЕТОДИОДА. BCF FLAG,4 /СБРОСИМ ФЛАГИ. BCF FLAG,3 /ЧТОБЫ НЕ СРАБОТАЛА УСТАНОВКА BCF FLAG,2 /ПРИ НЕОДНОВРЕМЕННОМ ОТПУСКАНИИ КНОПОК CLRF MIN5 /ЧТОБЫ ПРОДЛИТЬ УСТАНОВКИ НА 5 МИНУТ. BCF FLAG1,5 /ФЛАГ 1 СЕКУНДЫ. BCF STATUS,0 /ЧТОБЫ МЛАДШИЙ РАЗРЯД БЫЛ НУЛЕВЫМ. RLF COUZ,1 /+1 В СЧЕТЧИК РЕЖИМА. 265
Устройства с индикацией точечными светодиодами BTFSC COUZ,4 . /ЕСЛИ ЕДИНИЦА УЖЕ ДОШЛА ДО 4 РАЗРЯДА GOTO KOZO /ПОЙДЕМ НА УСТАНОВКУ. BTFSC COUZ,0 /ЕСЛИ ЕДИНИЦА, GOTO KHO . /УСТАНОВИМ ФЛАГ ЧАСОВ. BTFSC COUZ,1 /ЕСЛИ ЕДИНИЦА, GOTO KMIN /УСТАНОВИМ ФЛАГ МИНУТ. BTFSC COUZ,2 /ЕСЛИ ЕДИНИЦА, GOTO KBUH /УСТАНОВИМ ФЛАГ ЧАСОВ БУДИЛЬНИКА. BTFSC COUZ,3 /ЕСЛИ ЕДИНИЦА, GOTO KBUM /УСТАНОВИМ ФЛАГ МИНУТ БУДИЛЬНИКА. RETURN кого CLRF COUZ / обнулим' И BSF COUZ,0 /УСТАНОВИМ НУЛЕВОЙ РАЗРЯД. GOTO KHO /УСТАНОВИМ ФЛАГ ЧАСОВ. • ===== ========== ========= ==================================== ; 4. ТАБЛИЦА ПЕРЕКОДИРОВКИ РАЗРЯДА ДЕСЯТКОВ В БИНАРНЫЙ КОД. ? ===’= ========== ========= ==================================== DECBIN ADDWF PC, 1 г RETLW B’00000000’ /0 RETLW B'OOOOIOIO’ /10 'RETLW B'00010100' /20 4 RETLW B’00011110’ /30 RETLW B'00101000' /40 RETLW B’00110010' ;50 • = = = == :=========: x=======s ====================================== ; 5. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ. • ==== :=========: ========= 'S=se===sss=sssssessasssssasssBsSBSsesss===sss= UST3 CLRF BUDO /ОБНУЛИМ ОБЩИЙ РЕГИСТР. MOVFW BUL /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ ЧАСОВ MOVFW BUH /И ДЕСЯТКОВ ЧАСОВ БУДИЛЬНИКА MOVWF SCI /В РЕГИСТРЫ ИНДИКАЦИИ. CALL DECBIN /ДЛЯ УДОБСТВА СРАВНЕНИЯ, ADDWF BUL, 0 /ПЕРЕКОДИРУЕМ ЗНАЧЕНИЯ MOVWF BUD /В ОДИН РЕГИСТР. ADDWF BUDM,0 /ПРИБАВИМ ОБЩЕЕ ЗНАЧЕНИЕ МИНУТ. MOVWF RETURN BUDO /ПЕРЕПИШЕМ В ОБЩИЙ РЕГИСТР. USTM3 CLRF BUDO /ОБНУЛИМ ОБЩИЙ РЕГИСТР. MOVFW BUML /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ МИНУТ MOVFW BUMH /И ДЕСЯТКОВ МИНУТ БУДИЛЬНИКА. MOVWF SCI /В РЕГИСТРЫ ИНДИКАЦИИ. CALL DECBIN /ДЛЯ УДОБСТВА СРАВНЕНИЯ, ADDWF BUML,0 /ПЕРЕКОДИРУЕМ ЗНАЧЕНИЯ MOVWF BUDM /В ОДИН РЕГИСТР. ’ ADDWF BUD, 0 /ПРИБАВИМ ОБЩЕЕ ЗНАЧЕНИЕ ЧАСОВ. MOVWF RETURN BUDO , /ПЕРЕПИШЕМ В ОБЩИЙ РЕГИСТР. 266
Часы-будильник USTW3 1 BTFSS PORTB,4 /ЕСЛИ ИНДИКАЦИЯ ЧАСОВ ВКЛЮЧЕНА, CALL UST2S /ВЫДЕРЖИМ ПАУЗУ, РАВНУЮ 2 СЕКУНДАМ. MOVFW MIL ;ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ МИНУТ MOVFW MIH /И ДЕСЯТКОВ МИНУТ MOVWF SCI /В РЕГИСТРЫ ИНДИКАЦИИ. BTFSS RETURN PORTB,4 /ЕСЛИ ИДЕТ ИНДИКАЦИЯ, /ПЕРЕКОДИРОВКИ НЕТ. MOVFW MIH CALL DECBIN /ДЛЯ УДОБСТВА СРАВНЕНИЯ, ADDWF MIL, 0 /ПЕРЕКОДИРУЕМ ЗНАЧЕНИЯ USTH3 MOVWF RETURN MINI /В ОДИН РЕГИСТР. BTFSS PORTB, 4 /ЕСЛИ ИНДИКАЦИЯ ЧАСОВ ВКЛЮЧЕНА, CALL UST2S /ВЫДЕРЖИМ ПАУЗУ, РАВНУЮ 2 СЕКУНДАМ. MOVFW HOL /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ ЧАСОВ MOVFW HOH /И ДЕСЯТКОВ ЧАСОВ MOVWF SCI /В РЕГИСТРЫ ИНДИКАЦИИ. BTFSS RETURN PORTB,4 /ЕСЛИ ИДЕТ ИНДИКАЦИЯ, /ПЕРЕКОДИРОВКИ НЕТ. MOVFW HOH /ДЛЯ УДОБСТВА СРАВНЕНИЯ, CALL DECBIN /ПЕРЕКОДИРУЕМ ЗНАЧЕНИЯ ADDWF HOL, 0 /В ОДИН РЕГИСТР. UST2S MOVWF RETURN HOU1 /ЧАСЫ: ЕДИНИЦЫ + ДЕСЯТКИ. BTFSC RETURN FLAG1,2 /ЖДЕМ УСТАНОВКИ ФЛАГА 2 СЕКУНД. UST256 GOTO UST2S /ЗАЦИКЛИВАЕМСЯ НА 2 СЕКУНДЫ. MOVLW .10 /ЧИСЛО В РЕГИСТРЕ ' SUBWF SCO, 0 /НЕ ДОЛЖНО БЫТЬ BTFSC STATUS, 0 /БОЛЕЕ 9. CALL UST2OO /ИНАЧЕ ОБНУЛИМ РЕГИСТРЫ ИНДИКАЦИИ. MOVLW .10 /ЧИСЛО В РЕГИСТРЕ SUBWF SCI, 0 /НЕ ДОЛЖНО БЫТЬ UST2OO BTFSS RETURN STATUS, 0 /БОЛЕЕ 9. CLRF SCO ;ОБНУЛИМ CLRF RETURN SCI /РЕГИСТРЫ ИНДИКАЦИИ. ; 6. ЗАПИСЬ УСТАНОВОК В РЕГИСТРЫ. BTFSS FLAG Г, 5 /УСТАНОВКА РАЗРЕШЕНА, ЕСЛИ ПРОШЛА 1 СЕК.. RETURN BTFSC FLAG,б /ЕСЛИ УСТАНОВЛЕН ФЛАГ, 267
Устройства с индикацией точечными светодиодами GOTO USTM /ИДЕМ УСТАНАВЛИВАТЬ МИНУТЫ. BTFSC FLAG,7 /ЕСЛИ УСТАНОВЛЕН ФЛАГ, GOTO USTH /ИДЕМ УСТАНАВЛИВАТЬ ЧАСЫ. BTFSC FLAG,5 /ЕСЛИ УСТАНОВЛЕН ФЛАГ, GOTO USTBH /УСТАНОВИМ ЧАСЫ БУДИЛЬНИКА. BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTBML /УСТАНОВИМ ЕДИНИЦЫ МИНУТ БУДИЛЬНИКА. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO USTBMH /УСТАНОВИМ ДЕСЯТКИ МИНУТ БУДИЛЬНИКА. RETURN ; 7. УСТАНОВКА МИНУТ БУДИЛЬНИКА. USTBML BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF BUML,1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF BUML,0 / BTFSC STATUS,0 /С(ПЕРЕНОС) = 1,.ЕСЛИ 10 И БОЛЕЕ. CLRF BUML ;ОБНУЛИМ РЕГИСТР. GOTO USTM3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. USTBMH INCF BUMH,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 5. MOVLW .6 / SUBWF BUMH,0 BTFSC STATUS,0 /С = 1, ЕСЛИ 6 И БОЛЕЕ. CLRF BUMH /ОБНУЛИМ ДЕСЯТКИ ЧАСОВ. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO USTM3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. ; 8. УСТАНОВКА ЧАСОВ БУДИЛЬНИКА. USTBH BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTBHO /УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO USTBH1 /УСТАНОВИМ ДЕСЯТКИ ЧАСОВ. RETURN 'USTBH0 BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF BUL, 1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД. USTBH2 MOVFW BUH /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -002H /РАВНЫ 2, SKPNZ CALL USTBH4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ ИДЕТ УСТАНОВКА ДЕСЯТКОВ ЧАСОВ RETURN /ВЕРНЕМСЯ. MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF BUL, 0 BTFSC STATUS, 0 /С.(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF BUL /ОБНУЛИМ РЕГИСТР. 268
Часы-будильник GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ ИНДИКАЦИИ. USTBH4 MOVFW BUL /ЕСЛИ ЕДИНИЦЫ ЧАСОВ BCF STATUS,0 /РАВНЫ 4, ADDLW -004Н /А ДЕСЯТКИ ЧАСОВ РАВНЫ 2, SKPNC CLRF RETURN BUL /ОБНУЛИМ ЕДИНИЦЫ ЧАСОВ БУДИЛЬНИКА. USTBH1 INCF BUH,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. CALL USTBH2 /ПРОВЕРИМ НА 24 ЧАСА, ЧТОБЫ СБРОСИТЬ ЕДИНИЦЫ. MOVLW . З / SUBWF вин,о BTFSC STATUS,0 /С = 1, ЕСЛИ 3 И БОЛЕЕ. CLRF BUH /ОБНУЛИМ РЕГИСТР. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ ИНДИКАЦИИ. ; 9. УСТАНОВКА МИНУТ. USTM BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTW0 /УСТАНОВИМ ЕДИНИЦЫ МИНУТ. BTFSC FLAG,2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO RETURN USTW1 /УСТАНОВИМ ДЕСЯТКИ МИНУТ. USTWO BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF MIL,1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД. MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF MIL,0 / BTFSC STATUS,0 /С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF MIL /ОБНУЛИМ РЕГИСТР. GOTO USTW3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ ИНДИКАЦИИ. USTW1 INCF М1Н,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 5. MOVLW .6 SUBWF М1Н,0 BTFSC STATUS,0 /С = 1, ЕСЛИ 3 И БОЛЕЕ. CLRF MIH /ОБНУЛИМ РЕГИСТР. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO USTW3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. • ===== ; 10. УСТАНОВКА ЧАСОВ. :===== SSSSSSSSS ssssssssssssssssse ssssssseessssssssssssssse USTH BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTH0 /УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG*, 2 /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, СОТО RETURN USTH1 /УСТАНОВИМ ДЕСЯТКИ ЧАСОВ. 269
Устройства с индикацией точечными светодиодами USTHO BCF FLAG,3 /СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF HOL, 1 /ПРИБАВИМ ЕДИНИЦУ В МЛАДШИЙ РАЗРЯД. USTH2 MOVFW НОН /ЕСЛИ ДЕСЯТКИ ЧАСОВ ADDLW -002Н /РАВНЫ 2, SKPNZ CALL USTH4 /ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ. BTFSC FLAG,2 /ЕСЛИ ИДЕТ УСТАНОВКА ДЕСЯТКОВ ЧАСОВ, RETURN /ВЕРНЕМСЯ. MOVLW .10 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 9. SUBWF HOL, 0 BTFSC STATUS,0 /С (ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF HOL /ОБНУЛИМ РЕГИСТР. GOTO USTH3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. USTH4 MOVFW HOL /ЕСЛИ ЕДИНИЦЫ ЧАСОВ BCF STATUS,0 /РАВНЫ 4, ADDLW -004Н /А ДЕСЯТКИ ЧАСОВ РАВНЫ 2, SKPNC CLRF HOL /ОБНУЛИМ ЕДИНИЦЫ ЧАСОВ. RETURN USTH1 INCF НОН,1 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 2. CALL USTH2 /ПРОВЕРИМ НА 24 ЧАСА, ЧТОБЫ СБРОСИТЬ ЕДИНИЦЫ MOVLW .3 SUBWF нон,о BTFSC STATUS,0 /С = 1, ЕСЛИ 3 И БОЛЕЕ. CLRF НОН ;ОБНУЛИМ РЕГИСТР. BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. GOTO USTH3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. • sssssasssssssssssssasssssssssssssssssssssssssK&sssssssasss ; 11. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. • =ххх as as=ss ss ss ss ss ss =ss ss as==ss ss ж СОМР BTFSS PORTB,4 /ЕСЛИ НАЖАТА КНОПКА ИНДИКАЦИИ ЧАСОВ, GOTO HOKL /ИДЕМ НА ИНДИКАЦИЮ ЧАСОВ. BTFSS FLAG,0 /ЕСЛИ ФЛАГ ВЫКЛЮЧЕНИЯ УСТАНОВКИ НУЛЕВОЙ, GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ УСТАНОВОК. BCF FLAG,2 /СБРОСИМ ФЛАГИ КНОПОК. BCF FLAG,3 BSF PORTB,2 /ПОГАСИМ ИНДИКАЦИЮ УСТАНОВОК. BSF ( PORTB,3 TSTF ’ BUDO /ЕСЛИ В РЕГИСТРАХ НУЛИ, BZ COMW /БУДИЛЬНИК НЕ РАБОТАЕТ, СРАВНЕНИЯ НЕТ. MOVFW HOUl /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF BUD, 0 /СО ЗНАЧЕНИЕМ ЧАСОВ БУДИЛЬНИКА. BNZ COMW /ЕСЛИ ОНИ НЕ РАВНЫ, ВЫКЛЮЧИМ ВЫХОДЫ. MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF BUDM,0 /СО ЗНАЧЕНИЕМ МИНУТ БУДИЛЬНИКА. BZ COM /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧИМ ЗУММЕР. COMW BCF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. 270
Часы-будильник BSF GOTO PORTA,1 ;ВКЛЮЧЕН. COMP ;HA СРАВНЕНИЕ. сом BSF PORTA,0 ;ВЫХОД ВКЛЮЧЕН. BCF PORTA,1 ;ВЫКЛЮЧЕН. BTFSC cous,o /ЕСЛИ 1/4 СЕКУНДЫ НЕЧЕТНАЯ, GOTO COMP /СИГНАЛ НЕ ЗВУЧИТ. COMWO BTFSC cous,o /ЕСЛИ 1/4 СЕКУНДЫ УЖЕ СТАЛА НЕЧЕТНОЙ GOTO COMP /СИГНАЛ НЕ ЗВУЧИТ. BCF PORTA,2 /ВЫКЛЮЧИМ ВЫХОД. NOP /ДЛЯ ВЫРАВНИВАНИЯ NOP /ДЛИТЕЛЬНОСТИ NOP /ИМПУЛЬСА И ПАУЗЫ. NOP /ПЕРИОД РАВЕН 1,22 МС « 0,8 КГЦ. BSF PORTA,2 /ВКЛЮЧИМ ВЫХОД. GOTO COMWO /ПОВТОРИМ. • SSXXXXXXSXXXXXBCSCSSaSISXSXSSXX ; 12. ВЫБОР РЕЖИМА ИНДИКАЦИИ. • sasxaxx=xsx=xsxxs«s=xxxx==xs zoo BTFSC FLAG,0 /ЕСЛИ УСТАНОВКА ВЫКЛЮЧЕНА, GOTO COMP /ИДЕМ НА СРАВНЕНИЕ. BTFSS PORTB,0 /ЕСЛИ КРАСНАЯ КНОПКА НАЖАТА, BCF PORTB,3 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS PORTB,1 /ЕСЛИ ЖЕЛТАЯ КНОПКА НАЖАТА, BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS FLAG1,2 /ЕСЛИ 2 СЕКУНДЫ ЕЩЕ НЕ ПРОШЛО, GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,0 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,1 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ GOTO z6o , /ВЕРНЕМСЯ. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BSF PQRTB,2 /ПОГАСИМ СВЕТОДИОДЫ. BSF PORTB,3 BTFSC FLAG,5 /ЕСЛИ ФЛАГ ВКЛЮЧЕН, GOTO BUHKL /ИДЕМ СВЕТИТЬ ЧАСЫ БУДИЛЬНИКА. BTFSC FLAG,6 /ЕСЛИ ФЛАГ ВКЛЮЧЕН, GOTO MUKL /ИДЕМ СВЕТИТЬ МИНУТЫ. ' BTFSC FLAG,7 /ЕСЛИ ФЛАГ ВКЛЮЧЕН, GOTO HOKL /ИДЕМ СВЕТИТЬ ЧАСЫ. sxs=xxx=xxxxxxxxxxxsxsxsxxsaxxxsxxxxxx=s=x=x ; 13. ИНДИКАЦИЯ УСТАНОВКИ МИНУТ БУДИЛЬНИКА. ♦ х==х==х= sxxxxx₽==x sxx=xass=x sb sb ss ss ax ss ss =s ax sb =s ss ss==ax BUMKL BTFSC FLAG1,0 /ЕСЛИ ЖЕЛТЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO ZH /ИДЕМ СВЕТИТЬ КРАСНЫЙ. ZL BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР TSTF SCO * /ЕСЛИ ЗНАЧЕНИЕ SKPNZ GOTO ZLO /РЕГИСТРА НУЛЕВОЕ, /ИДЕМ ПРОВЕРЯТЬ СТАРШИЙ РЕГИСТР. 271
Устройства с индикацией точечными светодиодами BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO ZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 ;ЕСЛИ ЕДИНИЦА, GOTO ZOL DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА ИНДИКАЦИИ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ДИОД. ZOL BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА УЖЕ НУЛЕВОЙ, GOTO ZOL1 BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. ZOL1 CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCO /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, SKPZ GOTO BUMKL /НАЧНЕМ СНАЧАЛА. ZLO > BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO ZOL /УСТАНОВКИ ПОРТА. BSF FLAG1,0 /УСТАНОВИМ ФЛАГ КРАСНОГО ДИОДА. GOTO ZOO /ВЫДЕРЖКА 2 СЕК. И ПРОВЕРКА НАЖАТЫХ КНОПОК. ZH BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCI /ЕСЛИ РЕГИСТР >НУЛЕВОЙ, SKPNZ GOTO ZHO /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО,, GOTO ZOH * /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА/ BTFSS COUS,1 /ЕСЛИ ЕДИНИЦА, GOTO ZOH DECF SCI, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА ИНДИКАЦИИ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ ДИОД. ZOH BTFSC COUS, 1 /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO ZOH1 BSF PORTB,3 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. ZOH1 CALL UST25& /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCI' /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, SKPZ GOTO BUMKL /НАЧНЕМ СНАЧАЛА. ZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO ZOH /УСТАНОВКИ ПОРТА. CALL USTM3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ ЖЕЛТОГО ДИОДА. ' BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. 272
Часы-будильник г- S У • =xsx:=x :=sxxx=xsss3s==ssx=sssxs=ssxxxxxxxxxx=x= ' ; 14. ИНДИКАЦИЯ УСТАНОВКИ ЧАСОВ БУДИЛЬНИКА. • xsx=xxxs=s=xxxx: SXXXBXxXXXXXXXXxXXXXXSaSXXXXXXX .’ BUHKL BTFSC FLAG1,0 /ВСЁ АНАЛОГИЧНО ИНДИКАЦИИ МИНУТ. /ЕСЛИ ЖЕЛТЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO UZH /ИДЕМ СВЕТИТЬ КРАСНЫЙ. ; UZL - BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCO /ЕСЛИ НЕТ УСТАНОВКИ, SKPNZ /РЕГИСТР НУЛЕВОЙ, GOTO UZLO /ИДЕМ ПРОВЕРЯТЬ КРАСНЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO UZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,1 /ЕСЛИ НЕ ЕДИНИЦА, GOTO UZOL /ЖДЕМ СМЕНЫ ЗНАЧЕНИЯ БИТА. DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ДИОД. UZOL BTFSC COUS,1 /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO BSF UZOL1 PORTB,2 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. UZOL1 CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF 1 SCO /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА НЕ РАВНО НУЛЮ, SKPZ GOTO BUHKL /НАЧНЕМ СНАЧАЛА. , UZLO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO UZOL /УСТАНОВКИ ПОРТА. BSF FLAG1, 0 /УСТАНОВИМ ФЛАГ КРАСНОГО ДИОДА. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. UZH BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCI /ЕСЛИ РЕГИСТР НУЛЕВОЙ, SKPNZ GOTO UZHO /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO UZOH /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ ЕДИНИЦА, GOTO UZOH DECF SC1,1 /ВЫЧТЕМ ЕДИНИЦУ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ ДИОД. UZOH * BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЁТЧИКА НУЛЕВОЙ, GOTO UZOH1 BSF PORTB,3 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG*1, 1 /СБРОСИМ ФЛАГ УСТАНОВКИ. UZOH1 CALL UST256 . /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР.. 273
Устройства с индикацией точечными светодиодами TSTF SCI /ЕСЛИ ЗНАЧЕНИЕ РЕГИСТРА HE РАВНО НУЛЮ, SKPZ GOTO BUHKL /НАЧНЕМ СНАЧАЛА. UZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO UZOH /УСТАНОВКИ ПОРТА. CALL UST3 . /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ ЖЕЛТОГО ДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. • 3ssssxssasxssxsssxsxs=xs=xx=xssssxs=:xssxssssssss:xsxss ; 15. ИНДИКАЦИЯ УСТАНОВКИ ЧАСОВ. • sassxxKss:xasaa=sasssxsxsx=xsxsasasB=3B32 HOKL BTFSC FLAG1,0 /ЕСЛИ КРАСНЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO HOZH /ИДЕМ СВЕТИТЬ ЖЕЛТЫЙ. BTFSS PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, CALL USTH3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. HOKLO BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCI /НЕТ УСТАНОВКИ, SKPNZ /ЕСЛИ РЕГИСТР НУЛЕЦРЙ, GOTO HOZLO /ИДЕМ СВЕТИТЬ ЖЕЛТЫЙ ДИОД. HOZL BTFSS COUS,1 /ЕСЛИ НЕ ЕДИНИЦА, GOTO HOZL /ЖДЕМ, ПОКА БУДЕТ 1, DECF SC1,1 /ИНАЧЕ ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ ВЫХОД. HOZOL BTFSC COUS,1 /ЕСЛИ РАЗРЯД ЕЩЕ НЕ НУЛЕВОЙ, GOTO HOZOL /ЖДЕМ, ПОКА БУДЕТ 0. BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ ВЫХОД. GOTO HOKLO /ПРОВЕРИМ РЕГИСТР НА НОЛЬ. HOZLO BSF FLAG1,0 /УСТАНОВИМ ФЛАГ СМЕНЫ ДИОДА. BTFSC PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, GOTO ZOO /ПРОПУСТИМ. HOZH BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCO /ЕСЛИ РЕГИСТР РАВЕН НУЛЮ, SKPNZ GOTO HOZHO /ЗАВЕРШАЕМ ИНДИКАЦИЮ.' HOZH1 BTFSS COUS,1 /ЕСЛИ ЕЩЕ НЕ ЕДИНИЦА, GOTO HOZH1 /ЗАЦИКЛИВАЕМСЯ. DECF SCO,1 /ВЫЧТЕМ ЕДИНИЦУ. BCF PORTB,2 /ВКЛЮЧИМ СВЕТОДИОД. HO ZOH BTFSC COUS,1 /ЕСЛИ РАЗРЯД НЕ НУЛЕВОЙ, GOTO HOZOH /ИДЕМ ЖДАТЬ ОБНУЛЕНИЯ. BSF PORTB,2 /ИНАЧЕ ВЫКЛЮЧИМ СВЕТОДИОД. GOTO HOZH /ПРОВЕРИМ РЕГИСТР НА НОЛЬ. 274
Часы-будильник HOZHO BTFSC PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, CALL USTH3 /НЕТ ПЕРЕУСТАНОВКИ РЕГИСТРОВ ИНДИКАЦИИ BCF FLAG1,0 /УСТАНОВИМ ФЛАГ СМЕНЫ ДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BTFSC PORTB,4 /ЕСЛИ НЕ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА, • sesss&xsxsxsssxsxsxs^ssxsxsxssxsxsxsxsssxss: =xss3X3==xssxsxs==:==&: ; 16. ИНДИКАЦИЯ УСТАНОВКИ МИНУТ. • зЕаЕхеаззехввхвхвхвахеаЕвхвхвяввхвхвгехвхваЕа&хвзехвхвхвхвяЕЯЕХВЯЕа&вхваЕаг MUKL BTFSC FLAG1,O /ЕСЛИ, КРАСНЫЙ ДИОД УЖЕ ВЫСВЕТИЛИ, GOTO MOZH /ИДЕМ СВЕТИТЬ ЖЕЛТЫЙ. BTFSS PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, CALL USTW3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. MOZL BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ СВЕТОДИОД. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. «> TSTF SCI /ЕСЛИ НЕТ УСТАНОВКИ, SKPNZ GOTO MOZLO - /РЕГИСТР НУЛЕВОЙ, /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAG1,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO MOZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ НЕ ЕДИНИЦА, GOTO MOZOL /ЖДЕМ СМЕНЫ ЗНАЧЕНИЯ БИТА. DECF SC1,1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА., BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. MOZOL BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА УЖЕ НУЛЕВОЙ, GOTO MOZOL1 BSF PORTB,3 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ ВЫЧИТАНИЯ. MOZOL1 CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCI /ЕСЛИ РЕГИСТР ЕЩЕ НЕ ПУСТОЙ, SKPZ GOTO MOZL /НАЧНЕМ СНАЧАЛА. MOZLO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO MOZOL /УСТАНОВКИ ПОРТА. BSF FLAG1,0 /УСТАНОВИМ ФЛАГ СМЕНЫ СВЕТОДИОДА. BTFSC PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, GOTO ZOO /ПРОПУСТИМ ПАУЗУ, MOZH BSF PORTB,3 /ВЫКЛЮЧИМ КРАСНЫЙ диод. CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCO /ЕСЛИ РЕГИСТР НУЛЕВОЙ, SKPNZ GOTO MOZHO /ЗАВЕРШАЕМ ИНДИКАЦИЮ. BTFSC FLAG1, 1. /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO MOZOH * /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ НЕ ЕДИНИЦА, GOTO MOZOH /ЖДЕМ СМЕНЫ ЗНАЧЕНИЯ БИТА. 275
Устройства с индикацией точечными светодиодами DECF SCO, 1 /ВЫЧТЕМ ЕДИНИЦУ. BSF FLAG1,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ СВЕТОДИОД. MOZOH BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА УЖЕ НУЛЕВОЙ^ GOTO MOZOH1 BSF, PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ СВЕТОДИОД. BCF FLAG1,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. MOZOH1 CALL UST256 /ПРОВЕРИМ НА ПЕРЕПОЛНЕНИЕ РЕГИСТР. TSTF SCO /ЕСЛИ РЕГИСТР ЕЩЕ НЕ ПУСТОЙ, SKPZ GOTO MOZH /НАЧНЕМ' СНАЧАЛА. MOZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO MOZOH /УСТАНОВКИ ПОРТА. BTFSC PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, CALL USTW3 /ПРОПУСТИМ ПЕРЕУСТАНОВКУ РЕГИСТРОВ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ СМЕНЫ СВЕТОДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BTFSC PORTB,4 /ЕСЛИ ВКЛЮЧЕНА ИНДИКАЦИЯ ЧАСОВ, GOTO ZOO /ПРОПУСТИМ ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. GOtO HOKL /НА ИНДИКА1&0 ЧАСОВ. • sxsxsscaxxsxs:: at ss ss sss xe ss XE ss ss as XE xs xs a XE s = XE xs XE XE as as XE ss as эх xz s* ss sz xx XE ss sz xs ss ss ss===ss = as: ; 17. ПП. ПЕРЕКОДИРОВКИ С БИНАРНОГО В 2-10 КОД (2-_-2-10). • xsxsszxxexaxs: sxxxxxxxxx: ек&хахвва&ваввавхахвааавХав&ххххвххх BINDECH MOVLW .10 /10 >w. BDH BSF STATUS,0 /УСТАНОВКА БИТА "С" РЕГИСТРА STATUS. SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH., BNC BINDECL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH /ПОВТОРИТЬ. BINDECL MOVF DSMH,0 ADDLW .10 /Ю+W >W. MOVWF LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. RETURN 7 • xzsxxxxxxxxxx: 35 SS s SS SS SS s SB SB ss: =х==хххах=:х=====:хх==х====аахх=======:=а==;==== / 18. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. • axxxxsxscaxxasxa=xx: ax ss=xx a as ss ss ss ss ? xxxxsxxsaaaxxxxaxsxsxssxasaSsxaaxasKxxxxaaxax CONST - MOVWF W_TEMP ' /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ НИ MOVFW STATUS /STATUS, MOVWF STATUS_TEMP / MOVFW . FSR /FSR. ' ' х : MOVWF FSR_TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. BTFSC FLAG1,5 /ОПРОС КНОПОК ЧЕРЕЗ 1 СЕК. / CALL KEY /ПРОВЕРИМ КНОПКИ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ. MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: 276
Часы-будильник MOVWF STATUS / STATUS, MOVFW FSR TEMP MOVWF FSR /FSR, ; MOVLW .230 ;MOVWF TMRO MOVFW W_TEMP ;W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. «sass see ; 19. ЧАСЫ. SI - INCF COUS,1 ;+1 В СЧЕТЧИК. BTFSS COUS,0 /ЕСЛИ НОЛЬ, BSF FLAG,1 /УСТАНОВИМ ФЛАГ В 1. BTFSC COUS,0 ;ЕСЛИ ЕДИНИЦА, BCF FLAG,1 /УСТАНОВИМ ФЛАГ В 0. MOVLW .4 /ЕСЛИ УЖЕ 1 СЕКУНДА, , SUBWF COUS,0 /4 х 1/4 СЕК. SKPZ Г RETURN CLRF COUS /ОБНУЛИМ СЧЕТЧИК. MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,F /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSC SEC1,0 /ЕСЛИ НУЛЕВОЙ БИТ ЕДИНИЦА, BSF FLAG1,5 /УСТАНОВИМ ФЛАГ 1 СЕКУНДЫ. BTFSC SEC1,1 /ЕСЛИ ПЕРВЫЙ БИТ ЕДИНИЦА, BSF FLAG1,2 /УСТАНОВИМ ФЛАГ 2 СЕКУНД. . RETURN / Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. CALL M5M /УВЕЛИЧИМ СЧЕТЧИК 5 МИНУТ. M1M MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH ,•-59. BZ Hl Л /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MINI,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /ДЛЯ ПЕРЕКОДИРОВКИ. MIU MOVWF DSMH /W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF MIL ,-W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF MIH ,-W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ CLRF HSMH ./ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF LSMH /И МЛ. RETURN Hl CLRF MINI * /ОБНУЛЯЕМ РЕГИСТР МИНУТ. CLRF MIL CLRF MIH f 277
Устройства с индикацией точечными светодиодами Н1Н MOVFW HOU1 ;ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H ,•-23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. MOVFW HOU1 ,-HOUl >W, ДЛЯ ПЕРЕКОДИРОВКИ. H1U MOVWF DSMH ;W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW . LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF HOL /W > H_LOW В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF HOH ,-W > H_HIGH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ CLRF HSMH /ОБНУЛЕНИЕ СТ. РЕГ. ПП. CLRF RETURN LSMH /И МЛ. f ню CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. CLRF HOL /ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ. CLRF RETURN HOH /ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ. М5М INCF MIN5,1 /+1 В РЕГИСТР 5 МИНУТ. MOVLW .5 /ЕСЛИ УЖЕ 5 МИНУТ, SUBWF SKPNZ MIN5,0 BSF FLAG,0 /УСТАНОВИМ ФЛАГ ВЫКЛЮЧЕНИЯ ИНДИКАЦИИ. SKPNZ CLRF RETURN MIN5 /И ОБНУЛИМ СЧЕТЧИК. END Будильник с установкой времени Этот будильник подаст звуковой сигнал через время, которое будет установ- лено при помощи двух кнопок и двух светодиодов. Красный светодиод высвечивает устанавливаемое время в единицах часов. Желтый светодиод высвечивает устанавливаемое время в десятках минут. Уста- новка в часах возможна до 15 часов, а установка десятков минут возможна до 5. Фактически будильник является таймером, но алгоритм работы его про- граммы такой же, как у автомата суточного включения нагрузки, с уменьшен- ным числом установок и сравнением двух параметров. Схема будильника, показанная на рис. 67, отличается от схемы часов (рис. 66) только отсутствием кнопки индикации времени. Поэтому все, сказан- ное выше о схеме часов, будет верно и для схемы будильника. Оба светодиода мигают короткими вспышками, длительностью 1/4 секунды с такой же длите- льностью пауз. Длительность паузы между циклами равна двум секундам. Работать с будильником очень просто. После включения напряжения пита- ния будильник переходит в режим ожидания. В этом режиме не работают 278 *
Будильник с установкой времени « - , DD1 Рис. 67. Будильник с установкой времени «внутренние» часы и нет сравнения установок. После нажатия одновременно двух кнопок и удержания их не менее двух секунд будет мигать желтый свето- диод. В то время, когда кнопки нажаты, горят оба светодиода. Будильник пе- рейдет в режим индикации и установки. Подсчитайте время, через которое вам необходимо включить будильник. Например, установка делается в 20 часов. Необходимо включить будильник в 6 часов 30 минут. Значит, необходимо уста- новить в будильнике значение 10 часов 30 минут. То есть необходимо устано- вить десять миганий красного светодиода и три мигания желтого светодиода. Каждое нажатие кнопки прибавляет одно мигание соответствующего светодио- да. Для того чтобы включить будильник после выполнения установки, необхо- димо нажать две кнопки одновременно. Каждое нажатие двух кнопок изменяет режим работы будильника на противоположный. Если во время работы буди- льника переключиться на режим установки, значения уже отсчитанных часов и минут сбросятся. При следующем переходе в режим будильника счет начнется сначала. « После того как пройдет установленное в будильнике время, включится зум- мер. Время звучания зуммера равно одной минуте. После этого будильник пе- реходит в режим ожидания и для его последующего включения требуется пере- установка. Если вам необходимо включать сигнал ежедневно в одно и то же время, необходимо установить значение часов равное 12. После включения зуммера необходимо дважды нажать две кнопки одновременно, запустив, та- ким образом, будильник снова. ; БУДИЛЬНИК. ; ИНДИКАЦИЯ УСТАНОВКИ ДВУМЯ СВЕТОДИОДАМИ. ; ЕДИНИЦЫ ЧАСОВ'УСТАНАВЛИВАЮТСЯ ДО 15 (КРАСНАЯ КНОПКА), ; ДЕСЯТКИ МИНУТ УСТАНАВЛИВАЮТСЯ ДО 5 (ЖЕЛТАЯ КНОПКА). ; УСТАНОВКА - ДВУМЯ КНОПКАМИ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. 279
Устройства с индикацией точечными светодиодами ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. / п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = BUDAK.ASM ; ВЕРСИЯ: 25.02.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. #INCLUDE P16F84A.INC ____CONFIG 3FF0H • sxxsses:s:s:=:x=:s:s:s:=x=:s:s:s:=:s:s:s:s:s:x==As:s:==s:=s:= / ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ. • aasxssxsassxssxssxsasxsaassxssxssxssxssxsassxssxssxssxssxsssxsasxsassxsaxsxssasxssxssxsasxsss ; СПЕЦ. РЕГИСТРЫ. INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H ;OPTION (RP0=l). PC EQU 02H ;СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB fiQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. •xxSscxxasasxxxsasxxcxsxxsaxxxxaxxxxxxaxxxxxxx ; ОПРЕДЕЛЕНИЕ ВХОДОВ. RB0 > ВХОД КРАСНОЙ КНОПКИ. RB1 > ВХОД ЖЕЛТОЙ КНОПКИ. ; RB2 > ВЫХОД, ; RB3 > ВЫХОД, / RA0 > ВЫХОД г RA1 > ВЫХОД / RA2 > ВЫХОД • axasSxaxxxxxx: КРАСНЫЙ СВЕТОДИОД. ЖЕЛТЫЙ СВЕТОДИОД. ПРЯМОЙ (1). ИНВЕРСНЫЙ (0). 1 КГЦ ЧЕРЕЗ 1/4 СЕК. sxx=xxxx=xxxxxesxxxxx ; ОПРЕДЕЛЕНИЕ • SSSSSESESSSESSSSSXSSSSSS SCO EQU SCI EQU COUS ' EQU РЕГИСТРОВ. zxxxxxxxxxxxxxxxxxxsx , ЮН - / РЕГИСТР ИНДИКАЦИИ ЖЕЛТОГО ДИОДА. 11Н /РЕГИСТР ИНДИКАЦИИ КРАСНОГО ДИОДА. 12Н /СЧЕТЧИК МИЛЛИСЕКУНД. в st = ах а ах ах as ха xs=as ax a? ax ax as ax ss as xa ss a=as ax xa ss=xe as ss / ОПРЕДЕЛЕНИЕ •хххххххвхяхх: БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. B=B=sBsB=sBaaaaaasxsxa==sBasBsBx:aaxsBSBx:aaaa FLAG EQU 14H ; 0-> ВЫКЛЮЧЕНИЕ ИНДИКАЦИИ. ; 1-> ФЛАГ СЧЕТЧИКА МИЛЛИСЕКУНД. ' ; 2-> НАЧАТА КРАСНАЯ КНОПКА. ; 3-> НАЖАТА ЖЕЛТАЯ КНОПКА.' ; 4-> НАЖАТЫ ОБЕ КНОПКИ. ; 5-> ФЛАГ РАВЕНСТВА. ♦хх=хххххихахх=хх=х=и==ххя=ххх= 5 280
Будильник с установкой времени FLAGl EQU 15Н 0-> О-УСТАНОВКА ЖЕЛТОГО СВ. ДИОДА, 1-УСТАНОВКА КРАСНОГО СВ. ДИОДА'. 1-> ФЛАГ УСТАНОВКИ ПОРТА. - / О-ПОРТ УСТАНОВКИ ВЫКЛЮЧЕН, 1-ПОРТ УСТАНОВКИ ВКЛЮЧЕН. 2-> ФЛАГ ДВУХ СЕКУНД*(ПАУЗА). ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. UMNO EQU 16H /УСТАНОВКИ ДЕСЯТКОВ МИНУТ. UHO EQU 17H /УСТАНОВКИ ЕДИНИЦ ЧАСОВ. MIL EQU 18H /ЕДИНИЦЫ МИНУТ. MIH EQU 19H /ДЕСЯТКИ МИНУТ. SEC1 EQU 1AH /СЧЕТЧИК СЕКУНД. MINI EQU 1BH /СЧЕТЧИК МИНУТ. DSMH EQU 1CH /ВРЕМЕННЫЙ РЕГИСТР ДЛЯ ПЕРЕКОДИРОВКИ LSMH EQU 1DH /ВРЕМЕННЫЙ РЕГИСТР, МЛАДШИЙ РАЗРЯД. HOUl EQU 1EH /СЧЕТЧИК ЧАСОВ. H_LOW EQU 1FH /ЕДИНИЦЫ ЧАСОВ. H_HIGH EQU 20H /ДЕСЯТКИ ЧАСОВ. HSMH EQU 21H /ВРЕМЕННЫЙ, СТАРШИЙ РАЗРЯД. ; ВРЕМЕННЫЕ РЕГИСТРЫ. •W_TEMP EQU 28H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 29H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR TEMP EQU 2AH /ВРЕМЕННЫЙ ДЛЯ FSR. ; 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW В'00000010' /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=8 =...10 ' MOVWF OPTION_REGA80H / MOVLW В'10100000* /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0. MOVWF INTCON MOVLW В'00000000' /ВСЕ НА ВЫ^ОД. MOVWF TRISAA80H MOVLW В'00000011' /RB0, RBI-НА ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG , /СБРАСЫВАЕМ ВСЕ ФЛАГИ .CLRF FLAGl CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCO 281
Устройства с индикацией точечными светодиодами CLRF CLRF BSF CLRF CLRF CLRF CLRF CLRF CLRF CLRF CLRF BSF GOTO SCI UMNO UMNO,0 UHO LSMH HSMH SEC1 MINI HOU1 PORTB PORTA PORTA,0 ZOO . » 1 /ИДЕМ НА ИНДИКАЦИЮ. ; 3. ПРОВЕРКА НАЖАТЫХ КНОПОК. • ===== ======== :=========== :==== KEY KOZ KOZO MOVFW BCF ANDLW BTFSC BSF BT^SC GOTO BTFSS BSF BTFSS RETURN BTFSC CALL BTFSS BSF BTFSS RETURN BTFSC CALL RETURN BTFSS RETURN BTFSS. RETURN BCF BCF BCF BCF BTFSS GOTO BCF BCF RETURN BSF RETURN PORTB STATUS,2 B'00000011’ STATUS,2 FLAG,4 FLAG,4 KOZ PORTB,0 FLAG,2 PORTB,0 FLAG,2 UST PORTB,1 FLAG,3 PORTB,1 FLAG,3 UST PORTB,0 PORTB,1 FLAG,4 FLAG,3 FLAG,2 FLAG1,2 FLAG,0 KOZO FLAG,0 FLAG,5 FLAG,0 /ЗАГРУЖАЕМ ПОРТ ДЛЯ ОПРЕДЕЛЕНИЯ /НАЖАТЫХ ДВУХ КНОПОК. /СРАВНИВАЕМ. /ЕСЛИ РАВНО 0, /УСТАНАВЛИВАЕМ ФЛАГ СМЕНЫ РЕЖИМА. /ЕСЛИ ФЛАГ СМЕНЫ РЕЖИМА УСТАНОВЛЕН, /СМЕНИМ ФЛАГИ РЕЖИМОВ. /ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, /УСТАНОВИМ ФЛАГ. /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. /ЕСЛИ ФЛАГ УСТАНОВЛЕН, /ИДЕМ НА УСТАНОВКУ. /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, /УСТАНОВИМ ФЛАГ. /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. /ЕСЛИ ФЛАГ УСТАНОВЛЕН, /ИДЕМ НА УСТАНОВКУ. /ЕСЛИ НИЧЕГО НЕ НАЖАТО, ВОЗВРАЩАЕМСЯ. /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. /СБРОСИМ ФЛАГИ. /ЧТОБЫ НЕ СРАБОТАЛА УСТАНОВКА /ПРИ НЕОДНОВРЕМЕННОМ ОТПУСКАНИИ КНОПОК. /ФЛАГ 2 СЕКУНД. /ИЗМЕНЯЕМ ЗНАЧЕНИЕ ФЛАГА /НА ПРОТИВОПОЛОЖНОЕ. /РАЗРЕШАЕМ СЧЕТ. /СБРОСИМ ФЛАГ РАВЕНСТВА И РАЗРЕШИМ СЧЕТ /РАЗРЕШАЕМ ИНДИКАЦИЮ. 282
Будильник с установкой времени ! звжжжжжжжжжжжжжжжжжжжжжжжжжжжжэвявжж ; 4. ЗАПИСЬ УСТАНОВОК В РЕГИСТРЫ. • з=Е»=====!х====а:зЕх:»х:авзвавггггзяг UST BTFSS FLAG,0 /ЕСЛИ ИНДИКАЦИЯ ЗАПРЕЩЕНА, RETURN ;ВЕРНЕМСЯ. BTFSS FLAG1,2 ;УСТАНОВКА РАЗРЕШЕНА, ЕСЛИ ПРОШЛО 2 СЕК. RETURN BTFSC FLAG,3 /ЕСЛИ НАЖАТА ЖЕЛТАЯ КНОПКА, GOTO USTO ;УСТАНОВИМ ДЕСЯТКИ МИНУТ. BTFSC FLAG,2 •;ЕСЛИ НАЖАТА КРАСНАЯ КНОПКА, GOTO USTH ;УСТАНОВИМ ЕДИНИЦЫ ЧАСОВ. RETURN • жаржжжжжжжжжжжж ь вкжжжжжжжжжжжжжжжжжжжжжжжжжжжжж ; 5. УСТАНОВКА ДЕСЯТКОВ МИНУТ. ' жжжжжжжжжжж жж жжжжжжцвжжжжжжжжжжг: USTO BCF FLAG,3 ;СБРОСИМ ФЛАГ ЖЕЛТОЙ КНОПКИ. INCF UMNO,1 /ПРИБАВИМ ЕДИНИЦУ В РАЗРЯД. MOVLW .6 /РАЗРЯД УСТАНАВЛИВАЕТСЯ ДО 6. SUBWF UMNO,0 BTFSC STATUS, 0 ;С(ПЕРЕНОС) = 1, ЕСЛИ 10 И БОЛЕЕ. CLRF UMNO /ОБНУЛИМ РЕГИСТР. GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. •ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ ЖЖЖЖЖЖЖЖЖ8ВЖЖЖЖЖЖЖЖЖЖЖ9=ЖЖЖЖЖЖЖЖЖЖЖ ; 6. УСТАНОВКА ЕДИНИЦ ЧАСОВ. •жжжжжжжжжжжжжз гж^жжжжжж жжгхжжжжжжжжжжжжжжжжжжЖжжжжжжжжжжжж USTH BCF FLAG,2 /СБРОСИМ ФЛАГ КРАСНОЙ КНОПКИ. е MOVLW .15 f SUBWF UHO, 0 BTFSC STATUS, 0 /С = 1, ЕСЛИ 15 И БОЛЕЕ. GOTO USTHO INCF UHO, 1 /ПРИБАВИМ ЕДИНИЦУ В РАЗРЯД. GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ. USTHO / CLRF UHO /ОБНУЛИМ РЕГИСТР. • жжжжжж жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж ; 7. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ. •жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж UST3 MOVFW UMNO /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ДЕСЯТКОВ МИНУТ. MOVFW UHO /АНАЛОГИЧНО ДЛЯ ЧАСОВ MOVWF SCI f RETURN жжжжж^жжжжжжжжжжжжжжжжжжжжжжжжжж 8. СРАВНЕНИЕ, ЗНАЧЕНИЙ РЕГИСТРОВ. СОМРОТ BTFSS PORTB, 0 /ЕСЛИ КРАСНАЯ КНОПКА НАЖАТА, BCF PORTB,3 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS PORTB,1 /ЕСЛИ ЖЕЛТАЯ КНОПКА НАЖАТА, BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД. 283
Устройства с индикацией точечными светодиодами BTFSS GOTO FLAG,1 ; COMPOT ; :ЕСЛИ 0,25 СЕКУНДЫ ЕЩЕ HE ПРОШЛО, :ВЕРНЕМСЯ. СОМР BTFSC FLAG,0 , :ЕСЛИ ФЛАГ ВЫКЛЮЧЕНИЯ УСТАНОВКИ НУЛЕВОЙ, GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ УСТАНОВОК. BCF FLAG,2 , ;СБРОСИМ ФЛАГИ КНОПОК. BCF FLAG,3 BSF. PORTB,2 , ;ПОГАСИМ ИНДИКАЦИЮ УСТАНОВОК. BSF PORTB,3 , MOVFW HOUl ;СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF UHO, 0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BNZ COM /ЕСЛИ ОНИ РАВНЫ, ВЫКЛЮЧИМ ВЫХОДЫ. MOVFW MIH ;СРАВНИМ ЗНАЧЕНИЕ SUBWF UMNO,0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COMW /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧИМ ВЫХОДЫ. сом BCF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. BSF PORTA,1 ;ВКЛЮЧЕН. GOTO COMPOT /НА СРАВНЕНИЕ. COMW BSF PORTA,0 /ВЫХОД ВКЛЮЧЕН. BCF PORTA,1 /ВЫКЛЮЧЕН. - BSF FLAG,5 - BTFSg COUS,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА НЕЧЁТНЫЙ, GOTO COMPOT ;СИГНАЛ' НЕ ЗВУЧИТ. COMWO BTFSC COUS,1 /ЕСЛИ РАЗРЯ УЖЕ СТАЛ НЕЧЕТНЫМ, ' GOTO COMP /СИГНАЛ НЕ ЗВУЧИТ. BCF PORTA,2 /ВЫКЛЮЧИМ ВЫХОД. NOP /ДЛЯ ВЫРАВНИВАНИЯ NOP /ДЛИТЕЛЬНОСТИ 1 NOP /ИМПУЛЬСА И ПАУЗЫ. NOP /ПЕРИОД РАВЕН 1,22 МС = 0,8 КГЦ. BSF PORTA,2 /ВКЛЮЧИМ ВЫХОД. GOTO COMWO /ПОВТОРИМ. 1 II 1 <0 II 1 • II 1 II »=:===================== ВЫБОР РЕЖИМА ИНДИКАЦИИ. । ч zoo BTFSS FLAG,0 /ЕСЛИ УСТАНОВКА ВЫКЛЮЧЕНА, GOTO COMPOT /идем на сравнение. BTFSS PORTB,0 /ЕСЛИ КРАСНАЯ КНОПКА НАЖАТА, BCF PORTB,3 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS PORTB,1 /ЕСЛИ ЖЕЛТАЯ КНОПКА НАЖАТА, - BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS FLAGl,2 /ЕСЛИ 2 СЕКУНДЫ ЕЩЕ НЕ ПРОШЛО, GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,0 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ. GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,1 /ЕСЛИ КНОПКА НАЖАТА, УСТАНОВКИ НЕТ. GOTO ZOO /ВЕРНЕМСЯ. BCF FLAGl,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BSF PORTB,2 /ПОГАСИМ СВЕТОДИОДЫ. 284
Будильник с установкой времени BSF PORTB, 3 ; / 10. ИНДИКАЦИЯ УСТАНОВКИ ЧАСОВ. HOKL BTFSC GOTO FLAGl,0 HOZH /ЕСЛИ ЖЕЛТЫЙ ДИОД УЖЕ .ВЫСВЕТИЛИ, /ИДЕМ СВЕТИТЬ КРАСНЫЙ. HOZL BSF PORTB,3 ;ВЫКЛЮЧИМ КРАСНЫЙ СВЕТОДИОД. TSTF SCO /ЕСЛИ НЕТ УСТАНОВКИ, t SKPNZ ;РЕГИСТР НУЛЕВОЙ, GOTO HOZLO /ИДЕМ ПРОВЕРЯТЬ КРАСНЫЙ РЕГИСТР. BTFSC FLAGl,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO HOZOL /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS.O /ЕСЛИ ЕДИНИЦА, GOTO HOZOL DECF SCO,1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BSF FLAGl,1 ^УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,2 /ВКЛЮЧИМ ЖЕЛТЫЙ ВЫХОД.' HOZOL BTFSS FLAG,1 /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO HOZOL1 f BSF PORTB, 2 /ВЫКЛЮЧИМ выход. . BCF FLAGl,1 /СБРОСИМ фла!1 вычитания. HOZOL1 TSTF SCO /ЕСЛИ РЕГИСТР.УЖЕ ПУСТОЙ, SKPZ GOTO HOKL /НАЧНЕМ СНАЧАЛА. HOZLO BTFSC FLAGl,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO HOZOL /УСТАНОВКИ ПОРТА. BSF FLAGl,0 /УСТАНОВИМ ФЛАГ КРАСНОГО ДИОДА. BCF FLAGl,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. ♦ GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. HOZH BSF PORTB,2 /ВЫКЛЮЧИМ ЖЕЛТЫЙ ДИОД. TSTF SCI /ЕСЛИ РЕГИСТР НУЛЕВОЙ, SKPNZ GOTO HOZHO /ИДЕМ ПРОВЕРЯТЬ ЖЕЛТЫЙ РЕГИСТР. BTFSC FLAGl,1 /ЕСЛИ ВЫЧИТАНИЕ СДЕЛАНО, GOTO HOZOH /ИДЕМ ЖДАТЬ СБРОСА ФЛАГА. BTFSS COUS,0 /ЕСЛИ ЕДИНИЦА, GOTO HOZOH DECF SCI, 1 /ВЫЧТЕМ ЕДИНИЦУ. BSF FLAGl,1 /УСТАНОВИМ ФЛАГ ВЫЧИТАНИЯ. BCF PORTB,3 /ВКЛЮЧИМ КРАСНЫЙ ДИОД. HOZOH BTFSS FLAG,1 /ЕСЛИ РАЗРЯД СЧЕТЧИКА НУЛЕВОЙ, GOTO HOZOH1 BSF PORTB,3 /ВЫКЛЮЧИМ ВЫХОД. BCF FLAGl,1 /СБРОСИМ ФЛАГ УСТАНОВКИ. HOZOH1 4» TSTF SCI /ЕСЛИ РЕГИСТР УЖЕ ПУСТОЙ, SKPZ /ПРОПУСКАЕМ. 285
Устройства с индикацией точечными светодиодами GOTO HOKL /НАЧНЕМ СНАЧАЛА. HOZHO BTFSC FLAG1,1 /ЖДЕМ, ПОКА СБРОСИТСЯ ФЛАГ GOTO HOZOH /УСТАНОВКИ ПОРТА. CALL UST3 /ПЕРЕУСТАНОВИМ РЕГИСТРЫ ИНДИКАЦИИ. BCF FLAG1,0 /УСТАНОВИМ ФЛАГ ЖЕЛТОГО ДИОДА. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. GOTO ZOO /НА ИНДИКАЦИЮ НАЧАЛА ЦИКЛА. • =S== = = K = = =! = X=S= ========== ================================== ; 11. ПП. ПЕРЕКОДИРОВКИ C БИНАРНОГО В 2-10 КОД (2-_-2-10). •ssss========== ========== ================================== BINDECH MOVLW .10 /10 >W. ‘ BDH BSF STATUS,0 /УСТАНОВКА’БИТА "С" РЕГИСТРА STATUS SUBWF DSMH,1 /ВЫЧИТАЕМ ИЗ РЕГИСТРА 10 > DSMH. BNC BINDECL /ПЕРЕХОД ЕСЛИ НЕТ ПЕРЕНОСА. INCF HSMH,1 /ПРИБАВИМ 1 К СТАРШЕМУ РЕГИСТРУ. GOTO BDH /ПОВТОРИТЬ. BINDECL • MOVF DSMH,0 , ADDLW .10 ,-10+W >W. MOVWF LSMH /ЗАПИСЬ ОСТАТКА В МЛАДШИЙ РЕГИСТР. RETURN Г ; 12. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS TEMP / ч MOVFW FSR ; FSR. MOVWF FSR TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. BTFSC FLAG1,2 /ОПРОС КНОПОК ЧЕ^ЕЗ 2 СЕК. CALL KEY ' /ПРОВЕРИМ КНОПКИ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ BCF INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ. MOVFW STATUS TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /•STATUS, MOVFW FSR_TEMP MOVWF FSR /FSR, MOVFW W_TEMP ,-W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. • =============: ===== / 13. СЧЕТ.- ==== SI INCF COUS,1 /+1 . В СЧЕТЧИК. BTFSS COUS,0 /ЕСЛИ РАЗРЯД НУЛЕВОЙ, BSF FLAG,1 - /УСТАНОВИМ ФЛАГ. BTFSC COUS,0 /ЕСЛИ РАЗРЯД ЕДИНИЧНЫЙ, BCF FLAG,1 /СБРОСИМ ФЛАГ. MOVLW .4 /ЕСЛИ УЖЕ 1 СЕКУНДА, 286
Будильник с установкой времени SUBWF COUSrO /4 x 0,25, SKPZ 9 RETURN CLRF COUS /ОБНУЛИМ СЧЕТЧИК. MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,F /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSC SEC1,1 /ЕСЛИ РАЗРЯД ЕДИНИЦА, BSF FLAG1,2 /УСТАНОВИМ ФЛАГ 2 СЕКУНД. RETURN 9 Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. BTFSC FLAG,5 /ЕСЛИ УЖЕ БЫЛО РАВЕНСТВО, GOTO HOO /ИДЕМ НА ОБНУЛЕНИЕ. BTFSC FLAG,0 /ПОКА ИДЕТ УСТАНОВКА, GOTO HOO /МИНУТЫ И ЧАСЫ НЕ СЧИТАЕМ. M1M ч MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MIN1,F /ПРИБАВИТЬ 1 В МИНУТЫ. MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. M1U MOVWF DSMH ;W >DSMH. CALL BINDECH /ПЕРЕХОД В ПП. MOVFW LSMH /LSMH >W ВРЕМЕННЫЙ. MOVWF MIL /W > MIL В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ. MOVFW HSMH /HSMH >W ВРЕМЕННЫЙ. MOVWF MIH ,-W > MIH В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ CLRF HSMH /ОБНУЛЕНИЕ СТ..РЕГ. ПП. CLRF LSMH /И МЛ. RETURN Hl CLRF MINI /ОБНУЛЯЕМ РЕГИСТР МИНУТ. H1H к MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -OFH 15. BZ HOO. /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НОО. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. RETURN HOO CLRF HOU1 /ОБНУЛЯЕМ ЧАСЫ, CLRF MIL /ЕДИНИЦЫ МИНУТ, CLRF MIH /ДЕСЯТКИ МИНУТ, CLRF MINI /ОБЩИЙ'РЕГИСТР МИНУТ. RETURN END • sssssssssss&sssssssssssssss: /SSSSSSSSSSSSSSSS SS 287
Устройства с индикацией точечными светодиодами Походный будильник * Этот будильник удобно использовать, если вам необходимо ежедневное зву- чание зуммера в одно и то же время. Алгоритм работы программы будильника повторяет алгоритм программы автомата суточного включения нагрузки для второго варианта. Из программы удалено сравнение на время выключения устройства. Схема будильника, пока- занная на рис. 68, отличается от схемы автомата только наличием дополните- льного выхода RA2. К этому выходу подключается пьезоизлучатель типа ЗП1. Звуковые излучатели типа НСМ1206х можно подключить к прямому или ин- версному выходу. DD1 Рис. 68. Походный будильник Работа с будильником Допустим, вам необходимо ежедневное включение будильника в 6 часов. Для этого необходимо нажать кнопку в 6 часов. Кнопку необходимо удержи- вать не менее двух секунд. И все. Если со временем будет большой уход звуча- ния зуммера от установленного времени, снова нажмите кнопку в необходи- мое время. Будильник сделает внутреннюю переустановку. В данном случае не имеют значения «показания» внутренних часов. Время звучания излучателя равно одной минуте. Частота звучания излучателя равна 0,8 кГц с перерывом в одну секунду. Кнопку установки желательно разместить так, чтобы доступ к ней был за- труднен, чтобы нельзя было случайно нажать эту кнопку во время эксплуата- ции. ; БУДИЛЬНИК. ; БЕЗ ИНДИКАЦИИ. ; УСТАНОВКА ОДНОЙ КНОПКОЙ. 288
Походный будильник ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = BUDIK.ASM ; ВЕРСИЯ: 23.02.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC __CONFIG 3FF0H ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ. СПЕЦ. РЕГИСТРЫ. INDF EQU 00H ;ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMRO. OPTIONR EQU 81H ;OPTION (RP0=l). PC EQU 02H ;СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 0 6H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ОПРЕДЕЛЕНИЕ ВХОДОВ. RB0 > ВХОД КНОПКИ. RA0 > ВЫХОД ПРЯМОЙ (1). RA1 > ВЫХОД ИНВЕРСНЫЙ (0) . RA2 > ВЫХОД 1 КГЦ ЧЕРЕЗ 1 СЕК. ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРА FLAG. FLAG EQU ЮН 0-> НАЖАТОЙ КНОПКИ. 2-> 2 СЕКУНД. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. SEC1 EQU 1AH /СЧЕТЧИК СЕКУНД. MINI EQU 1BH /СЧЕТЧИК МИНУТ. HOUl EQU 1CH /СЧЕТЧИК ЧАСОВ. HWK EQU 1DH /ВРЕМЯ ВКЛЮЧЕНИЯ В ЧАСАХ. MWK EQU 1EH /ВРЕМЯ ВКЛЮЧЕНИЯ В МИНУТАХ W Зак. 2418 289
/ Устройства с индикацией точечными светодиодами ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 20H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 21H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR TEMP EQU 22H /ВРЕМЕННЫЙ ДЛЯ FSR. / 1. ПУСК. ORG О GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. • ====== ============ INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'000003,00' ;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=32 =.. . .100. MOVWF OPTION_REGa80H Г MOVLW B'10100000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0. MOVWF INTCON • MOVLW B'00000000' /ВСЕ НА ВЫХОД. MOVWF TRISAA80H MOVLW B'00000001' /RBO-НА ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H / BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ. CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ. CLRF HWK CLRF MWK CLRF SEC1 CLRF MINI CLRF HOU1 CLRF PORTB CLRF PORTA BSF PORTA,0 GOTO COMP НА СРАВНЕНИЕ. / 3. ПРОВЕРКА НАЖАТЫХ КНОПОК. KEY BTFSS PORTB,0 /ЕСЛИ НАЖАТА КНОПКА, BSF FLAG,0 /УСТАНОВИМ ФЛАГ. * BCF FLAG,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,0 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, CALL UST /ИДЕМ НА УСТАНОВКУ. RETURN /ВОЗВРАЩАЕМСЯ. 290
Походный будильник 4. УСТАНОВКА UST BCF FLAG,0 ;СБРОСИМ ФЛАГ КНОПКИ. MOVFW HOUl ;ЗНАЧЕНИЕ ЧАСОВ MOVWF HWK /В РЕГИСТР ЧАСОВ ВКЛЮЧЕНИЯ MOVFW MINI /ЗНАЧЕНИЯ МИНУТ MOVWF MWK /В РЕГИСТР МИНУТ ВКЛЮЧЕНИЯ RETURN 5. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. СОМР СОМ COMWO MOVFW HOUl СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF HWK,0 ; CO ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BNZ COM ЕСЛИ ОНИ НЕ РАВНЫ, ЗАЦИКЛИВАЕМСЯ, MOVFW MINI СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF MWK,0 ; СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COMW ; ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧАЕМ ВЫХОД. BCF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. BSF PORTA,1 /ВКЛЮЧЕН. , GOTO COMP /НА СРАВНЕНИЕ. BSF PORTA,0 /ВЫХОД ВКЛЮЧЕН. BCF PORTA,1 ;ВЫКЛЮЧЕН. BTFSC SEC1,0 /ЕСЛИ СЕКУНДА НЕЧЕТНАЯ, GOTO COMP /СИГНАЛ НЕ ЗВУЧИТ. BTFSC SEC1,O /ЕСЛИ СЕКУНДА УЖЕ СТАЛА НЕЧЕТНОЙ GOTO COMP /СИГНАЛ НЕ ЗВУЧИТ. BCF PORTA,2 /ВЫКЛЮЧИМ ВЫХОД. NOP /ДЛЯ ВЫРАВНИВАНИЯ NOP /ДЛИТЕЛЬНОСТИ NOP /ИМПУЛЬСА И ПАУЗЫ. NOP /ПЕРИОД РАВЕН 1,22 МС = 0,8 КГЦ. BSF PORTA,2 /ВКЛЮЧИМ ВЫХОД. GOTO COMWO /ПОВТОРИМ. 6. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.’ CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATUS_TEMP MOVFW FSR / FSR. MOVWF FSR_TEMP CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. BTFSC FLAG,2 CALL KEY /ПРОВЕРИМ КНОПКИ. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ BCF ’ INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ. MOVFW STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: 291
Устройства с индикацией точечными светодиодами MOVWF MOVFW MOVWF MOVFW RETFIE STATUS FSR_TEMP FSR W_TEMP /STATUS, /FSR, ;W. /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. ; 7. СЧЕТ. S1 MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,1 /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSC SEC1,1 /ЕСЛИ РАЗРЯД ЕДИНИЦА, BSF.- FLAG,2 /УСТАНОВИМ ФЛАГ 2 СЕКУНД. RETURN / Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. М1М MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH /-59. , BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MINI,F /ПРИБАВИТЬ 1 В МИНУТЫ. RETURN f Hl / CLRF MINI /РБНУЛЯЕМ РЕГИСТР МИНУТ. Н1Н MOVFW HOU1 /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -17H ,•-23. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ. INCF HOU1,F /ПРИБАВИТЬ 1 В ЧАСЫ. RETURN ню CLRF HOU1 /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. RETURN END «Песочные» часы , Этот минутный таймер может найти различное применение как в процедур- ных кабинетах поликлиник, так и в быту (например на кухне). Алгоритм работы программы таймера аналогичен алгоритму работы про- граммы будильника с установкой времени. Отличие заключается в установке только единиц минут. Минуты устанавливаются до 15. Установка значений ми- нут (рис. 69) производится кнопкой SA1. Индикация установки осуществляется светодиодом HL1. Работа с таймером. После подачи напряжения питания схема переходит в режим индикации. Поскольку нулевого значения установки таймера нет, то при инициализации устанавливается значение, равное одной минуте. Поэтому 292
’Песочные» часы DD1 единица будет индицироваться, вспышкой светодиода. Длительность вспышки и паузы равна четверти секунды. Пауза между циклами равна двум секундам. После установки нужного числа минут необходимо нажать кнопку SA2 «Пуск». Таймер включен. После отсчета времени включится зуммер. Выключить зум- мер можно нажатием кнопки «Пуск». Нажатие кнопки «Пуск» переключит таймер в режим установки. При нажатии любой кнопки включается светодиод. Пока кнопка нажата, горит светодиод, а реакция на кнопку будет только после ее отпускания. То есть таймер будет включаться не в момент нажатия кнопки «Пуск», а в момент ее отпускания. Кнопки необходимо удерживать, не менее двух секунд. ; МИНУТНЫЕ "ПЕСОЧНЫЕ" ЧАСЫ. ; ИНДИКАЦИЯ УСТАНОВКИ ОДНИМ СВЕТОДИОДОМ. ; МИНУТЫ УСТАНАВЛИВАЮТСЯ ДО 15. ; УСТАНОВКА - ОДНОЙ КНОПКОЙ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = PESOK.ASM ; ВЕРСИЯ: 28.02.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC __CONFIG 3FF0H ; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ. ; СПЕЦ. РЕГИСТРЫ. 293
Устройства с индикацией точечными светодиодами INDF EQU OOH /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMERO EQU 01H /TMRO. OPTIONR EQU 81H /OPTION (RPO=1). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR • EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05-H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H у НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU ОВН /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. ОПРЕДЕЛЕНИЕ ВХОДОВ. RB0 > ВХОД КНОПКИ УСТАНОВКИ. RB1 > ВХОД КНОПКИ СМЕНЫ РЕЖИМА. RB2 > ВЫХОД СВЕТОДИОДА. RA0 > выход ПРЯМОЙ (1). RA1 > выход ИНВЕРСНЫЙ (0). RA2 > выход 1 КГЦ ЧЕРЕЗ 1/4 СЕК. ; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ. SCO EQU 10H /РЕГИСТР ИНДИКАЦИИ ДИОДА COUS EQU 11H /СЧЕТЧИК МИЛЛИСЕКУНД. UMNO EQU 12H /УСТАНОВКИ МИНУТ.. * SEC1 EQU 13H у СЧЕТЧИК СЕКУНД. MINI EQU 14H /СЧЕТЧИК МИНУТ. ; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ FLAG. • ===================г=================5======ж= FLAG EQU 15Н 0-> ВЫКЛЮЧЕНИЕ ИНДИКАЦИИ. 1-> ФЛАГ РЕЖИМА. 2-> НАЖАТА КНОПКА СМЕНЫ РЕЖИМА 3-> ФЛАГ 1 СЕКУНДЫ. 5-> ФЛАГ РАВЕНСТВА. FLAG1 EQU 16H ; 0—> КНОПКИ УСТАНОВКИ. ; 2-> ФЛАГ ДВУХ СЕКУНД (ПАУЗА). ; ВРЕМЕННЫЕ РЕГИСТРЫ. W_TEMP EQU 17H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS_TEMP EQU 18H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ FSR_TEMP EQU 19H /ВРЕМЕННЫЙ ДЛЯ FSR. ; 1. ПУСК. ORG О GOTO INIT 294
«Песочные» часы ORG 4 GOTO CONST 2. ИНИЦИАЛИЗАЦИЯ INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW B'00000010’ /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=8 =...10 MOVWF OPTION_REGA 8 ОН / MOVLW B’lOlOOOOO' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0. MOVWF INTCON MOVLW B'00000000' /ВСЕ НА ВЫХОД. MOVWF TRISAA80H * MOVLW B'00000011' /RBO-НА ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RPO /ПЕРЕХОДИМ В БАНК 0. CLRF FLAG /СБРАСЫВАЕМ ВСЕ ФЛАГИ CLRF FLAGl CLRF TMRO /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ CLRF SCO CLRF UMNO CLRF SEC1 CLRF MINI CLRF COUS CLRF PORTB CLRF PORTA BSF UMNO,0 /УСТАНОВИМ 1 МИНУТУ. BSF PORTA,1 /ВКЛЮЧИМ ИНВЕРСНЫЙ ВЫХОД. BSF FLAG,1 /РАЗРЕШАЕМ ИНДИКАЦИЮ. GOTO ZOO /ИДЕМ НА ИНДИКАЦИЮ. / 3. ПРОВЕРКА НАЖАТЫХ КНОПОК. • === sssssssssassasassssssssssssss KEY BTFSS PORTB,0 /ЕСЛИ НАЖАТА КНОПКА, BSF FLAG,0 /УСТАНОВИМ ФЛАГ. BTFSS PORTB,0 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSC FLAG,0 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, CALL UST /ИДЕМ НА УСТАНОВКУ. BTFSS PORTB,1 /ЕСЛИ НАЖАТА КНОПКА, BSF FLAG,2 /УСТАНОВИМ ФЛАГ КНОПКИ СМЕНЫ РЕЖИМА. BTFSS PORTB,1 /ПОКА НАЖАТА КНОПКА, УСТАНОВКИ НЕТ. RETURN BTFSS FLAG,2 /ЕСЛИ ФЛАГ УСТАНОВЛЕН, СМЕНИМ РЕЖИМ. RETURN BCF FLAG,0 /СБРОСИМ ФЛАГИ КНОПОК. BCF FLAG,2 BCF FLAG,3 /СБРОСИМ ФЛАГ 1 СЕКУНДЫ. BTFSS FLAG,1 /ИЗМЕНЯЕМ ЗНАЧЕНИЕ ФЛАГА GOTO KOZO /НА ПРОТИВОПОЛОЖНОЕ. BCF FLAG,1 /РАЗРЕШАЕМ СЧЕТ. BCF FLAG,5 /СБРОСИМ ФЛАГ РАВЕНСТВА И РАЗРЕШИМ СЧЕТ CLRF MINI /ДЛЯ НАЧАЛА СЧЕТА С НУЛЯ. 295
Устройства с индикацией точечными светодиодами KOZO CLRF SEC1 RETURN BSF FLAG,1 RETURN /РАЗРЕШАЕМ ИНДИКАЦИЮ. ; 4. СРАВНЕНИЕ .ЗНАЧЕНИЙ РЕГИСТРОВ. СОМР BTFSC FLAG,1 /ЕСЛИ ВКЛЮЧЕН ФЛАГ ИНДИКАЦИИ, GOTO ZOO BTFSS PORTB,1 BCF PORTB,2 BTFSC PORTB,1 BSF PORTB,2 BTFSS PORTB,1 GOTO COMP /ИДЕМ НА ИНДИКАЦИЮ. /ЕСЛИ КНОПКА НАЖАТА, /ВЫСВЕТИМ СВЕТОДИОД. /ЕСЛИ КНОПКА НЕ НАЖАТА, /ПОГАСИМ СВЕТОДИОД. /ПОКА КНОПКА НАЖАТА, /СРАВНЕНИЯ НЕТ. f MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF UMNO,0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COMW /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧАЕМ ВЫХОД. г BCF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. COMW BSF PORTA,1 GOTO COMP BSF . PORTA,0 BCF PORTA,1 BSF FLAG,5 BTFSC COUS,0 /ВКЛЮЧЕН. /НА СРАВНЕНИЕ. /ВЫХОД ВКЛЮЧЕН. /ВЫКЛЮЧЕН. /УСТАНОВИМ ФЛАГ РАВЕНСТВА. /ЕСЛИ 1/4 СЕКУНДЫ НЕЧЕТНАЯ, GOTO COMP COMWO , BTFSC COUS,0 /СИГНАЛ НЕ ЗВУЧИТ. /ЕСЛИ 1/4 СЕКУНДЫ УЖЕ СТАЛА НЕЧЕТНОЙ, GOTO COMP BCF PORTA,2 NOP NOP NOP NOP BSF PORTA,2 GOTO COMWO /СИГНАЛ НЕ ЗВУЧИТ. /ВЫКЛЮЧИМ ВЫХОД. /ДЛЯ ВЫРАВНИВАНИЯ . /ДЛИТЕЛЬНОСТИ /ИМПУЛЬСА И ПАУЗЫ. /ПЕРИОД РАВЕН 1,22 МС - 0,8 КГЦ. /ВКЛЮЧИМ ВЫХОД. /ПОВТОРИМ. ; 5. УСТАНОВКА ЕДИНИЦ МИНУТ. UST BTFSS FLAG,1 RETURN BTFSS FLAG,3 /ЕСЛИ ИНДИКАЦИЯ ЗАПРЕЩЕНА, /ВЕРНЕМСЯ. /УСТАНОВКА РАЗРЕШЕНА, ЕСЛИ ПРОШЛА 1 СЕК RETURN BCF FLAG,3 BCF FLAG,0 MOVLW .15 SUBWF UMNO,0 BTFSC STATUS, /СБРОСИМ ФЛАГ 1 СЕКУНДЫ. /СБРОСИМ ФЛАГ КНОПКИ. /УСТАНОВКА ДО 15. 0 /С = 1, ЕСЛИ 15 И БОЛЕЕ. 296
<Песочные» часы GOTO USTH1 /ПЕРЕУСТАНОВИМ РЕГИСТР. INCF UMNO,1 /ПРИБАВИМ ЕДИНИЦУ В РАЗРЯД. GOTO UST3 /ПЕРЕПИШЕМ УСТАНОВКУ В РЕГИСТРЫ USTH1 CLRF UMNO /НУЛЕВОГО ЗНАЧЕНИЯ НЕТ. BSF UMNO,0 /УСТАНОВИМ В ЕДИНИЦУ. ; 6. ПЕРЕЗАПИСЬ УСТАНОВЛЕННЫХ ЗНАЧЕНИЙ В РЕГИСТР ИНДИКАЦИИ. UST3 MOVFW UMNO /ПЕРЕПИШЕМ ЗНАЧЕНИЯ MOVWF SCO /ЕДИНИЦ МИНУТ. RETURN ; 7. ВЫБОР РЕЖИМА ИНДИКАЦИИ. ZOO BTFSS GOTO FLAG,1 COMP /ЕСЛИ УСТАНОВКА ВЫКЛЮЧЕНА, /ИДЁМ НА СРАВНЕНИЕ. BTFSS PORTB,0 /ЕСЛИ КНОПКА НАЖАТА, BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS PORTB,1 /ЕСЛИ КНОПКА НАЖАТА, BCF PORTB,2 /ВЫСВЕТИМ СВЕТОДИОД. BTFSS FLAG1,2 /ЕСЛИ 2 СЕКУНДЫ ЕЩЕ НЕ ПРОШЛО, GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,0 /ПОКА КНОПКА НАЖАТА, УСТАНОВКИ НЕТ GOTO ZOO /ВЕРНЕМСЯ. BTFSS PORTB,1 /ПОКА КНОПКА НАЖАТА, УСТАНОВКИ НЕТ GOTO ZOO /ВЕРНЕМСЯ. BCF PORTA,0 /ВЫКЛЮЧИМ ПРЯМОЙ ВЫХОД. BSF PORTA,1 /ВКЛЮЧИМ ИНВЕРСНЫЙ ВЫХОД. BCF FLAG,3 ,•‘СБРОСИМ ФЛАГ 1 СЕКУНДЫ. BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. BSF PORTB,2 /ПОГАСИМ СВЕТОДИОД. CALL UST3 /ПЕРЕУСТАНОВИМ РЕГИСТР ИНДИКАЦИИ. ; 8. ИНДИКАЦИЯ УСТАНОВКИ. HOKL TSTF SCO /ЕСЛИ НЕТ УСТАНОВКИ, SKPNZ /РЕГИСТР НУЛЕВОЙ, GOTO HOZOO /ИДЕМ НА ЗАВЕРШЕНИЕ. HOKL1 BTFSS COUS,0 /ЕСЛИ РАЗРЯД РАВЕН ЕДИНИЦЕ GOTO HOKL1 DECF SCO, 1 /ВЫЧТЕМ 1 ИЗ РЕГИСТРА. BCF PORTB,2 /ВКЛЮЧИМ ВЫХОД. HOZKLO BTFSC 'COUS,0 /ЕСЛИ РАЗРЯД УЖЕ НУЛЕВОЙ, GOTO HOZKLO BSF PORTB,2 /ВЫКЛЮЧИМ ВЫХОД. GOTO HOKL /НАЧНЕМ СНАЧАЛА. HOZOO BCF FLAG1,2 /СБРОСИМ ФЛАГ 2 СЕКУНД. 297
Устройства с индикацией точечными светодиодами CLRF GOTO c6us ZOO /ДЛЯ ВЫРАВНИВАНИЯ ПАУЗЫ ОБНУЛИМ СЧЕТЧИК. /НА ПАУЗУ 2 СЕКУНДЫ. ; 9. СОХРАНЕНИЕ : И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ. CONST MOVWF MOVFW MOVWF MOVFW MOVWF CALL BTFSC CALL RECONST BCF MOVFW MOVWF MOVFW MOVWF MOVFW RETFIE W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И STATUS /STATUS, STATUS_TEMP ; FSR /FSR. FSR_TEMP SI /ПРИБАВИМ 1 В СЧЕТЧИК. FLAG,3 . /ОПРОС КНОПОК ЧЕРЕЗ 1 СЕК. KEY /ПРОВЕРИМ КНОПКИ. /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ. STATUS_TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: STATUS /STATUS, FSRJTEMP FSR iFSR, W_TEMP /W. /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ1. ; 10. СЧЕТ. SI Ml M1M INCF COUS,1 MOVLW .4 SUBWF COUS,0 SKPZ RETURN CLRF COUS MOVFW SEC1 ADDLW -3BH BZ Ml INCF SEC1,F BTFSC SEC1,1 BSF FLAGl,2 BTFSC SEC1,O BSF FLAG,3 RETURN CLRF SEC1 BTFSC FLAG,5 GOTO MOO BTFSC FLAG,1 GOTO MOO MOVFW MINI ADDLW -OFH BZ MOO INCF MIN1,1 RETURN /+1 В СЧЕТЧИК. /ЕСЛИ УЖЕ 1 СЕКУНДА, /4 х 0,25, f /ОБНУЛИМ СЧЕТЧИК. /ЗАГРУЗКА В РАБ. РЕГИСТР. /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. /ПРИБАВИТЬ 1 В СЕКУНДЫ. /ЕСЛИ РАЗРЯД ЕДИНИЦА, /УСТАНОВИМ ФЛАГ 2 СЕКУНД. /ЕСЛИ РАЗРЯД ЕДИНИЦА, /УСТАНОВИМ ФЛАГ 1 СЕКУНДЫ. f /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. /ЕСЛИ УЖЕ БЫЛО РАВЕНСТВО, /ИДЕМ НА ОБНУЛЕНИЕ. /ПОКА ИДЕТ УСТАНОВКА, /МИНУТЫ НЕ СЧИТАЕМ. /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ,•-15. /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ОБНУЛИМ. /ПРИБАВИТЬ 1 В МИНУТЫ. 298
Автомат управления размораживанием холодильника моо CLRF MINI /ОБНУЛИМ ОБЩИЙ РЕГИСТР МИНУТ. RETURN END Автомат управления размораживанием холодильника Под таким названием была опубликована статья С. Бирюкова в журнале «Радио» [15]. Описанное устройство предназначено для автоматического вклю- чения размораживанием холодильников типа «Ока-6» один раз в течение двух суток на 30 минут. В этой статье описано аналогичное устройство, в котором используется один микроконтроллер PIC16F84A вместо 5 логических микро- схем в оригинальной статье. Алгоритм работы программы микроконтроллера показан на рис. 70. После пуска и инициализации, программа постоянно выполняет сравнение значений часов и минут с установленной константой времени включения выхода. Время включения выхода запрограммировано через 30 часов после подачи напряжения питания. А время выключения выхода принято, согласно данным статьи С. Би- рюкова, через 30 минут после включения двигателя компрессора. Если выход выключен, то сравнение производится только на включение выхода, т. е. на 30 часов 00 минут. После совпадения значений регистров часов и минут с установ- ленным временем, устанавливается флаг равенства, и процессор зацикливается в ожидании установки флага включения дйигателя компрессора. При поступлении на вход RB0 логического нуля, что свидетельствует о включении двигателя компрессора, проверяется, было ли равенство часов и минут. Если равенство было, то проверяется флаг включения двигателя комп- рессора. При выполнении этих условий прерывание завершается. Если двига- тель еще не включался, то устанавливается в единицу флаг включения двигате- ля и производится расчет времени (Ч., М.) выключения выхода. Для этого к те- кущему значению минут прибавляется 30 минут (время, в течение которого будет включен клапан) и производится сравнение регистра минут на перепол- нение. Если значение регистра минут более 60, то инкрементируется регистр часов и выполняется сравнение на его переполнение (48 часов). Таким обра- зом, производится привязка времени выключения клапана размораживания ко времени включения двигателя компрессора. Если двигатель компрессора не включится вообще (поломка), то размораживание холодильника не произойдет. Когда выход включен, то следующее сравнение будет производиться по вре- мени выключения. При равенстве значений регистров часов и минут Ч-часам М-минутам, выход выключится (установится в «единицу»), сбросятся флаги равенства и включения двигателя. Программа готова к новому циклу включе- ния клапана, который произойдет через 48 часов. Из любого адреса сравнения происходит прерывание. Прерывание возмож- но при переполнении таймера TMR0 и при изменении сигнала на входе RB0. После инициализации программы начинает работать предделитель, с коэффи- 299
Устройства с индикацией точечными светодиодами вход RB0 УСТАНОВКА ВРЕМЕНИ ВЫКЛЮЧЕНИЯ- Ч.М. У ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ Рис. 70. Алгоритм работы программы автомата управления размораживанием холодильника циентом деления равным 32, и таймер с коэффициентом деления — 256. После наступления прерывания сохраняются значения регистров и проверяются зна- чения флагов прерывания, чтобы определить по какому параметру произошло прерывание. Прерывания по переполнению таймера происходят каждую секунду и инк- рементируют счетчики часов. Счетчик часов установлен на значение 48 часов. При каждом включении двигателя компрессора происходит прерывание по изменению сигнала на входе RB0. Программно установлено прерывание по из- менению сигнала из единицы в ноль. Если не произошло равенство минут и часов, то прерывание завершается. Если во время прерывания по входу RB0 произойдет переполнение таймера, то после завершения прерывания по входу, произойдет прерывание по переполнению таймера. Таким образом, прерыва- 300
Автомат управления размораживанием холодильника ние, которое произошло во время выполнения другого прерывания, обязатель- но выполняется. Для контроля работоспособности устройства выход порта RA2 устанавлива- ется в то же состояние, в котором находится нулевой разряд счетчика секунд (на рисунке 1 не показано). Таким образом, свечение контрольного светодиода будет происходить с периодом в 2 секунды (секунда вспышка — секунда пауза). Пропуск паузы в свечении светодиода в один период будет происходить при переполнении счетчика секунд, когда происходит увеличение счетчика минут. На рис. 71 показана схема автомата управления размораживанием холодиль- ника. Тонкой линией выделена упрощенная схема электрооборудования холо- дильника. Электродвигатель компрессора обозначен буквой М, клапан размо- раживания — буквой К, выключатель терморегулятора — SK1, кнопка ручного включения режима размораживания — SK2. Рис. 71. Автомат управления размораживанием холодильника В микроконтроллере прямой выход RA1 продублирован инверсным выхо- дом RA0. Выход RA2 используется для контроля работоспособности устройст- ва. Светодиод HL1 установлен синего свечения (красный цвет — цвет опасно- сти), но может быть любого типа с соответствующей корректировкой номинала гасящего резистора R2. С прямого выхода RA1 микроконтроллера, через гасящий резистор R1 на- пряжение высокого уровня поступает на светодиод оптопары МОС3043М [16]. Оптопару можно брать любую из серии МОСЗОхх, но тогда может потребовать- ся подбор номинала резистора R1. Импортную оптопару U1 можно заменить отечественной типа АОУ160А с соответствующим изменением схемы включе- ния. Светодиод оптопары открывает внутренний оптосимистор, и напряжение с анода симистора S1 подается на его управляющий вход. Симистор S1 откры- вается и включает клапан размораживания. Питание микроконтроллера осуществляется от сети через гасящий конден- сатор С6 и резистор R6, выпрямитель на диодах VD3, VD4, конденсаторы фи- 301
Устройства с индикацией точечными светодиодами льтра Cl, С2 и стабилитрон VD5. Напряжение с двигателя компрессора на вход RB0 подается через выпрямитель на диодах VD1, VD2 и гасящий резистор R4. Конденсатор С5 предотвращает ложные срабатывания микроконтроллера от импульсной помехи. Если двигатель компрессора не включен, то на входе RB0 присутствует уровень логической единицы, поскольку все входы RB програм- мно подтянуты внутренними резисторами микроконтроллера к плюсу напря- жения питания. Топология печатной платы автомата, изготовленной из одностороннего стеклотекстолита, показана на рис. 72. Расположение элементов на плате дано на рис. 73. Конденсатор С6 должен быть на напряжение не ниже 400 вольт. Лучше использовать конденсатор типа К73-17 на рабочее напряжение 630 вольт. Кварцевый резонатор ZQ1 — миниатюрный цилиндрический. В собранное устройство микроконтроллер устанавливается в последнюю очередь. Сначала, вместо микроконтроллера, параллельно конденсатору С1 установите любой светодиод с соответствующим гасящим резистором. Если, при подаче напряжения сети, светодиод загорится, то проверьте напряжение на конденсаторе С1. Его значение должно быть в пределах 4,2—5,2 вольта в зави- симости от экземпляра стабилитрона VD5. После проверки напряжения пита- ния, можно устанавливать в микросхемную панельку микроконтроллер. Работа с устройством. После включения холодильника в сеть должен зами- гать светодиод. Если светодиод мигает, значит, программа микроконтроллера работает. Желательно, чтобы размораживание холодильника происходило в ночное время. Поэтому необходимо включать холодильник в 19—22 часа. Тогда размораживание холодильника произойдет через 30 (24+6) часов, т. е. с 1 часа до 4 часов ночи. В последующем размораживание будет происходить в одно и то же время через 48 часов. Выключение напряжения сети до 30 минут изменя- Рис. 72. Автомат управления размораживанием холодильника. Печатная плата 1 К HL1 2 К ни ВЫХ Рис. 73. Автомат управления размораживанием холодильника. Расположение элементов на печатной плате 302
Автомат управления размораживанием холодильника ет время начала размораживания холодильника на 10—15 минут. За счет напря- жения заряженного конденсатора микроконтроллер прекращает работу, но значения регистров сохраняются. Поэтому, после включения напряжения, микроконтроллер продолжает счет, но с небольшим опозданием по времени. Это устройство можно применить и для любого другого холодильника, име- ющего полуавтоматическую систему размораживания. ВНИМАНИЕ! При работе с устройством необходимо соблюдать осторож- ность, поскольку все детали находятся под напряжением сети. / АВТОМАТ УПРАВЛЕНИЯ РАЗМОРАЖИВАНИЕМ ХОЛОДИЛЬНИКА. ; ВРЕМЯ РАЗМОРОЗКИ - 30 МИНУТ, ЧЕРЕЗ 48 ЧАСОВ. ; РАЗРАБОТАЛ НИКОЛАЙ ЗАЕЦ. ; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ РАДИОЛЮБИТЕЛЯМИ. ; п.ВЕЙДЕЛЕВКА, БЕЛГОРОДСКОЙ. ; saes@mail.ru ; ПРОГРАММА = XOLOD.ASM ; ВЕРСИЯ: 31.05.03. ; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.61.00. ♦INCLUDE P16F84A.INC CONFIG 3FF0H / ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32,768 КГЦ. « — ag~=g=ggg агава as зааевае = as = assess esse =: as as as assess HWK EQU 1EH .-ВКЛЮЧЕНИЕ ЧЕРЕЗ 30 ЧАСОВ MWK EQU ООН ' ;ПОСЛЕ ВКЛЮЧЕНИЯ ПИТАНИЯ. /ВЫКЛЮЧЕНИЕ ЧЕРЕЗ 30 МИНУТ. • sssessssssssss: ss as asses as aatssss ; СПЕЦ. РЕГИСТРЫ. • ssasasssasasss assess as seas ===== INDF EQU 00H /ДОСТУП К ПАМЯТИ ЧЕРЕЗ FSR. TIMER0 EQU 01H ;TMR0. OPTIONR EQU 81H /OPTION (RP0=l). PC EQU 02H /СЧЕТЧИК КОМАНД. STATUS EQU 03H /РЕГИСТР СОСТОЯНИЯ АЛУ. FSR EQU 04H /РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ PORTA EQU 05H /ПОРТ А ВВОДА/ВЫВОДА. PORTB EQU 06H /ПОРТ В ВВОДА/ВЫВОДА. TRISA EQU 85H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА А. TRISB EQU 86H /НАПРАВЛЕНИЯ ДАННЫХ ПОРТА В. INTCON EQU 0BH /РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ. • asasasasasass s as as as as as as ss ss ss ss: ============================ ; ОПРЕДЕЛЕНИЕ ВХОДОВ. ♦ =====—s ; RBO > вход : ВКЛЮЧЕНИЯ ДВИГАТЕЛЯ. ; RAI > выход ПРЯМОЙ (1). ; RAO > выход ИНВЕРСНЫЙ (0). / ОПРЕДЕЛЕНИЕ РЕГИСТРОВ УСТАНОВКИ. • ====== .seas as as as as as as as ass: :================= SEC1 EQU 11Н /СЧЕТЧИК СЕКУНД. MINI EQU 12Н /СЧЕТЧИК МИНУТ. 303
Устройства с индикацией точечными светодиодами HOU1 FLAG HWUK MWUK EQU 13H /СЧЕТЧИК ЧАСОВ. EQU 14H / EQU 15H / EQU 16H / ; ВРЕМЕННЫЕ РЕГИСТРЫ. W TEMP EQU 2ОН /БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ. STATUS TEMP EQU 21H /БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ. FSR_TEMP EQU 22H /ВРЕМЕННЫЙ ДЛЯ FSR. / 1. ПУСК. Г ORG 0 GOTO INIT ORG 4 GOTO CONST ; 2. ИНИЦИАЛИЗАЦИЯ. INIT BSF STATUS,RPO /ПЕРЕХОДИМ В БАНК 1. MOVLW В'ОООООЮО' /ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ПОДКЛЮЧЕНЫ, К=32 =...100 MOVWF OPTION REGA80H / MOVLW В'10110000' /РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0 MOVWF INTCON /И ИЗМЕНЕНИЮ СИГНАЛА НА RB0. MOVLW В'00000000' /ВСЕ НА ВЫХОД. MOVWF TRISAA80H MOVLW В'00000001' /RBO-НА ВХОД, ОСТАЛЬНЫЕ - ВЫХОД. MOVWF TRISBA80H BCF STATUS,RP0 -/ПЕРЕХОДИМ В БАНК 0. CLRF TMR0 /ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ. CLRF SEC1 CLRF MINI CLRF HOU1 CLRF FLAG CLRF HWUK CLRF MWUK CLRF PORTB CLRF PORTA BSF PORTA,1 GOTO COMP /НА СРАВНЕНИЕ. ; 3. . UST BTFSS FLAG,1 GOTO RECI BTFSC FLAG,0 GOTO RECI BSF FLAG,0 MOVFW HOU1 MOVWF HWUK MOVFW MINI ADDLW .30 304
Автомат управления размораживанием холодильника MOVWF MWUIG MOVLW .60 SUBWF MWUK,0 ' BTFSC STATUS,0 GOTO $+2 GOTO REC1 MOVWF MWUK INCF HWUK,1' MOVLW .48 SUBWF HWUK,0 BTFSS STATUS,0 GOTO REC1 MOVWF HWUK GOTO RECI ; 4. СРАВНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ. COMP BTFSC FLAG,0 /ЕСЛИ ВЫХОД ВКЛЮЧЕН, GOTO COMWU ;ПОЙДЕМ ВЫКЛЮЧАТЬ. MOVFW HOUl /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBLW HWK /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BNZ COM /ЕСЛИ ОНИ НЕ РАВНЫ, ЗАЦИКЛИВАЕМСЯ. MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBLW MWK /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВКЛЮЧЕНИЯ. BZ COMW /ЕСЛИ ОНИ РАВНЫ, ВКЛЮЧАЕМ ВЫХОД. COM BCF FLAG,1 BCF PORTA,1 /ВКЛЮЧЕН. BSF PORTA,0 /ВЫХОД ВЫКЛЮЧЕН. BCF FLAG,0 GOTO COMP /НА СРАВНЕНИЕ. COMW BSF FLAG,. 1 Z BTFSS FLAG,0 г GOTO $-1 BSF PORTA,1 ;ВЫКЛЮЧЕН. BCF PORTA,0 /ВЫХОД ВКЛЮЧЕН. COMWU MOVFW HOUl /СРАВНИМ ЗНАЧЕНИЕ ЧАСОВ SUBWF HWUK,0 / СО'ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BNZ COMP " /ЕСЛИ ОНИ НЕ РАВНЫ, ЗАЦИКЛИВАЕМСЯ MOVFW MINI /СРАВНИМ ЗНАЧЕНИЕ МИНУТ SUBWF MWUK,0 /СО ЗНАЧЕНИЕМ ВРЕМЕНИ ВЫКЛЮЧЕНИЯ. BZ COM /ЕСЛИ ОНИ РАВНЫ, ВЫКЛЮЧАЕМ ВЫХОД. GOTO COMP /НА СРАВНЕНИЕ. 5. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ CONST MOVWF W_TEMP /СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И MOVFW STATUS /STATUS, MOVWF STATU?_TEMP / MOVFW FSR /FSR. MOVWF FSR TEMP 305
Устройства с индикацией точечными светодиодами BTFSC INTCON,1 /ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ, GOTO UST /ОБНУЛИМ. BTFSC INTCON,2 /ЕСЛИ ПРЕРЫВАНИЕ ПО ТАЙМЕРУ, CALL SI /ПРИБАВИМ 1 В СЧЕТЧИК. RECONST /ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ. BCF INTCON,2 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ ПО ТАЙМЕРУ. MOVFW STATUS TEMP /ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR TEMP MOVWF FSR / FSR, MOVFW W TEMP ,-w. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. RECI BCF INTCON,1 /СБРОСИМ ФЛАГ ПРЕРЫВАНИЯ ПО ВХОДУ. MOVFW STATUS TEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ: MOVWF STATUS /STATUS, MOVFW FSR TEMP MOVWF FSR /FSR, MOVFW W TEMP ,-W. RETFIE /ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ. / б. ЧАСЫ. SI MOVFW SEC1 /ЗАГРУЗКА В РАБ. РЕГИСТР. ADDLW -3BH /ВЫЧЕСТЬ ИЗ РЕГИСТРА 59. BZ Ml /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Ml. INCF SEC1,1 /ПРИБАВИТЬ 1 В СЕКУНДЫ. BTFSS SEC1,0 /МИГАНИЕ. СВЕТОДИОДА BSF PORTA,2 /С ЧАСТОТОЙ BTFSC SEC1,O /1 СЕКУНДА BCF PORTA,2 /НА ВЫХОДЕ ПОРТА "А2". RETURN 9 Ml CLRF SEC1 /ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД. M1M MOVFW MINI /ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР. ADDLW -3BH ,•-59. BZ Hl /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА Н1. INCF MINI,F /ПРИБАВИТЬ 1 В МИНУТЫ. RETURN 9 Hl . CLRF MINI ;ОБНУЛЯЕМ РЕГИСТР МИНУТ. HIH MOVFW HOUl /ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР. ADDLW -2FH /- 47. BZ H10 /СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА НЮ INCF HOUl,F /ПРИБАВИТЬ 1В ЧАСЫ., RETURN H10 CLRF HOUl /ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ. RETURN • ssssss ssssss ssss ssssss ssss sssssssssssesssss ss SS 5252==5235 as 3S 35 =2====ss ss ss ss SS SS SS END 52 SS 52 52 = = 52 52 SB 52 SS SB = SS 52 = SS 52 52 SB S 52 52 52 52 SS 52 52 SS 52 = = 52 SS SS 52 52 SS SB 52 = 52 52 52 = Sfi 306
Рекомендации * Для радиолюбителей, которые впервые сталкиваются с микроконтроллерами, но хотят повторить конструкции из этой книги Хорошо, если у вас есть компьютер. В худшем случае придется обратиться к другу или использовать компьютер на работе (конечно, с разрешения началь- ника). Компьютер должен иметь доступ в интернет. Интернет необходим для того, чтобы скачать программу на программатор PonyProg 2000. Эту программу и сам программатор разработал итальянец Claudio Lanconelli и разместил ее на своем сайте www.lancos.com для свободного использования. Этот программатор может программировать много различных микроконтроллеров и микросхем па- мяти, которые поддерживают последовательное программирование. Войдя на сайт, откройте страницу PonyProg. Вы увидите различные версии программы и перечень языковых версий. Выберите русскую версию и перека- чайте ее на свой компьютер в любую директорию. Если у вас есть журналы «Радио» за 2001 год, а конкретно номера 6 и 7, то больше ничего с сайта копи- ровать не надо. Если у вас нет журналов, то необходимо скопировать страницу со схемами в формате PDF базового блока и адаптеров — si-prog-v2-2.pdf. Не- обходимо изготовить этот программатор либо по журналу, либо со страницы автора. Можно делать один адаптер, если вы рассчитываете программировать один тип микросхем, но можно сделать и все адаптеры (на будущее) без разъе- мов, расположив их по плоскостям используемого корпуса. Кроме этого необ- ходимо изготовить кабель-переходник с соединением проводов один к одному. Если на концах кабеля у вас различные разъемы, например DB-25 и DB-9, то соответствие их выводов такое: 2-3, 20-4, 7-5, 6-6, 4-7, 5-8, 25-9 (3-2, 8-1, 22-9 — не используются в программаторе). Первая цифра для разъема типа DB-25. Выводы 25 и 9 используются как общие. Программа PoniProg2000 для программатора запускается с любой директо- рии. Если у вас есть программа и программатор, то необходимы еще файлы программ для программирования микроконтроллеров. Все .hex-файлы для устройств в этой книге можно взять на странице автора www.radic.newmail.ru. Работа с программатором РопуРгод2000 Этот программатор — настоящая маленькая лошадка, которая «тянет» про- граммирование многих микросхем. Откройте программу и нажмите «Установ- ки» — «Калибровка». После окончания калибровки откройте «Настройки обо- рудования». 'Установите точку возле используемого вами параллельного или последовательного порта. Обычно используют последовательный порт, чтобы быстрее переставлять разъемы от модема к программатору. Выберите надпись V 307
Рекомендации, «Si ProgAPI» при последовательном порте и поставьте точку возле порта, кото- рый используется для модема. Обычно это порт Сот2. Далее откройте «Коман- ды» — «Настройки программирования». В открывшемся окне поставьте «галоч- ки» возле надписей: «Открыть заново файлы», «Стереть», «Записать память программ (FLASH)», «Записать память данных (EEPROM)», «Записать биты защиты и конфигурации». Пусть вас не пугает последняя надпись. Дело в том, что в каждой программе записан регистр конфигурации «_CONFIG» и его восьмеричный код, кото- рый определяет выбор типа используемого генератора, состояние таймеров WDTE, PWRTE и биты защиты. Так вот защита во всех программах отключена установкой битов защиты в единицу (3FF). А установка защиты необходима, чтобы микроконтроллер правильно определил тип генератора. Если этого не сделать, то ваше устройство не заработает. Правда, в программе попутаны биты конфигурации генератора при считывании (выдаются инверсные значения, от- меченное окно соответствует нулевому значению), но при записи, судя по ра- ботающим программам, установки производятся правильно. Ни в коем случае не нужно устанавливать конфигурацию в окне «Считать биты защиты й конфигурации». Если программируемая микросхема имела пло- хой контакт, то считывание будет таким, что все окна будут отмечены «галоч- кой». Произойдет запись защиты и микросхему уже нельзя будет перепрограм- мировать. Конечно, если у вас одноразовый микроконтроллер с буквой «С», то это не имеет значения. Сделав все настройки программы, откройте.hex-файл программы, установите микросхему в панельку. При установке микросхемы в панельку будьте внимате- льны. Ключи импортных микросхем отличаются от ключей отечественных мик- росхем. Но если вы неправильно установили микросхему на короткое время, то это не приведет к ее выходу из строя. Микроконтроллеры PIC16F 84 имеют боль- шой запас по прочности. Мне доводилось в устройстве подавать питание 9 В, устанавливать на плату микросхему ключом в обратную сторону — микросхема разогревалась (скорее, раскалялась), но позже работоспособность восстанавлива- лась. Естественно, нет надобности проверять это на собственном опыте. Установите тип программируемого устройства (в нашем случае это «Р1С 16 micro») и тип микросхемы. Микроконтроллеры PIC16F84 и PIC16F84A иден- тичны, но программируются с различной скоростью, поэтому необходимо устанавливать в программаторе именно тот тип микросхемы, который у вас есть. Нажмите «Команды» «Программирование» и ждите окончания програм- мирования. Вставлять и вынимать микросхему из программатора можно не от- ключая питания, но подсоединение программатора к последовательному порф компьютера рекомендуют выполнять при выключенном компьютере. Это на тот случай, если вы используете чужой компьютер. Читать все это, возможно, трудно и непонятно, но, проделав операцию про- граммирования один раз, в дальнейшем это будет сделать проще, чем включить освещение1 в комнате. Тем более что все сделанные установки сохраняются. Единственное, что надо делать при каждом открывании программы Po- ny Prog2000, так это выполнять калибровку на время прохождения сигнала по тракту компьютера.' 308
Рекомендации Для радиолюбителей, которые хотят изменить программы под свои требования Для экспериментов с изменением программ вам кроме компьютера будет необходима программа ассемблера и отладчика микроконтроллеров фирмы Microchip. Это пакет программ MPLAB. Эта программа постоянно обновляется новыми типами микроконтроллеров и новыми версиями симуляторов. Поэто- му каждая версия имеет различный объем. Так версия 5.61 имела объем 12 МБ. Йоследная версия 6.22 уже имеет объем 26,4 МБ. Скачать программу можно с сайта www.microcliip.com и www.microchip.ru. На русском сайте программа запи- сана целиком, а с разбивкой по 1,4 МБ программа качается из американского сайта. Упакованную программу необходимо распаковать в директорию с анг- лийскими буквами. Установка программы производится обычным способом. На русском сайте необходимо скачать файл описания работы программы MPLAB. Сама программа выполнена на английском языке, но по описанию на русском языке нетрудно разобраться в назначении надписей на кнопках. Жела- тельно сразу скопировать и справочные данные (на русском языке) на микро- контроллер PIC16F84A. Далее необходимо скопировать исходный текст программы в файл с таким - же именем. Сначала создайте папку с одинаковым с текстом программы име- нем. Затем откройте в программе MPLAB «File» — «New». Откроется новое ок- но. Перепишите исходный текст выбранной программы в это окно. При этом необходимо соблюдать следующие требования: присваивание значений регист- рам и имена (метки) подпрограмм пишутся с первой позиции строки, директи- вы и мнемоники команд можно писать со второй и последующих позиций строки. После точки с запятой можно писать любые комментарии (общая дли- на строки 256 знаков). Для ускорения процесса выхода на отладку программы комментарии можно не писать. Если в этом будет необходимость, то вы всегда сможете написать комментарии, тем более что книга у вас под рукой. Но при написании хоть одной новой строчки не ленитесь писать подробные коммента- рии. После написания программы сохраните ее под именем ранее созданной папки, откройте «Project» — «New Project». В открывшемся окошке найдите имя вашей папки и проставьте имя проекта, которое должно быть таким же, как имя папки. После нажатия «ОК» появится окно с установками параметров проекта. В окне «Language Tool Suite» выберите «Microchip». Возле окна «Development Mode» нажмите «Change...». Откроется окно параметров. На странице «Tools» установите «MPLAB SIM Simulator», установите тип микроконтроллера в окне «Processor» либо «PIC16F84A», либо «PIC16F84». Откройте страницу «Clock» и установите тип кварцевого резонатора и его частоту. Остальные настройки оставьте без изменений (по умолчанию). Нажмите «ОК», закроется окно пара- метров и откроется окно параметров проекта. Нажмите «Add Node» и присое- дините к проекту файл с программой, которую вы написали ранее. Эта про- грамма будет с расширением .asm. Окно параметров проекта закроется. На- жмите «File» — «Open» и откройте файл программы. Далее оттранслируйте программу и в папке появятся файлы с другими расширениями. Файл с расширением «.wat» хранит имена регистров, которые вы вывели для наблюдения в процессе работы программы. Файл с расширением «.hex» являет- 309
Рекомендации ся восьмеричным кодом программы для записи в микроконтроллер. Файл с расширением «.егг» хранит ошибки, которые обнаружены в программе во вре- мя трансляции. Файл с расширением «.1st» хранит листинг программы. В файле «.$$$» находится копия вашей программы, которая сохранена во время послед- него закрытия программы. Если вы запортили программу так, что трудно вспомнить,’ куда и что вы вписывали, или во время работы завис ассемблер, то простым копированием через буфер компьютера можно восстановить либо фрагмент программы, либо всю программу. После всего вышеперечисленного можно начинать эксперименты с изменением программы. Некоторые «глюки» программы MPLAB Эта программа является мощным инструментом написания и отладки про- грамм для микроконтроллеров. Появление таких. программ способствовало продвижению микроконтроллеров в любительские разработки. К сожалению, во время работы с программой возникают ошибки, которые могут ввести в за- блуждение программиста. Можно лихорадочно изменять программу, а все дело будет в ошибке программы ассемблера. Чтобы сохранить ваши нервы и время, приведу перечень обнаруженных мною «глюков» программы и способы (если возможно) их игнорирования. ♦Счетчик инкрементируется до определенного числа, а затем сбрасывается и программа начинается с нулевого адреса. Устранение возможно сменой адре- са регистра счетчика (переустановка блока программы на другое место в про- грамме). ♦Программа переустанавливается через 18 мс. Срабатывает WDT-таймер, хотя его работа запрещена. Устранение разбрасыванием по программе команды CLRWDT через промежуток времени менее 18 мс. ♦Если в программе была изменена одна буква в мнемонике регистра или команды, например, команда BTFSC заменена командой BTFSS, то MPLAB иногда не видит этот регистр или команду. Устранение переписыванием мне- моники регистра или команды полностыО. ♦Во время работы, чаще в пошаговом режиме, не изменяются значения тай- мера TMR0 и предделителя. Устранение перезапуском программы. ♦При длительной работе в пошаговом режиме стираются надписи на кноп- ках. Программа становится неуправляемой. Неустранимо. Нужен перезапуск программы и компьютера. ♦При случайной записи имени регистра было пропущено присвоение адре- са. Программа работала, но нельзя было вывести регистр для наблюдения за его изменением. Устранение: присвоить адрес регистру. ♦ ♦Поскольку после прерывания восстанавливается адрес программы, следую- щий за тем, что был* перед прерыванием, то программа пропускает выполнение подпрограмм (макроопределений), которые встроены в ассемблер MPASM. Например, прерывание наступает во время перехода к команде SKPNZ, а по- сле прерывания возвращается к следующей команде. Поскольку сравнение не выполнено, то в действительности возвращаться из прерывания необходимо было бы к той же команде. По всем параметрам сравнения необходимо пропу- стить следующую команду, а программа ее выполняет. 310
Рекомендации Устранение: осторожно пользоваться макроопределениями в тех местах про- граммы откуда возможны прерывания. Лучше не полениться и расписать мак- роопределение простыми командами. Иногда приходится дублировать команды сравнения типа BTFSS(C). *При перезаписи в рабочий регистр значения порта переписывается значе- нйе регистров установок входов/выходов порта (TRISA, TRISB). Результат сравнения порта на одновременное нажатие двух кнопок получается ошибоч- ным. Устранение: переписать фрагмент программы так, чтобы использовать побитное сравнение значений входов порта. *При установлении регистров в окне Watch вместо бинарного значения вы- бранного регистра устанавливается хексадецимальное (восьмеричное). Устра- нение: перезапуск программы. ♦Постоянное переполнение стека. Устранение: изменением расположения блоков программы.. Иногда приходится изменять программу. Программу нельзя оставлять на длительное время свернутой. Потом выска- кивает «Ошибка в программе». Следствие этого — закрытие программы. Осо- бенно это обидно, если программа не сохранена. Поэтому надо чаще сохранять написанную программу. Обязательное сохранение программы перед каждой трансляцией. Чтобы не иметь сомнений по поводу того, кто виноват в приведенных выше «глюках» — программа или компьютер, проверялись в работе две версии про- граммы: версия 5.50 и версия 5.61. Работа проводилась на двух компьютерах Р166ММХ и Р500. В результате оказалось, что виновата программа. Полезные советы при работе с ассемблером ♦Если вам необходима длительная проверка программы, то закройте окно установки выводов при асинхронной симуляции. Значения установленных вхо- дов при закрытом окне сохраняются, зато программа начинает работать очень быстро. ♦Если вы хотите переписать подпрограмму, то старый текст скопируйте ни- же окончания программы. В дальнейшем его легко можно будет вернуть на место. ♦Если вы хотите переписать несколько строчек, то не торопитесь убирать старый текст. Закомментируйте строчки, то есть сделайте их комментариями. Для этого поставьте точку с запятой перед ненужной строкой. Если в дальней- шем новая программа не пойдет, то нетрудно восстановить старый текст, убрав точку с запятой. ♦По этой же причине новый текст программы записывайте смещенным от основного текста. ♦При необходимости ускорить процесс счета счетчиками можно при возвра- те из прерывания задать таймеру значение, близкое к прерыванию, а коэффи- циент деления предделителя установить равным 2, оставив запись в коммента- риях о правильном значении коэффициента деления. Например: INIT BSF STATUS,RPO * /ПЕРЕХОДИМ В БАНК 1. MOVLW В'00000000' ;К=2. К=32 '....100' MOVWF OPTION_REGA80H 311
Рекомендации Значение таймеру необходимо задавать перед восстановлением значения ра- бочего регистра, чтобы не изменить значение рабочего регистра. Например: MOVFW FSR_TEMP MOVWF FSR MOVLW.250 MOVWF TMRO MOVFW W_TEMP RETFIE. ПРЕРЫВАНИЯ. ; FSR, ;НОВЫЕ /СТРОЧКИ. ;w. /ВОЗВРАТ ИЗ Кроме этого для ускорения работы программы можно временно устанавли- вать уменьшенные значения различных счетчиков и счетчиков пауз. Для этого хорошо подходит окно программы «Modifi», в котором можно придать любое значение выбранному регистру. Для проверки работы часов можно после пре- рывания сделать посыл не на счетчик секунд, а на счетчик минут. Тогда суточ- ный ход часов пройдет в 60 раз быстрее. 312
Приложения ф 1. Справочные данные на микроконтроллер PIC16F84A PDIP, SOIC -----+ RA2 _ RA3 _ 1 18 _RA1 _RA0 RA4/T0CKI_ _OSC1/CLKIN MCLR_ _OSC2/CLKOUT Vss _ PIC16F84 _Vdd RBO/INT _ _RB7 RBI _RB6 RB2 _RB5 RB3 9 10 _RB4 + Расположение выводов Функциональиое назначение выводов Обозначение Нормальный режим Режим записи EEPROM RAO - RA3 Двунаправленные линии ввода/выво- да. Входные уровни ТТЛ - RA4/RTCC Вход через триггер Шмитта. Ножка порта ввода/вывода с открытым сто- ком или вход частоты для тайме- ра/счетчика RTCC - RBO/INT Двунаправленная линия порта вво- да/вывода или внешний вход преры- вания. Уровни ТТЛ - RBI - RB5 Двунаправленные линии ввода/выво- да. Уровни ТТЛ - RB6 Двунаправленные линии ввода/ вы- вода. Уровни ТТЛ Вход тактовой частоты для EEPROM RB7 Двунаправленные линии ввода/ вы- вода. Уровни ТТЛ Вход/выход EEPROM данных /MCLR/Vpp Низкий уровень на этом входе гене- рирует Сигнал сброса для контролле- ра. Активный низкий Сброс контроллера. Для режима EEPROM — подать Урр. 313
Приложения Обозначение Нормальный режим Режим записи EEPROM 1 OSC1/CLKIN Для подключения кварца, RC или вход внешней тактовой частоты OSC2/CLKOUT Генератор, выход тактовой частоты в режиме RC генератора, в остальных случаях — для подкл.кварц Vdd Напряжение питания Напряжение пиГания Vss Общий (земля) Общий RB4—RB7 можно использовать как вход внешнего прерывания по измене- нию сигнала. Максимальные значения электрических параметров Выход параметров за данные пределы может привести к повреждению мик- росхемы. Работа кристалла на предельно допустимых значениях в течение дли- тельного времени повлияет на его надежность, Интервал рабочих температур.......................—55...+125 °C Температура хранения..............................—65...+150°С Напряжение на любой ножке относительно Vss (земли) (исключая Vdd и /MCLR) . . . .........— 0,6...Vdd +0,6 В Напряжение Vdd относительно Vss...................0...+7.5 В Напряжение на /MCLR относительно Vss.............. . 0...+14 В (прим. 2) Общая рассеиваемая мощность....................... 800 мВт (прим. 1) Макс, ток в ножку Vss.............................150 мА Макс, ток в ножку Vdd.............................100 мА Макс, ток в любую ножку ввода.....................±500 мкА Макс, втекающий ток (любая ножка Вывода)..........25 мА Макс, вытекающий ток (любая ножка Вывода).........20 мА Макс, суммарный вытекающий ток для всех ножек порта_А............................80 мА Макс, суммарный вытекающий ток для всех ножек порта_В............................50 мА Макс, суммарный втекающий ток для всех ножек порта_А.......................... 50 мА Макс, суммарный втекающий ток * для всех ножек порта_В.........'..................100 мА Примечания: 1. Полная рассеиваемая мощность не должна превышать 800 мВт для каж- дого корпуса. 2. Понижение напряжения на ножке /MCLR ниже Vss (земля) вызывает бо- льшие токи, более 80 мА, и может привести к повреждению этой линии. Поэ- тому рекомендуем подавать сигналы на ножку /MCLR через ограничивающий резистор 50—100 Ом. 314
1. Справочные данные на микроконтроллер PIC16F84A Обзор регистров и ОЗУ Область ОЗУ организована как 128 х 8. К ячейкам ОЗУ можно адресоваться прямо или косвенно, через регистр указатель FSR (04h). Это также относится и к EEPROM памяти данных-констант. Page 0 Page 1 — 00 Indirect add. Indirect add. 80 01 TMRO OPTION 81 02 PCL PCL 82 03 STATUS STATUS 83 04 FSR FSR 84 1 05 PORTA TRISA 85 1 06 POTR В TRISB 86 | 07 87 1 08 EEDATA EECON1 ’ 88 ' ' ‘ | 09 EEADR EECON2 89 0А PCLATH PCLATH 8А ОВ INTCON INTCON 8В ос 2F POH POH 8С AF 30 4F POH POH ВО CF 7F не реализованы читаются как 0 не реализованы читаются как 0 FF Назначение разрядов регистра состояния АЛУ STATUS | Бит Назначение 7 IRP — выбор банков при индексной адресации через FSR 0 = банки 0, 1 1 = банки 2, 3 6-5 RP1—RP0 — выбор банка (с 0 по 3) при прямой адресации 00 = банк 0 01 = банк 1 10 = банк 2 » 11 = банк 3 1 315
Приложения Бит Назначение 4 -ТО — флаг переполнения сторожевого таймера 1 = после POR или CLRWDT и SLEEP 0 = после тайм-аута WDT 3 -PD — бит включения питания 1 = после POR и CLRWDT 0 = после выполнения команды SLEEP 2 Z — бит нуля 1 = результат операции равен нулю 0 = результат операции не равен нулю 1 DC — бит десятичного переноса/заема, заем отрицательной полярности 1 = был перенос из младшего полубайта результата или не было заема 0 = был заем из младшего полубайта результата или не было переноса 0 С — бит переноса/Заема, заем имеет отрицательную полярность. 1 = был перенос из старшего бита результата или не было заема 0 = был заем из старшего бита результата или не было переноса Назначение разрядов регистра прерываний и флагов INTCON Бит Назначение 7 GIE — общее разрешение прерывания 0 = прерывания запрещены 1 = прерывания разрешены 1 6 EEIE — разрешение прерывания по завершению записи во Flash-ПЗУ 0 = прерывание запрещено 1 = прерывание разрешено 5 T0IE — разрешение прерывания по переполнению TMR0 0 = прерывание запрещено 1 = прерывание разрешено 4 INTE — разрешения внешнего прерывания с входа RBO/INT 0 = прерывание запрещено 1 = прерывание разрешено ♦ 3 RBIE — разрешения прерывания по изменению входного сигнала PORTB 0 = прерывание запрещено 1 = прерывание разрешено 2 T0IF — флаг прерывания по переполнению TMR0 0 = переполнение не происходило Г= произошло переполнение TMR0 -- - --- 1 316
1. Справочные данные на микроконтроллер PIC16F84A Бит Назначение INTF — флаг внешнего прерывания с входа RB0/INT (подлежит программной очистке) 0 = внешнее прерывание не происходило 1 = произошло внешнее прерывание L RBIF — флаг прерывания по изменению входного сигнала PORTB (подлежит програм- мной очистке) 0 = сигнал на входах RB4—RB7 не изменялся 1 = изменился сигнал на одном из входов RB4—RB7 Назначение разрядов регистра конфигурации OPTION Бит Назначение. 7 -RBPU — включение подтягивающих резисторов на входах В 0 = включены 1 = выключены 6 INTEDG — выбор фронта внешнего прерывания с входа RB0/INT 0 = по заднему фронту 1 = по переднему фронту 5 TOCS — выбор источника тактового сигнала для TMR0 0 = CLKOUT — синхронный с машинным циклом тактовый сигнал 1 = тактовый сигнал с входа TOCKI 4 TOSE — выбор активного фронта TOCK.I 0 = передний фронт 1 = задний фронт 3 PSA — управление подключением предделителя 0 = предделитель подключен к TMR0 1 = предделитель подключен к WDT 2-0 PS2—PS0 — выбор коэффициента деления предделителя PS2-PS0 TMRO WDT ООО ,1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 101 1:64 1:32 ПО 1:128 1:64 111 . ж 1:256 1:128 317
Приложения Управление EEPROM Управляющие регистры для EEPROM Название Функция Адрес Значение после I включения 1 EEDATA EEPROM регистр данных 08h хххх хххх EEADR EEPROM регистр ад- реса 09h хххххххх EECON1 EEPROM 1 управля- ющий регистр 88h 0000 хооо EECON2 EEPROM 2 управля- ющий регистр 89h Регистры EECON1 и EECON2 Регистр EECON1 (адрес 88h) — это управляющий регистр шириной пять бит. Младшие пять бит физически существуют, а старшие три бита читаются всегда как 'О'. Регистр EECON1 Адрес 88h Сброс при вкл. — 0000X000 - - - EEIF WRERR WREN WR RD 7 6 5 4 3 2 1 0 Управляющие биты RD и WR запускают соответственно чтение и запись. Они могут быть установлены только программно. Сбрасываются — аппаратно по завершении операций чтения/записи. Запрет программного сброса бита WR предотвращает преждевременное окончание записи. RD — бит чтения. RD =1: запускает чтение памяти данных EEPROM. Чтение занимает один цикл. Устанавливается программно. Обнуляется аппаратно. WR — бит записи. WR =1 : запускает запись в память данных EEPROM. Устанавливается программно. Обнуляется аппаратно. WREN — бит разрешения записи в память данных EEPROM. WREN = 1: разрешена запись. WREN = 0: запрещена запись. После включения питания WREN обнуляется. Флаг ошибки WRERR устанавливается, когда процесс записи прерывается сигналом сброса /MCLR или сигналом сброса от WDT-таймера. Рекомендуем 318
1. Справочные данные на микроконтроллер PIC16F84A проверять этот флаг WRERR и при необходимости производить перезапись данных, данные и адрес которых сохраняются в регистрах EEDATA и ' EEADR. WRERR — флаг ошибки записи. WRERR = 1: флаг устанавливается, когда операция записи преждевременно прерывается сигналом сброса /MCLR (во время обычного режима или режима SLEEP) или сигналом сброса WDT во время обычного режима. Флаг EEIF устанавливается, когда встроенный автомат завершает запись в память данных. Он должен быть сброшен программно. EEIF — флаг завершения записи. EEIF = 1: флаг устанавливается, когда завершена запись. Соответствующий бит разрешения прерывания — EEIE в регистре INTCON. Регистр EECON2 не реализован физически и не допускает чтения. Возмож- на запись в регистр кодов 0х055/0х0АА для контроля правильности выполне- ния операции записи. Регистр используется только в обязательной последова- тельности при записи в память. Регистры EEADR и EEDATA необходимы для формирования и ввода адреса и данных в EEPROM. К ним применимы команды обычных регистров. Регистр конфигурации микроконтроллера Биты конфигурации располагаются в памяти ПЗУ по адресу 2007h. Этот адрес находится в особом пространстве памяти < доступном только во время программирования. Конфигурирование микроконтроллера выполняется на стадии написания программы введением в нее директивы_CONFIG (первые два символа — подчеркивание). Регистр конфигурации — это 14-разрядное слово, в котором содержатся общие параметры работы микроконтроллера. В каждом файле идентификаторов, которые Имеют расширениелпс в среде MPLAB, есть ряд параметров, позволяющих выбирать различные опции кон- фигурационного слова. Слово конфигурации 0 и 1 бит FOSCO и FOSC1 — определяют выбор типа генератора. 2 бит WDT — разрешает работу сторожевого таймера. 0 = WDT выключен 1 = WDT включен 3 бит PWRTE — включение PWRT 0 = PWRT выключен 1 = PWRT включен 4—13 биты СР — биты защиты содержимого Flash-ПЗУ данных 0 = защиту включена 1 = защита выключена. 319
Приложения WDT — сторожевой таймер, обнуляет микроконтроллер через 18 мс, если к нему не подключен предделитель. Позволяет выйти из зацикливания програм- мы в результате сбоя. PWRT — таймер задержки включения питания на 72 мс. Позволяет подня- ться напряжению питания от включения до приемлемого уровня. Медленное нарастание напряжения питания может стать причиной сбоя программы. Типы генераторов Кристаллы PIC16F84A-XT могут работать с четырьмя типами встроенных ге- нераторов. Пользователь может запрограммировать два конфигурационных бита (FOSC1 и FOSCO) для выбора одного из четырех режимов: RC, LP, XT, HS. Кристаллы PIC16... могут также тактироваться и от внешних источников. Генератор, построенный на кварцевых или керамических резонаторах, требует периода стабилизации после включения питания. Для этого встроенный тай- мер запуска генератора держит устройство в состоянии сброса примерно 18 мс после того, как сигнал на /MCLR-ножке кристалла достигнет уровня логиче- ской единицы. Таким образом, внешняя цепочка RC, связанная с ножкой /MCLR, во многих случаях не требуется. Встроенные генераторы работоспособны при определенных номиналах пи- тающего напряжения: Vdd OSC mode Max Freq | 2...3V RC . LP 2 MHz 200 kHz 3...6V RC, XT LP 4 MHz 200 kHz 4,5...5,5 HS 10 MHz ВНИМАНИЕ! При частотах ниже 500 кГц внутренний генератор может гене- рировать сбойный импульс на гармониках, когда переключается бит 0 порта А. Этого не происходит при использовании внешнего генератора или при встро- енном RC-генераторе. Генератор на кварцах PIC16F84A-XT, -HS или -LP требуют подключения кварцевого или кера- мического резонатора к выводам OSC1 и OSC2. Маркировка следующая: XT — стандартный кварцевый генератор, HS — высокочастотный кварцевый генератор, LP — низкочастотный генератор для экономичных приложений. Резистор Rs может потребоваться для генератора HS, особенно при частотах ниже 20 МГц для гашения гармоник. Он также мо- жет потребоваться в режиме XT с резонатором типа AT strip-cut. 320
2. Команды микроконтроллера Выбор конденсаторов для керамического резонатора Тип генератора Частота резонатора Конденсатор С1=С2 XT 455 кГц 2 МГц 4 МГц 150...330 пФ 20...330 пФ 20...330 пФ HS 10 МГц 20...200 пФ Выбор конденсатора для кварцевого генератора Тип генератора Частота Конденсатор С1 Конденсатор С2 32 кГц 30 пФ 30...50 пФ LP 100 кГц 15 пФ 15 пФ 200 кГц 0...15 пФ 0...15 пФ 100 кГц 15...30 пФ 200...300 пФ 200 кГц 15...30 пФ 100...200 пФ XT 455 кГц 15...30 пФ 15...100 пФ 1 МГц 15...3D пФ 15...30 пФ 2 МГц 15 пФ 15 пФ 4 МГц 15 пФ 15 пФ HS 4 МГц 15 пФ 15 пФ 10 МГц 15 пФ 15 пФ Более высокая емкость будет увеличивать стабильность генератора, но так- же будет увеличивать время запуска. Значения приведены для ориентировки. В режимах HS и XT, чтобы избежать гармоник, может потребоваться после- довательный резистор Rs. 2. Команды микроконтроллера Байт-ориентированные команды Мнемокод команды Название Изменяемые флаги ADDWF f,d Сложение W c f С, DC, Z ANDWF f,d Логическое И W и f Z CLRF f Сброс регистра f Z CLRW - Сброс регистра W Z COMF f,d Инверсия регистра f Z DECF f,d Декремент регистра f (-1) Z 11 Зак. 2418 321
Приложения Мнемокод команды Название Изменяемые флаги DECFSZ f,d Декремент f, пропустить команду, если 0 INCF f,d Инкремент регистра f (+1) Z INCFSZ f,d Инкремент f, пропустить команду, если 0 IORWF f,d Логическое ИЛИ W и f Z MOVF f,d Пересылка регистра f Z MOVWF f Пересылка W в f NOP - Холостая команда RLF f,d Сдвиг f влево через перенос с RRF f,d Сдвиг f вправо через перенос с SUBWF f,d Вычитание W из f С, DC, Z SWAPF f,d Обмен местами тетрад в f XORWF f,d Исключающее ИЛИ W и f Z Команды с константами ADDLW k Сложение константы c W С, DC, Z ANDLW k Логическое И константы и W Z IORLW k Логическое ИЛИ константы и W Z SUBLW k Вычитание W из константы MOVLW k Пересылка константы в W XORLW k Исключающее ИЛИ константы и W Бит-ориентированные команды BCF f,b Сброс бита в регистре f BSF f,b Установка бита в регистре f BTFSC f,b Пропустить команду, если бит равен нулю BTFSS f,b Пропустить команду, если бит равен единице Переходы CALL k Вызов подпрограммы CLRWDT Сброс Watchdog таймера 322
3. Макрокоманды ассемблера MPASM GOTO к Переход по адресу RETLW к Возврат из подпрограммы с загрузкой константы в W RETFIE Возврат из подпрограммы с разрешением прерываний RETURN Возврат из подпрограммы SLEEP Переход в режим SLEEP Каждая команда PIC16F84 — это 14-битовое слово, которое разделено по смыслу на следующие части: —1. код операции, —2. поле для одного и более операндов, которые могут участвовать или нет в этой команде. Система команд PIC16F84 включает в себя байт-ориентированные команды, бит-ориентирован- ные, операции с константами и команды передачи управления. Для байт-ориентированных команд Т обозначает собой регистр, с которым производится действие; "d" — бит определяет, куда положить результат. Если "d" = 0, то результат будет помещен в W-регистр, при "d" = 1 результат будет помещен в "Г, упомянутым в команде. Для бит-ориентированных команд "Ь" обозначает номер бита, участвующего в команде, а "Г — это регистр, в котором этот бит расположен. Для команд передачи управления и операций с константами, "к" обозначает восьми- или одиннадцатибитную константу. Все команды выполняются в течение одного командного цикла. В двух слу- чаях исполнение команды занимает два командных цикла: -1. — проверка условия и переход, -2. — изменение программного счетчика как результат вы- полнения команды. Один командный цикл состоит из четырех периодов гене- ратора. Таким образом, для генератора с частотой 4 МГц время исполнения командного цикла будет 1 мкс. 3. Макрокоманды ассемблера MPASM Фирмой Microchip разработаны специальные команды для ассемблера MPASM. Эти команды сокращают объем написанной программы и ускоряют процесс написания программ. Пользоваться макрокомандами необходимо осторожно, с учетом сказанного в рекомендациях данной книги. Мнемоника Действие ADDCF Прибавление переноса к содержимому регистра ADDDCF Прибавление десятичного переноса к содержимому регистра В Безусловный переход к адресу ВС Переход при переносе BDC П ереход при десятичном переносе BNC Переход лри отсутствии переноса 323
Приложения Мнемоника Действие BNDC Переход при десятичном переносе * BNZ Переход при отсутствии признака нуля (результат не нулевой) BZ Переход при наличии признака нуля CLRC Сброс флага переноса CLRDC Сброс флага десятичного переноса CLRZ Сброс флага равенства нулю LCALL Вызов подпрограммы за пределами из блока 256 команд LGOTO Переход за пределы блока из 256 команд MOVFW Загрузка содержимого регистра в рабочий регистр NEGF Изменение знака содержимого регистра SETC Установка флага переноса в 1 SETDC Установка флага десятичного переноса SETZ Установка признака нуля SKPC Пропустить следующую команду, если перенос SKPDC Пропустить следующую команду, если десятичный перенос SKPNC Пропустить следующую команду, если нет переноса SKPNDC Пропустить команду, если нет вспомогательного переноса SKPNZ Пропустить следующую команду, если нет нуля SKPZ Пропустить следующую команду, если ноль SUBCF Вычитание переноса из содержимого регистра SUBDCF Вычитание десятичного переноса из содержимого регистра TSTF Проверка (тестирование) регистра на равенство нулю 4. Коды прошивок микроконтроллеров Часы с тремя будильниками Файл chasu.hex. :00000001FF :020000040000FA :020000000528Dl :08000800DC298316043081009D :10001000A0308B00183085008030860083120613D4 : 100020008612AA018F0181018C018D018E01900140 : 1000300091019201930194019501A801A7019801F2 324
4. Коды прошивок микроконтроллеров 100040009901АЗО 196019В01 ADO 19С01АЕО19D01А7 10005000AF01B201B3010130A00097000F1E352897 10006000861B54288F183B28402832083302031976 1000700030280F163028990A1E30190203193D2224 10008000ЕА21851D4928A00A2008073C03195128А7 100090005Е29200882077Е287428602860286А2844 1000А0ОО6А287428А0015Е29ЕА210А309100980А82 1000В00018089000083С031D5E29980190015E29F4 1000C000180882078E28ED28F528FD280529D22852 1000DOOOCB283B291808820797281B2923292B297D 1000E0003329D228CB285029180882075E19A02955 1000F000AF29BE29D628D228CB284629180882073E 100100008828AA28B328BC28A028D228CB2846298A 10011000051E5E298C018D01C5205E29051E5E2904 100120000A30910018089000FD21C8205E29051EA4 100130005Е290А309100180890000F22C5205E2920 10014000051Е5Е290А309100180890003222С52051 10015000C8205E290A309100180890001B0803226D 100160002D0825225E290A309100180890001C08ED 1001700003222E0825225E290A30910018089000DB 100180001D0803222F0825225E290D0803220800DE 100190000Е0825220800170891000А309000С5209В 1001A0OOC8205E29F021C520C8205E290A309100B0 1001В0001808900032082522330803225Е29180807 1001С00090000А3091003008С53Е0319ЕВ28В00АВ0 1001D000300803220800BGO1Е828051Е5Е291В082С 1001EOOOBOOODF2030089BOOAA28Q51Е5Е291C08ED 1001F0OOB0O0DF2030089C00B328051Е5Е291D08D2 10020O0OB0OODF2O30089D00BC28051E5.E293308A1 10021000В1000D213108B300D628180890000А302В 1002200091003108Е93Е03191929В10А3108252244 100230000800В1011629051E5E292D08B1000D2107 100240003108AD00AA28051Е5Е292Е08В1000D2137 100250003108AE00B328051E5E292F08B1000D211C 100260003108AF00BC28051E5E293208B1000D21FF 100270003108B200D628051Е5Е29180890000А3001 100280009100A30A1D30230203195C29180890006D 100290000А30950091002А089400230803225Е2961 1002А000051Е5Е29180890000А3091002А185А2964 1002В0002А1446292А104629А30146290В19Е329А5 1002С0006Е291F3086008500051E6E298F1E6E293F 1002D0008B176129051E6E298F1A61299E01103026 1002E0009F0077299E0A06301Е0203196А29960А82 1002F00064301602031981291E082002031D8D296E 10030000872996010F1986290F1587290F110310С8 100310000F1903140T?188F29952903109529861694 100320000С1C9529861206148F291F088400000DC5 1003300086001E0885000F1806179F0A8B17722962 325
Приложения : 100340000A309100180890000F102D080E020319B2 : 10035000АА295Е291B080D020319CD295E290A303E " : 100360009100180890000F102E080E020319B929E9 :100370005E291C080D020319CD295E290A3091005F :10038000180890000F102F080E020319C8295E29C3 :100390001D080D020319CD295E29051E5E290F14C3 :1003A0005E290A300314A602031CD829A80AD22900 :1003B00026080A3EA7000800A4000308A5000408B8 :1003C000A90006142E280B11250883002908840093 '.1003D000240809000C08C53E0319FA298C0A0800F4 :1003E0000C08A600D1212708900028089100A80138 :1003F000A70108008C01900191010D08C53E031969 :100400000C2A8D0A0D08A600D12127089200280881 :100410009300A801A70108008D01920193010E0825 :10042000E93E03192E2A8E0A8FlAlB2A0E08320261 : 100430000319232A242A0E0833020319202A242A06 :100440008F120F12242A8F160E08A600D12127081A :10045000940028089500A801A70108008E019401C6 :1004600095018F14970A17089100083C0319392A3F :100470000800013097Q034225E292AlC482A2308EC :10048000AB00AB092B0A8C078F109901F0215E2974 :0A04900023088C07F0218F105E296D :02400E00F03F81 :00000001FF Часы с будильником - шахматные часы Файл shahmatu.hex. :020000040000FA :020000000528Dl :080008001A2A8316043081005E :10001000A0308B00003085008F3086008312B20143 :100020008101AB01AC01AD01AE01B001AF01B10185 :1000300090019101920193019801