Разработка многофункциональных астрономических часов

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

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид дипломная работа
Язык русский
Дата добавления 14.07.2010
Размер файла 6,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

- нижняя часть стола должна быть сконструирована так, чтобы программист мог удобно сидеть, не был вынужден поджимать ноги;

- поверхность стола должна обладать свойствами, исключающими появление бликов в поле зрения программиста;

- конструкция стола должна предусматривать наличие выдвижных ящиков (не менее 3 для хранения документации, листингов, канцелярских принадлежностей);

- высота рабочей поверхности рекомендуется в пределах 680-760мм;

- высота поверхности, на которую устанавливается клавиатура, должна быть около 650мм.

Большое значение придается характеристикам рабочего кресла. Так, рекомендуемая высота сиденья над уровнем пола находится в пределах 420-

550мм. Поверхность сиденья мягкая, передний край закругленный, а угол наклона спинки - регулируемый.

Рисунок 4.1- Размещения основных и периферийных составляющих ПК на рабочем столе программиста: 1 - сканер, 2 - монитор, 3 - принтер, 4 - поверхность рабочего стола, 5 - клавиатура, 6 - манипулятор типа «мышь».

Необходимо предусматривать при проектировании возможность различного размещения документов: сбоку от видеотерминала, между монитором и клавиатурой и т.п. Кроме того, в случаях, когда видеотерминал имеет низкое качество изображения, например заметны мелькания, расстояние от глаз до экрана делают больше (около 700мм), чем расстояние от глаза до документа (300-450мм). Вообще при высоком качестве изображения на видеотерминале расстояние от глаз пользователя до экрана, документа и клавиатуры может быть равным.

Положение экрана определяется:

- расстоянием считывания (0,6 - 0,7м);

- углом считывания, направлением взгляда на 20? ниже горизонтали к центру экрана, причем экран перпендикулярен этому направлению.

Должна также предусматриваться возможность регулирования экрана:

- по высоте +3 см;

- по наклону от -10? до +20? относительно вертикали;

- в левом и правом направлениях.

Большое значение также придается правильной рабочей позе пользователя.

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

- голова не должна быть наклонена более чем на 20?,

- плечи должны быть расслаблены,

- локти - под углом 80?-100?,

- предплечья и кисти рук - в горизонтальном положении.

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

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

Существенное значение для производительной и качественной работы на компьютере имеют размеры знаков, плотность их размещения, контраст и соотношение яркостей символов и фона экрана. Если расстояние от глаз оператора до экрана дисплея составляет 60-80 см, то высота знака должна быть не менее 3мм, оптимальное соотношение ширины и высоты знака составляет

3:4, а расстояние между знаками - 15-20% их высоты. Соотношение яркости фона экрана и символов - от 1:2 до 1:15.

Во время пользования компьютером медики советуют устанавливать монитор на расстоянии 50-60 см от глаз. Специалисты также считают, что верхняя часть видеодисплея должна быть на уровне глаз или чуть ниже. Когда человек смотрит прямо перед собой, его глаза открываются шире, чем когда он смотрит вниз. За счет этого площадь обзора значительно увеличивается, вызывая обезвоживание глаз. К тому же если экран установлен высоко, а глаза широко открыты, нарушается функция моргания. Это значит, что глаза не закрываются полностью, не омываются слезной жидкостью, не получают достаточного увлажнения, что приводит к их быстрой утомляемости.

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

4.3 Режим труда

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

В табл. 4.5 представлены сведения о регламентированных перерывах, которые необходимо делать при работе на компьютере, в зависимости от продолжительности рабочей смены, видов и категорий трудовой деятельности с ВДТ (видеодисплейный терминал) и ПЭВМ (в соответствии с САнНиП 2.2.2 542-96 «Гигиенические требования к видеодисплейным терминалам, персональным электронно-вычислительным машинам и организации работ»).

Таблица 4.5 - Время регламентированных перерывов при работе на компьютере

Категория работы с ВДТ или ПЭВМ

Уровень нагрузки за рабочую смену при видах работы с ВДТ, количество знаков

Суммарное время регламентированных перерывов, мин

При 8-часовой смене

При 12-часовой смене

Группа А

до 20000

30

70

Группа Б

до 40000

50

90

Группа В

до 60000

70

120

Примечание. Время перерывов дано при соблюдении указанных Санитарных правил и норм. При несоответствии фактических условий труда требованиям Санитарных правил и норм время регламентированных перерывов следует увеличить на 30%.

В соответствии со САнНиП 2.2.2 546-96 все виды трудовой деятельности, связанные с использованием компьютера, разделяются на три группы: группа А: работа по считыванию информации с экрана ВДТ или ПЭВМ с предварительным запросом; группа Б: работа по вводу информации; группа В: творческая работа в режиме диалога с ЭВМ.

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

4.4 Расчет освещенности

Расчет освещенности рабочего места сводится к выбору системы освещения, определению необходимого числа светильников, их типа и размещения. Исходя из этого, рассчитаем параметры искусственного освещения.

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

- по спектральному составу света они близки к дневному, естественному свету;

- обладают более высоким КПД (в 1,5-2 раза выше, чем КПД ламп накаливания);

- обладают повышенной светоотдачей (в 3-4 раза выше, чем у ламп накаливания);

- более длительный срок службы.

Расчет освещения производится для комнаты площадью 15м2 , ширина которой - 5м, высота - 3 м. Воспользуемся методом светового потока.

Для определения количества светильников определим световой поток, падающий на поверхность по формуле:

F = E•S•Z•К / n , (4.1)

Где F - рассчитываемый световой поток, Лм;

Е - нормированная минимальная освещенность, Лк (определяется по таблице). Работу программиста, в соответствии с этой таблицей, можно отнести к разряду точных работ, следовательно, минимальная освещенность будет Е = 300Лк;

S - площадь освещаемого помещения (в нашем случае S = 15м2);

Z - отношение средней освещенности к минимальной (обычно принимается равным 1,1-1,15 , пусть Z = 1,1);

К - коэффициент запаса, учитывающий уменьшение светового потока лампы в результате загрязнения светильников в процессе эксплуатации (его значение зависит от типа помещения и характера проводимых в нем работ и в нашем случае К = 1,5);

n - коэффициент использования, (выражается отношением светового потока, падающего на расчетную поверхность, к суммарному потоку всех ламп и исчисляется в долях единицы; зависит от характеристик светильника, размеров помещения, окраски стен и потолка, характеризуемых коэффициентами отражения от стен (РС) и потолка (РП)), значение коэффициентов РС и РП были указаны выше: РС=40%, РП=60%. Значение n определим по таблице коэффициентов использования различных светильников.

Для этого вычислим индекс помещения по формуле:

I = A•B / h (A+B), (4.2)

где h - расчетная высота подвеса, h = 2,92 м;

A - ширина помещения, А = 3 м;

В - длина помещения, В = 5 м.

Подставив значения получим:

I= 0,642.

Зная индекс помещения I, по таблице 7 [23] находим n = 0,22.

Подставим все значения в формулу (4.1) для определения светового потока F, получаем F = 33750 Лм.

Для освещения выбираем люминесцентные лампы типа ЛБ40-1, световой поток которых Fл = 4320 Лк.

Рассчитаем необходимое количество ламп по формуле:

N = F / Fл, (4.3)

где N - определяемое число ламп;

F - световой поток, F = 33750 Лм;

Fл- световой поток лампы, Fл = 4320 Лм.

N = 8 ламп.

При выборе осветительных приборов используем светильники типа ОД. Каждый светильник комплектуется двумя лампами.

Значит требуется для помещения площадью S = 15 м2 четыре светильника типа ОД.

Расчет естественного освещения помещений

Организация правильного освещения рабочих мест, зон обработки и производственных помещений имеет большое санитарно-гигиеническое значение, способствует повышению продуктивности работы, снижения травматизма, улучшения качества продукции. И наоборот, недостаточное освещение усложняет исполнения технологического процесса и может быть причиной несчастного случая и заболевания органов зрения.

Освещение должно удовлетворять такие основные требования:

- быть равномерным и довольно сильным;

- не создавать различных теней на местах работы, контрастов между освещенным рабочем местом и окружающей обстановкой;

- не создавать ненужной яркости и блеска в поле взора работников;

- давать правильное направление светового потока;

Все производственные помещения необходимо иметь светлопрорезы, которые дают достаточное природное освещение. Без природного освещения могут быть конференц-залы заседаний, выставочные залы, раздевалки, санитарно-бытовые помещения, помещения ожидания медицинских учреждений, помещений личной гигиены, коридоры и проходы.

Коэфициент естественного освещения в соответствии с ДНБ В 25.28.2006, для нашого III пояса светового климата составляет 1,5.

Исходя из этого произведем расчет необходимой площади оконных проемов.

Расчет площади окон при боковом освещении определяется, по формуле:

Sо = (Lnз.*N0*Snзд.)/(100 *T0*r1) (4.4)

где:Ln - нормированное значение КЕО

Кз - коэффициент запаса (равен 1,2)

N0 - световая характеристика окон

Sn - площадь достаточного естественного освещения

Кзд. - коэффициент, учитывающий затенение окон противостоящими зданиями

r1 - коэффициент, учитывающий повышение КЕО при боковом освещении

T0 - общий коэффициент светопропускания, который рассчитывается по формуле:

T0 = T1 * T2 * T3 * T4 * T5, (4.5)

где T1 - коэффициент светопропускания материала;

T2 - коэффициент, учитывающий потери света в переплетах светопроема;

T3 - коэффициент, учитывающий потери света в несущих конструкциях;

T4 - коэффициент, учитывающий потери света в солнцезащитный устройствах;

T5 - коэффициент, учитывающий потери света в защитной сетке, устанавливаемой под фонарями, принимается равным 1;

Теперь следует рассчитать боковое освещение для зоны, примыкающей к наружной стене. По разряду зрительной работы нужно определить значение КЕО. КЕО = 1,5 нормированное значение КЕО с учетом светового климата необходимо вычислить по формуле:

Ln=l*m*c, (4.6)

где l - значение КЕО (l=1.5);

m - коэффициент светового климата (m=1);

c - коэффициент солнечности климата (c=1)

Ln=1,5

Теперь следует определить отношение длины помещения Ln к глубине помещения B:

Ln/B=3/5 =0,6;

Отношение глубины помещения В к высоте от уровня условной рабочей поверхности до верха окна h1 (в данном случае h1=1,8) :

B/h1=5/1,8 = 2,77.

Световая характеристика световых проемов N0=9.

Кзд=1

Значение T0=0,8*0,7*1*1*1=0,56.

Ln для 4 разряда зрительных работ равен 1,5 при мытье окон два раза в год.

Определяем r1, r1=1,5.

Кз.=1,2.

Теперь следует определить значение Sп:

Sп=Ln*В=3*10=30 м2.

Кзд.=1.

На данном этапе следует рассчитать необходимую площадь оконных проемов:

(Ln* Кз.*N0*Snзд.) / (100*T0*r1)

Sо = (1,5*1,2*9*30*1)/(100*0,56*1,5)=486/84= 5,78 м2;

Принимаем количество окон 1 штука:

S1=5,78 м2 площадь одного окна

Высота одного окна составляет - 2,5 м, ширина 2,3 м.

4.5 Расчет вентиляции

В зависимости от способа перемещения воздуха вентиляция бывает естественная и принудительная.

Параметры воздуха, поступающего в приемные отверстия и проемы местных отсосов технологических и других устройств, которые расположены в рабочей зоне, следует принимать в соответствии с ГОСТ 12.1.005-76. При размерах помещения 3 на 5 метров и высоте 3 метра, его объем 45 куб.м. Следовательно, вентиляция должна обеспечивать расход воздуха в 90 куб.м/час. В летнее время следует предусмотреть установку кондиционера с целью избежания превышения температуры в помещении для устойчивой работы оборудования. Необходимо уделить должное внимание количеству пыли в воздухе, так как это непосредственно влияет на надежность и ресурс эксплуатации ЭВМ.

Мощность (точнее мощность охлаждения) кондиционера является главной его характеристикой, от неё зависит на какой объем помещения он рассчитан. Для ориентировочных расчетов берется 1 кВт на 10 м2 при высоте потолков 2,8 - 3 м (в соответствии со СНиП 2.04.05-86 "Отопление, вентиляция и кондиционирование").

Для расчета теплопритоков данного помещения использована упрощенная методика:

Q=S·h·q (4.8)

где:Q - Теплопритоки

S - Площадь помещения

h - Высота помещения

q - Коэффициент равный 30-40 вт/м3 (в данном случае 35 вт/м3)

Для помещения 15 м2 и высотой 3 м теплопритоки будут составлять:

Q=15·3·35=1575 вт

Кроме этого следует учитывать тепловыделение от оргтехники и людей, считается (в соответствии со СНиП 2.04.05-86 "Отопление, вентиляция и кондиционирование") что в спокойном состоянии человек выделяет 0,1 кВт тепла, компьютер или копировальный аппарат 0,3 кВт, прибавив эти значения к общим теплопритокам можно получить необходимую мощность охлаждения.

Qдоп=(H·Sопер)+(С·Sкомп)+(P·Sпринт) (4.9)

где:Qдоп - Сумма дополнительных теплопритоков

C - Тепловыделение компьютера

H - Тепловыделение оператора

D - Тепловыделение принтера

Sкомп - Количество рабочих станций

Sпринт - Количество принтеров

Sопер - Количество операторов

Дополнительные теплопритоки помещения составят:

Qдоп1=(0,1·2)+(0,3·2)+(0,3·1)=1,1(кВт)

Итого сумма теплопритоков равна:

Qобщ1=1575+1100=2675 (Вт)

В соответствии с данными расчетами необходимо выбрать целесообразную мощность и количество кондиционеров.

Для помещения, для которого ведется расчет, следует использовать кондиционеры с номинальной мощностью 3,0 кВт.

4.6 Расчет уровня шума

Одним из неблагоприятных факторов производственной среды в ИВЦ является высокий уровень шума, создаваемый печатными устройствами, оборудованием для кондиционирования воздуха, вентиляторами систем охлаждения в самих ЭВМ.

Для решения вопросов о необходимости и целесообразности снижения шума необходимо знать уровни шума на рабочем месте оператора.

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

?L = 10·lg (Li•n), (4.10)

где Li - уровень звукового давления i-го источника шума;

n - количество источников шума.

Полученные результаты расчета сравнивается с допустимым значением уровня шума для данного рабочего места. Если результаты расчета выше допустимого значения уровня шума, то необходимы специальные меры по снижению шума. К ним относятся: облицовка стен и потолка зала звукопоглощающими материалами, снижение шума в источнике, правильная планировка оборудования и рациональная организация рабочего места оператора.

Уровни звукового давления источников шума, действующих на оператора на его рабочем месте представлены в табл. 4.6.

Таблица 4.6 - Уровни звукового давления различных источников

Источник шума

Уровень шума, дБ

Жесткий диск

40

Вентилятор

45

Монитор

17

Клавиатура

10

Принтер

45

Сканер

42

Обычно рабочее место оператора оснащено следующим оборудованием: винчестер в системном блоке, вентилятор(ы) систем охлаждения ПК, монитор, клавиатура, принтер и сканер.

Подставив значения уровня звукового давления для каждого вида оборудования в формулу (4.4) , получим:

?L=10·lg(104+104,5+101,7+101+104,5+104,2)=49,5 дБ

Полученное значение не превышает допустимый уровень шума для рабочего места оператора, равный 65 дБ (ГОСТ 12.1.003-83). И если учесть, что вряд ли такие периферийные устройства как сканер и принтер будут использоваться одновременно, то эта цифра будет еще ниже. Кроме того при работе принтера непосредственное присутствие оператора необязательно, т.к. принтер снабжен механизмом автоподачи листов.

ВЫВОДЫ

В данном дипломном проекте рассмотрены вопросы проектирования многофункциональных астрономических часов, которые еще не выпускаются промышленностью.

В проекте рассмотрены теоретические вопросы создания устройств на микроконтроллера: этапы выполнения работ, разработка программного обеспечения, внедрения в производство.

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

В экономической части проекта произведен расчет себестоимости многофункциональных астрономических часов. Часы широкого применения не найдут, но могут будут использованы, как сувенирные часы. Правда в этих часах можно использовать функцию «Земные часы», использовать функции «Таймер», который выполняет и обратный отсчет времени. Стоимость часов при массовом производстве уменьшиться, т.к. стоимость на разработку устройства и программного обеспечения распределится на количество изготовленных устройств.

В разделе охрана труда мы произвели расчет естественного и искусственного освещения, системы кондиционирования, уровня шума на рабочем месте инженера-программиста и сопоставили с нормативными значениями. В процессе разработки устройства были рассмотрены и изучены множество источников информации, информация сети Интернет, осуществлен поиск устройств-аналогов, использованы цены на комплектующие Интернет-магазинов.

ПЕРЕЧЕНЬ ССЫЛОК

1. "Dimmable Fluorescent Ballast" - User Guide, 10/07, Atmel Corporation, http://www.atmel.com/dyn/resources/prod_documents/doc7597.pdf

2. ГОСТ13109-97. Нормы качества электрической энергии в системах электроснабжения общего назначения.

3. G. Howell "Five questions about resistors" // EDN, 9/28/2006, http://www.edn.com/contents/images/6372835.pdf

4. П. Хоровиц, У. Хилл "Искусство схемотехники" - Изд. 6-е, М.: Мир, 2003.

5. C. Hillman "Common mistakes in electronic design" // EDN, 12/14/2007 http://www.edn.com/contents/images/6512156.pdf

6."Frequently asked questions about dimmers" // http://www .lutron.com/product_technical/faq.asp

7. Л. Н. Кечиев, Е. Д. Пожидаев "Защита электронных средств от воздействия статического электричества" - М.: ИД "Технологии", 2005.

8. Жидецкий В.Ц., Джигирей В.С., Мельников А.В. Основы охраны труда: Учебник - Львов, Афиша, 2008 - 351с.

9. Денисенко Г.Ф. Охрана труда: Учебн.пособие - М., Высшая школа, 1989 - 319с.

10. Самгин Э.Б. Освещение рабочих мест. - М.: МИРЭА, 1989. - 186с.

11. Справочная книга для проектирования электрического освещения. / Под ред. Г.Б. Кнорринга. - Л.: Энергия, 1976.

12. Борьба с шумом на производстве: Справочник / Е.Я. Юдин, Л.А. Борисов;

Под общ. ред. Е.Я. Юдина - М.: Машиностроение, 1985. - 400с., ил.

13. Зинченко В.П. Основы эргономики. - М.: МГУ, 1979. - 179с.

14.Методичні вказівки до виконання дипломної роботи для учнів спеціальності «Оператор комп'ютерного набору; оператор комп'ютерної верстки»/ Упоряд.: Д.О. Дяченко, К.О. Ізмалкова, О.Г. Меркулова. - Сєверодонецьк: СВПУ, 2007. - 40 с.

15. Н. Заец. Многофункциональные часы. -- Схемотехника, 2006, № 2,с. 41,42.

16. Н. Заец. Термометр - часы с датчиками фирмы Dallas Semiconductor. -- Схемотехника, 2005, № 5, с. 52 - 55.

17. Н. Заец. Радиолюбительские конструкции на Р1С-микроконтроллерах. Книга 3. -- М.: СОЛОН-Пресс, 2005, с. 248.

18. Н. Заец. Отечественные жидкокристаллические индикаторы TIC9162 с драйверами по технологии COG. - Схемотехника, 2005, №9, с. 9-11.

19. Н. Заец. Таймеры десятичного счета. -- Электрик, 2006, № 7-8, с. 36 -39.

20. Мощные полевые переключательные транзисторы фирмы International Rectifier. -- Радио, 2001, № 5, с. 45.

21. А. Долгий. Разработка и отладка устройств на микроконтроллерах. -- Радио, 2001 ,№ 5-12, 2002, № 1.

22. А. Долгий. Программаторы и программирование микроконтроллеров. -- Радио, 2004, № 1-12.

23. Н. Заец. Универсальный таймер. -- Схемотехника, 2003, № 1, с. 53.

24. Н. Заец. Электронные самоделки для быта, отдыха и здоровья.-- М.: СОЛОН-Пресс, 2009, 423 с.

ПРИЛОЖЕНИЯ

Приложение А

Таблица А.1 - Основные параметры микроконтроллера PIC16F877A

Основные параметры

Ядро PIC16

F,МГц

от 0 до 20

Память: Flash,кБ

8

Память: RAM,кБ

0.365

Память: EEPROM,кБ

0.25

I/O (макс.),шт.

33

Таймеры: 8-бит,шт

2

Таймеры: 16-бит,шт

1

Таймеры: Каналов ШИМ,шт

2

Таймеры: RTC

Нет

Интерфейсы: UART,шт

1

Интерфейсы: SPI,шт

1

Интерфейсы: I2C,шт

1

Аналоговые входы: Разрядов АЦП,бит

10

Аналоговые входы: Каналов АЦП,шт

8

Аналоговые входы: Аналоговый компаратор,шт

2

VCC,В

от 2 до 5.5

ICC,мА

25

TA,°C

от -40 до 125

Корпус

PLCC-44 DIP-40 QFN-44 TQFP-44

Приложение Б

Программа для микроконтроллера многофункциональных астрономических часов

; ВЕРСИЯ 1.3

; V.1.1

; - Исправил сигнальную проблему установки

; V.1.2

; - Исправленный дефект с смятением иногда снова установка или остановка неправильного таймера

; - Приспособление за 1/4 второго утратят, когда таймер был reset смятением

; V.1.3

; - Некоторые таймеры блокировали, когда установка смятения были скорректированы

#include <p16F877A.inc>

__config _HS_OSC & _WDT_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON ;& _CP_OFF

#include "LCD.h"

#include "KBD.h"

; Определения байта состояния

#define TMR_ON 7 ; 0 = от, 1 = на

#define TMR_DIR 6 ; 0 = inc, 1 = dec

#define TMR_ON_ALARM_RESET 4 ; 1 = на смятении, снова установленном таймере

#define TMR_ON_ALARM_STOP 3 ; 1 = на смятении, таймере остановки

; куски 0-1: сигнальный звук

; Корректировки Нормы

#define TMR_STD_LO 0xC5

#define TMR_STD_HI 0x66

#define TMR_XTR_LO 0x18

#define TMR_XTR_HI 0x80

#define PULSES_PER_TICK 0x20

#define F_TICK 0 ; флаг тикания

#define F_BTNDOWN 1 ; 1, если кнопка была вниз от предыдущей петли, 0 иначе

#define F_TMR_LABEL_DIRTY 2 ; набор, если этикетке таймера придется обновляться на показе

#define F_VAL_DISPLAY_DIRTY 3 ; набор, если этикетке значения придется обновляться на показе

#define F_CLOCK_STOPPED 4 ; набор, если главный отмечает время остановлен

#define F_CURSOR_DIRTY 5 ; набор, если местоположению курсора нужно обновляться или reset

#define F_VALUE_ENTERED 6 ; набор, если новое значение только введено

#define MSG_ID_Clear 0xFF

ТОЧНОСТЬ #define 7

#define KBD_SCAN_DELAY 3

#define D_SEL_TIMER 0x01 ; Место назначения - отобранный таймер

#define D_SEL_TIMER_LENGTH 0x02 ; Место назначения - отобранная длина таймера

#define D_SEL_TIMER_ALARM 0x03 ; Место назначения - отобранное сигнальное время таймера

#define D_SEL_TIMER_COPY 0x04 ; Место назначения - отобранный таймер; потребительная стоимость как таймер ID к значению таймера lookup

#define B_LED 0 ; RA0

#define B_SPK 1 ; RA1

#define SND_SILENT 0x00 ; не нет звука

#define SND_PIP 0x01 ; звук: "косточка"

#define SND_PEEP 0x02 ; звук: "чирикание"

#define SND_WHIP 0x03 ; звук: "кнут"

; макрокоманда math

Макрокоманда M_StorStatus, ГДЕ

movf STATUS,w

movwf , ГДЕ

endm

Макрокоманда M_RetrStatus, ГДЕ

movf WHERE,w

СТАТУС movwf

endm

; макрокоманда государственного аппарата

Макрокоманда IfJump BTN,ADDR

movlw BTN

subwf BTN_ID,w

btfsc STATUS,Z

goto ADDR

ENDM

; макрокоманда государственного аппарата

Макрокоманда AnyBtnJump ADDR

btfss BTN_ID,7

goto ADDR

ENDM

Макрокоманда IfState BTN,STATE

movlw BTN

subwf BTN_ID,w

btfss STATUS,Z

goto $+5

высокий ШТАТ movlw

movwf STATE_HI

низкий ШТАТ movlw

movwf STATE_LO

ENDM ; goto здесь

ШТАТ макрокоманды AnyBtnState

btfsc BTN_ID,7

goto $+5

высокий ШТАТ movlw

movwf STATE_HI

низкий ШТАТ movlw

movwf STATE_LO

ENDM ; goto здесь

ШТАТ макрокоманды GoToState

высокий ШТАТ movlw

movwf STATE_HI

низкий ШТАТ movlw

movwf STATE_LO

ENDM

Макрокоманда SetMsg NEW_MSG_ID

movlw NEW_MSG_ID

movwf MSG_ID

ENDM

cblock 0x20

; главные записи таймеров

LOOP_TIMER

ФЛАГИ

EE_ADDR

EE_DATA

CTR1

CTR2

TMP

TMP1

TMP2

TMP3

РЕДЖ

; отобранный таймер

SEL_TMR

SEL_TMR_SETTINGS

SEL_TMR_LEN:4

; сигнальные переменные

СМЯТЕНИЕ; 0, если смятение есть, сигнальный ID иначе

ALARM_TIMER; пересчитывает untill тиканий сигнальные переключатели от

; данные кнопочного пресса

BTN_ID

BTN_DOWN

; записи государственного аппарата

STATE_LO

STATE_HI

; записи показа

LCD_CURSOR_POSITION ; местоположение (куски 0-6) курсора и статус (кусок 7: 1=on; 0=off)

DISP:6

MSGL

MSGH

MSGDAT

MSG_ID; ID сообщения, которое должно показываться на втором ряду

MSG_ID_CURRENT; ID сообщения, в настоящий момент показанного на втором ряду

; записи math

REG_X:PRECISION

REG_Y:PRECISION

REG_Z:PRECISION

REG_COUNTER

REG_STATUS

REG_T1

REG_T2

REG_ROT_COUNTER

; записи ввода значения

VAL_STAT; статус - место назначения значения, которое введено (позже может использоваться, чтобы запомнить также формат в верхнем откусывании)

VAL_IND; индекс - индекс в настоящий момент введенного существования цифры

VAL_DIGIT; место, чтобы запомнить единую цифру, пока другие действия выполняются

VAL:6; значение непосредственно (может находиться в десятичном представлении или непосредственно в шестнадцатиричном)

endc

; прерывание отмечается в разделенном пространстве

cblock 0x78

INT_W

INT_STATUS

INT_PCLATH

INT_FSR

INT_PULSECTR

INT_TIMER

endc

cblock 0xA0

ТИМ:16*4

endc

cblock 0x120

LEN:16*4

endc

cblock 0x1A0

ALM:16*4

endc

cblock 0x1E0

TMR_SETTINGS:16*1

endc

org 0x00

Запуск goto

org 0x04

nop ; код прерывания следует - избегать потенциальных страниц проблем нумерации

Прерывание

movwf INT_W

swapf STATUS,W

СТАТУС clrf

movwf INT_STATUS

movf PCLATH,w

movwf INT_PCLATH

clrf PCLATH

movf FSR,w

movwf INT_FSR

;banksel T1CON; таймер остановки

bcf T1CON,TMR1ON

banksel TMR1H ; установленный TMR1 counter

decf INT_PULSECTR,f

btfss STATUS,Z

goto Interrupt_std_len

movlw TMR_XTR_LO

movwf TMR1L

movlw TMR_XTR_H

movwf TMR1H

movlw PULSES_PER_TICK

movwf INT_PULSECTR

incf INT_TIMER,f

goto Interrupt_continue

Interrupt_std_len

movlw TMR_STD_LO

movwf TMR1L

movlw TMR_STD_HI

movwf TMR1H

Interrupt_continue

banksel PIR1 ; очистите кусок избытка TMR1

bcf PIR1,TMR1IF

banksel PIE1 ; разрешите прерывание TMR1

bsf PIE1,TMR1IE

banksel T1CON ; стартовый таймер

bsf T1CON,TMR1ON

banksel PORTC

;movf INT_FSR,w

movwf FSR

movf INT_PCLATH,w

movwf PCLATH

swapf INT_STATUS,w

СТАТУС movwf

swapf INT_W,F

swapf INT_W,W

retfie

TMR_Init

banksel INTCON

bsf INTCON,PEIE

bsf INTCON,GIE

banksel T1CON

movlw b'00000000'

banksel PORTC

movlw PULSES_PER_TICK

movwf INT_PULSECTR

banksel PIR1 ; очистите кусок избытка TMR1

bcf PIR1,TMR1IF

banksel PIE1 ; разрешите прерывание TMR1

bsf PIE1,TMR1IE

banksel T1CON ; стартовый таймер

bsf T1CON,TMR1ON

banksel PORTC

возврат

SM_Init

movlw низкий S00_TimerSelectLoop

movwf STATE_LO

movlw высокий S00_TimerSelectLoop

movwf STATE_HI

возврат

Запуск

ФЛАГИ clrf

clrf INT_TIMER

clrf LOOP_TIMER

clrf LCD_CURSOR_POSITION

вызовите EEPROM_CheckInit

вызовите PORTS_Init

вызовите LCD_Init

вызовите SM_Init

вызовите ReadTimerDataFromEEPROM

clrf SEL_TMR

вызовите LCD_UpdateTimerLabel

вызовите TMR_Init

вызовите SPK_Whip

MainLoop

вызовите IfPlaySound

btfsc FLAGS,F_VALUE_ENTERED

вызовите ProcessEnteredValue

btfsc FLAGS,F_TMR_LABEL_DIRTY

вызовите LCD_UpdateTimerLabel

movf MSG_ID,w

subwf MSG_ID_CURRENT,w

btfss STATUS,Z

вызовите LCD_UpdateSecondRowMessage

btfsc FLAGS,F_VAL_DISPLAY_DIRTY

вызовите LCD_UpdateValDisplay

вызовите IfTick

вызовите KBD_Scan

movf STATE_HI,w

movwf PCLATH

movf STATE_LO,w

movwf PCL; идите к государственному аппарату

SM_Rtn; возвратная точка государственного аппарата

movlw высокий SM_Rtn

movwf PCLATH

movlw 0xFF

movwf BTN_ID

btfsc FLAGS,F_CURSOR_DIRTY

вызовите LCD_UpdateCursor

btfsc FLAGS,F_TICK

goto MainLoop_Tick

clrf TMP

MainLoop_Delay ; клавиатура debounce

decf TMP,f

nop

nop

btfss STATUS,Z

goto MainLoop_Delay

goto MainLoop

MainLoop_Tick

movf SEL_TMR,w

movwf CTR1

вызовите LoadSelTmrSettingsAndLen

вызовите MC_Normalize

вызовите MC_NormalizedTo86400

вызовите MC_86400toHMS

вызовите LCD_UpdateTimer

movf MSG_ID,w

sublw MSG_ID_Clear

btfss STATUS,Z

goto MainLoop

movf SEL_TMR,w

movwf CTR1

вызовите LoadSelTmrSettingsAndLen

вызовите MC_Normalize

вызовите MC_NormalizedToJulianNormalized

вызовите MC_NormalizedToDecimal

вызовите LCD_UpdateTimerDecimalPt

bcf FLAGS,F_TICK

goto MainLoop

ProcessEnteredValue

bcf FLAGS,F_VALUE_ENTERED

movf VAL_STAT,w

sublw D_SEL_TIMER_LENGTH

btfsc STATUS,Z

goto ProcessEnteredValue_STLEN

movf VAL_STAT,w

sublw D_SEL_TIMER

btfsc STATUS,Z

goto ProcessEnteredValue_ST

movf VAL_STAT,w

sublw D_SEL_TIMER_ALARM

btfsc STATUS,Z

goto ProcessEnteredValue_STALM

sublw D_SEL_TIMER_COPY

btfsc STATUS,Z

goto ProcessEnteredValue_COPY

возврат

ProcessEnteredValue_STALM

bsf STATUS,IRP; копируйте VAL в смятение

ProcessEnteredValue_ST

movf REG,w; копируйте VAL в таймер (или смятение, если STATUS,IRP является набором)

movwf FSR

movf VAL,w

movwf INDF

incf FSR,f

movf VAL+1,w

movwf INDF

incf FSR,f

movf VAL+2,w

movwf INDF

incf FSR,f

movf VAL+3,w

movwf INDF

bcf STATUS,IRP

возврат

ProcessEnteredValue_COPY

; НЕ ВЫПОЛНЯЮТ В ЭТОЙ ВЕРСИИ

; - получить таймер ID от данных часа

; - значение таймера груза

; - нормализировать значение

; - de-нормализировать отобранный ряд таймера значения

; - значение таймера копии к отобранному таймеру

возврат

ProcessEnteredValue_STLEN ; копируйте VAL в отобранную длину таймера

movf SEL_TMR,w

movwf CTR1

вызовите CalculateEEPROMAddressFromCTR1

incf EE_ADDR,f

вызовите CalculateFileAddressFromCTR1

clrf TMP

ProcessEnteredValue_STLEN_1

movf TMP,w

addlw VAL

movwf FSR

movf INDF,w

movwf VAL_DIGIT

bsf STATUS,IRP

movf REG,w

andlw 0x7F

addwf TMP,w

movwf FSR

movf VAL_DIGIT,w

movwf INDF

bcf STATUS,IRP

movwf EE_DATA

вызовите EEPROM_Write

incf EE_ADDR,f

incf TMP,f

movf TMP,w

sublw 0x04

btfss STATUS,Z

goto ProcessEnteredValue_STLEN_1

вызовите LoadSelTmrSettingsAndLen

возврат

PORTS_Init

banksel PORTA

clrf PORTA

clrf PORTB

clrf PORTC

clrf PORTD

clrf PORTE

banksel TRISA

movlw b'00000110'

movwf ADCON1

movlw b'11111100' ; RA0=LED, RA1=SPK

movwf TRISA

movlw b'11110000' ; KBD

movwf TRISB

bcf OPTION_REG,7; ; разрешите слабые натяжения PORTB

clrf TRISC ; LCD: DB0-DB7

movlw 0xFF

movwf TRISD ; не используют - все входы

movlw b'0000000' ; LCD: RE0=RS, RE1=R/W; RE2=E

movwf TRISE

movlw b'11000000' ; разрешите прерывания

movwf INTCON

banksel PORTA

возврат

CalculateEEPROMAddressFromCTR1

; Высчитайте адрес данных таймера в EEPROM

movf CTR1,w

movwf EE_ADDR

bcf STATUS,C

rlf EE_ADDR,f

rlf EE_ADDR,f

rlf EE_ADDR,f

addwf EE_ADDR,f

возврат

CalculateFileAddressFromCTR1

; Адрес offsett таймера в РЕДЖЕ

movf CTR1,w

РЕДЖ movwf

bcf STATUS,C

rlf REG,f

rlf REG,f

ТИМ movlw

addwf REG,f

возврат

ReadTimerDataFromEEPROM

clrf CTR1

ReadTimerDataFromEEPROM_loop

вызовите CalculateEEPROMAddressFromCTR1

вызовите CalculateFileAddressFromCTR1

; Установки таймера груза

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

вызовите EEPROM_Read

movwf INDF

; Длины груза

incf EE_ADDR,f

movf REG,w

andlw 0x7F

movwf FSR

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

bcf STATUS,IRP

; Offsetts груза (начальные значения)

incf EE_ADDR,f

movf REG,w

movwf FSR

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf EE_ADDR,f

incf FSR,f

вызовите EEPROM_Read

movwf INDF

incf CTR1,f

movf CTR1,w

sublw 0x10

btfss STATUS,Z

goto ReadTimerDataFromEEPROM_loop

возврат

EEPROM_CheckInit

movlw 0xFE

movwf EE_ADDR

вызовите EEPROM_Read

movlw 0xA5

subwf EE_DATA,w

btfss STATUS,Z

goto InitEEPROM

incf EE_ADDR,f

вызовите EEPROM_Read

movlw 0x5A

subwf EE_DATA,w

btfsc STATUS,Z

возврат

InitEEPROM

clrf EE_ADDR

clrf CTR1

clrf CTR2

InitEEPROM_loop

movf CTR2,w

lcall LOOKUP_StdTmr

movwf EE_DATA

movlw высокий InitEEPROM_loop

movwf PCLATH

вызовите EEPROM_Write

incf EE_ADDR,f

incf CTR2,f

movf CTR2,w

sublw 0x09

btfss STATUS,Z

goto InitEEPROM_loop

clrf CTR2

incf CTR1,f

movf CTR1,w

sublw 0x10

btfss STATUS,Z

goto InitEEPROM_loop

movlw 0xFE

movwf EE_ADDR

movlw 0xA5

movwf EE_DATA

вызовите EEPROM_Write

incf EE_ADDR,f

movlw 0x5A

movwf EE_DATA

вызовите EEPROM_Write

возврат

EEPROM_Read

banksel EE_ADDR

movf EE_ADDR,w

banksel EEADR

movwf EEADR

banksel EECON1

bcf EECON1, EEPGD

bsf EECON1, RD

banksel EEDATA

movf EEDATA,w

banksel EE_DATA

movwf EE_DATA

возврат EEPROM_Write

banksel EE_ADDR

movf EE_ADDR,w

banksel EEADR

movwf EEADR

banksel EE_DATA

movf EE_DATA,w

banksel EEDATA

movwf EEDATA

banksel EECON1

bcf EECON1, EEPGD

bsf EECON1, WREN

bcf INTCON, GIE

movlw 0x55

movwf EECON2

movlw 0xAA

movwf EECON2

bsf EECON1, WR

bsf INTCON, GIE

EEPROM_Write_WaitForConfirmation

btfsc EECON1, WR

goto EEPROM_Write_WaitForConfirmation

bcf EECON1, WREN

banksel EE_ADDR

возврат

IfTick

movf INT_TIMER,w

btfss FLAGS,F_CLOCK_STOPPED

goto IfTick_Continue

movwf LOOP_TIMER

возврат

IfTick_Continue

subwf LOOP_TIMER,w

btfsc STATUS,Z

возврат

Тикание; вызванные 4 раза за вторые

incf LOOP_TIMER,f

movlw 0x01

xorwf PORTA,f

clrf CTR1

Tick_next_ctr

вызовите LoadSelTmrSettingsAndLen

btfss SEL_TMR_SETTINGS,TMR_ON

goto Tick_continue

btfss SEL_TMR_SETTINGS,TMR_DIR

goto Tick_increase

; Tick_decrease

вызовите DecTimer

goto Tick_checkAlarm

Tick_increase

вызовите IncTimer

Tick_checkAlarm

вызовите CheckTimerAlarm

Tick_continue

incf CTR1,f

movlw 0x10

subwf CTR1,w

btfss STATUS,Z

goto Tick_next_ctr

bsf FLAGS,F_TICK

возврат LoadSelTmrSettingsAndLen ; грузы выбрали установки таймера и длину к SEL_TMR_SETTINGS и SEL_TMR_LEN

; установки груза

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movf INDF,w

movwf SEL_TMR_SETTINGS

; длина груза

вызовите CalculateFileAddressFromCTR1

movf REG,w

andlw 0x7F

movwf FSR

movf INDF,w

movwf SEL_TMR_LEN

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+1

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+2

incf FSR,f

movf INDF,w

movwf SEL_TMR_LEN+3

bcf STATUS,IRP

возврат

IncTimer; приращение таймер; убедитесь, что LoadSelTmrLen вызван перед movf REG,w

movwf FSR

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

btfss STATUS,Z

goto IncTimer_check

incf FSR,f

incf INDF,f

IncTimer_check

movf REG,w

movwf FSR

movf INDF,w

subwf SEL_TMR_LEN,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+1,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+2,w

btfss STATUS,Z

возврат

incf FSR,f

movf INDF,w

subwf SEL_TMR_LEN+3,w

btfss STATUS,Z

возврат

clrf INDF

decf FSR,f

clrf INDF

decf FSR,f

clrf INDF

decf FSR,f

clrf INDF

возврат

DecTimer ; уменьшение таймер; убедитесь, что LoadSelTmrLen вызван перед

movf REG,w

movwf FSR

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

incf FSR,f

movf INDF,f

btfss STATUS,Z

goto DecTimer_continue

movf SEL_TMR_LEN+3,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN+2,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN+1,w

movwf INDF

decf FSR,f

movf SEL_TMR_LEN,w

movwf INDF

DecTimer_continue

movf REG,w

movwf FSR

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

movlw 0xFF

subwf INDF,w

btfss STATUS,Z

возврат

incf FSR,f

decf INDF,f

возврат

CheckTimerAlarm

movlw 0x04

movwf TMP

movf REG,w

movwf FSR

CheckTimerAlarm_0

bsf STATUS,IRP

movf INDF,w

bcf STATUS,IRP

subwf INDF,w

btfss STATUS,Z

возврат ; не нет смятения

incf FSR,f

decf TMP,f

btfss STATUS,Z

goto CheckTimerAlarm_0

movf SEL_TMR_SETTINGS,w

andlw 0x03

СМЯТЕНИЕ movwf

clrf ALARM_TIMER

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_STOP

goto CheckTimerAlarm_1

; Таймер остановки на смятении

;movlw 0x01<<TMR_ON

;lcall ToggleTimerSettings

movf CTR1,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movlw 0x01<<TMR_ON

xorwf INDF,f

bcf STATUS,IRP

CheckTimerAlarm_1

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_RESET

возврат

; Снова установленный таймер на смятении

;movf SEL_TMR,w

;movwf CTR1

вызовите CalculateFileAddressFromCTR1

movf REG,w

movwf FSR

movlw 0x01

movwf INDF

incf FSR,f

clrf INDF

incf FSR,f

clrf INDF

incf FSR,f

clrf INDF

возврат

IfPlaySound

movlw SND_PIP

subwf ALARM,w

btfsc STATUS,Z

goto PlayPip

movlw SND_PEEP

subwf ALARM,w

btfsc STATUS,Z

goto PlayPeep

movlw SND_WHIP

subwf ALARM,w

btfsc STATUS,Z

goto PlayWhip

PlayContinue

СМЯТЕНИЕ clrf

возврат

PlayPip

lcall SPK_Pip

goto PlayContinue

PlayPeep

lcall SPK_Peep

goto PlayContinue

PlayWhip

lcall SPK_Whip

goto PlayContinue

ToggleTimerSettings ; коленчатый байт установок таймера

movwf TMP

movf SEL_TMR,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

movf TMP,w

xorwf INDF,f

bcf STATUS,IRP

возврат CopyDispToVal; копируйте в настоящий момент показанное значение таймера в VAL

movf DISP,w

movwf VAL

movf DISP+1,w

movwf VAL+1

movf DISP+2,w

movwf VAL+2

movf DISP+3,w

movwf VAL+3

movf DISP+4,w

movwf VAL+4

movf DISP+5,w

movwf VAL+5

возврат

M_CLR ; очистите запись

movwf FSR

ТОЧНОСТЬ movlw

movwf REG_COUNTER

M_CLR_loop

clrf INDF

incf FSR,f

decf REG_COUNTER,f

btfss STATUS,Z

goto M_CLR_loop

возврат

M_ROL ; вращайтесь запись влево

movwf FSR

M_StorStatus REG_STATUS

clrf REG_COUNTER

M_ROL_loop

M_RetrStatus REG_STATUS

rlf INDF,f

M_StorStatus REG_STATUS

incf FSR,f

incf REG_COUNTER,f

ТОЧНОСТЬ movlw

subwf REG_COUNTER,w

btfss STATUS,Z

goto M_ROL_loop

возврат

M_ROR ; вращается запись вправо

movwf FSR

ТОЧНОСТЬ-1 movlw

addwf FSR,f

M_StorStatus REG_STATUS

clrf REG_COUNTER

M_ROR_loop

M_RetrStatus REG_STATUS

rrf INDF,f

M_StorStatus REG_STATUS

decf FSR,f

incf REG_COUNTER,f

ТОЧНОСТЬ movlw

subwf REG_COUNTER,w

btfss STATUS,Z

goto M_ROR_loop

возврат

M_CMP ; Z <=> X СТАТУСА(C,Z)->

; Набор STATUS,C, если Z => X;

; Набор STATUS,Z, если Z == X

clrf REG_COUNTER

M_CMP_loop

movf REG_COUNTER,w

sublw REG_Z+PRECISION-1

movwf FSR

movf INDF,w

movwf REG_T1

movf REG_COUNTER,w

sublw REG_X+PRECISION-1

movwf FSR

movf INDF,w

subwf REG_T1,f

btfss STATUS,Z

возврат

incf REG_COUNTER,f

ТОЧНОСТЬ movlw

subwf REG_COUNTER,w

btfss STATUS,Z

goto M_CMP_loop

возврат

M_INC ; приращение запись

movwf FSR

ТОЧНОСТЬ movlw

movwf REG_COUNTER

M_INC_loop

incf INDF,f

btfss STATUS,Z

возврат

incf FSR,f

decf REG_COUNTER,f

btfss STATUS,Z

goto M_INC_loop

возврат

M_ADD ; Z + X -> Z

bcf STATUS,C

clrf REG_STATUS

clrf REG_COUNTER

M_ADD_loop

clrf REG_T1

btfsc REG_STATUS,C

incf REG_T1,f

clrf REG_STATUS

movlw REG_X

addwf REG_COUNTER,w

movwf FSR

movf INDF,w

addwf REG_T1,f

btfsc STATUS,C

bsf REG_STATUS,C

movlw REG_Z

addwf REG_COUNTER,w

movwf FSR

movf INDF,w

addwf REG_T1,f

btfsc STATUS,C

bsf REG_STATUS,C

movf REG_T1,w

movwf INDF

incf REG_COUNTER,f

ТОЧНОСТЬ movlw

subwf REG_COUNTER,w

btfss STATUS,Z

goto M_ADD_loop

возврат

M_SUB ; Z - X -> Z

clrf REG_COUNTER

bsf REG_STATUS,C

M_SUB_loop

bsf REG_T2,C

movlw REG_Z

addwf REG_COUNTER,w

movwf FSR

movf INDF,w

movwf REG_T1

movlw REG_X

addwf REG_COUNTER,w

movwf FSR

movf INDF,w

subwf REG_T1,f

btfss STATUS,C

bcf REG_T2,C

btfsc REG_STATUS,C

goto M_SUB_no_carry

movlw 0x01

subwf REG_T1,f

btfss STATUS,C

bcf REG_T2,C

M_SUB_no_carry

movlw REG_Z

addwf REG_COUNTER,w

movwf FSR

movf REG_T1,w

movwf INDF

bsf REG_STATUS,C

btfss REG_T2,C

bcf REG_STATUS,C

incf REG_COUNTER,f

ТОЧНОСТЬ movlw

subwf REG_COUNTER,w

btfss STATUS,Z

goto M_SUB_loop

btfss REG_STATUS,C

bcf STATUS,C

возврат

M_MUL ; X * Y -> Z

movlw REG_Z

вызовите M_CLR

movlw PRECISION*8+1

movwf REG_ROT_COUNTER

LCD_Init

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

movlw 0x00

movwf PORTE

movlw b'00110000'

movwf PORTC

вызовите LCD_PulseZ

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

movlw b'00111000'

movwf PORTC

вызовите LCD_PulseZ

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

movlw b'00111000'

movwf PORTC

вызовите LCD_PulseZ

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

вызовите LCD_Wait

movlw b'00111000'

movwf PORTC

вызовите LCD_PulseZ

movlw b'00001000'

movwf PORTC

вызовите LCD_PulseZ

movlw b'00000001'

movwf PORTC

вызовите LCD_PulseZ

movlw b'00000110'

movwf PORTC

вызовите LCD_PulseZ

movlw b'00001000'

movwf PORTC

вызовите LCD_PulseZ

movlw b'00000010'

movwf PORTC

вызовите LCD_PulseZ

;movlw b'10000000'

;movwf PORTC

;call LCD_PulseZ

;movlw b'00010100'

;movwf PORTC

;call LCD_PulseZ

;movlw b'10000000'

;movwf PORTC

;call LCD_PulseZ

bsf PORTE,0

movlw b'00001100'

вызовите LCD_SendCMD

movlw MSG_ID_Clear

movwf MSG_ID

movwf MSG_ID_CURRENT

возврат

LCD_SendDAT

movwf PORTC

bsf PORTE,0

вызовите LCD_PulseZ

возврат

LCD_SendCMD

movwf PORTC

bcf PORTE,0

вызовите LCD_PulseZ

bsf PORTE,0

возврат

MSG_NextChar_second

banksel EEDATA

movf EEDATA,w

banksel MSGDAT

movwf MSGDAT

bcf MSGDAT,7

incf MSGL,f

btfsc STATUS,Z

incf MSGH,f

bcf MSGH,7

movf MSGDAT,w

возврат

SPK_Delay

movlw 0x0F

movwf TMP

decf TMP,f

btfss STATUS,Z

goto $-2

возврат

SPK_Pip

movlw 0xFF

movwf TMP2

SPK_Pip_0

movlw 0x20

movwf TMP1

SPK_Pip_1

lcall SPK_Delay

decf TMP1,f

btfss STATUS,Z

goto SPK_Pip_1

movlw 0x01<<B_SPK

xorwf PORTA,f

decf TMP2,f

btfss STATUS,Z

goto SPK_Pip_

bcf PORTA,B_SPK

возврат

SPK_Peep

movlw 0x10

movwf TMP3

SPK_Peep_0

вызовите SPK_Pip

decf TMP3,f

btfss STATUS,Z

goto SPK_Peep_0

возврат

SPK_Whip

clrf TMP2

movlw 0xC0

SPK_Whip_0

movf TMP2,w

addlw 0x38

movwf TMP1

SPK_Whip_1

lcall SPK_Delay

decf TMP1,f

btfss STATUS,Z

goto SPK_Whip_1

movlw 0x01<<B_SPK

xorwf PORTA,f

decf TMP2,f

btfss STATUS,Z

goto SPK_Whip_0

возврат

org 0x1000

S00_TimerSelectLoop

clrf LCD_CURSOR_POSITION

SetMsg MSG_ID_Clear

IfJump VK_MENU_NEXT,S00_NextTmr

IfJump VK_MENU_PREV,S00_PrevTmr

IfState VK_MENU_ENTER,S10_AdjustTimer

lgoto SM_Rtn

S00_NextTmr

incf SEL_TMR,f

movlw 0x0F

andwf SEL_TMR,f

bsf FLAGS,F_TMR_LABEL_DIRTY

bsf FLAGS,F_TICK

lgoto SM_Rtn

S00_PrevTmr

decf SEL_TMR,f

movlw 0x0F

andwf SEL_TMR,f

bsf FLAGS,F_TMR_LABEL_DIRTY

bsf FLAGS,F_TICK

lgoto SM_Rtn

S10_AdjustTimer

clrf LCD_CURSOR_POSITION

SetMsg 0x00

IfState VK_MENU_EXIT,S00_TimerSelectLoop

IfState VK_MENU_NEXT,S20_AdjustClock

IfState VK_MENU_PREV,S20_AdjustClock

;IfState VK_MENU_PREV,S30_ThermometerSetup

IfState VK_MENU_ENTER,S11_SetTimer

IfJump VK_START_STOP,S10_StartStopTimer

IfJump VK_DIRECTION,S10_ToggleTimerDirection

lgoto SM_Rtn

S10_StartStopTimer

movlw 0x01<<TMR_ON

lcall ToggleTimerSettings

lgoto SM_Rtn

S10_ToggleTimerDirection

movlw 0x01<<TMR_DIR

lcall ToggleTimerSettings

lgoto SM_Rtn

S11_SetTimer

SetMsg 0x01 ; MSG_SetTimer

IfState VK_MENU_EXIT,S10_AdjustTimer

IfState VK_MENU_NEXT,S12_SetAlarm

IfState VK_MENU_PREV,S13_SetLength

IfState VK_MENU_ENTER,S15_SetTimerValue

lgoto SM_Rtn

S12_SetAlarm

SetMsg 0x07

IfState VK_MENU_EXIT,S10_AdjustTimer

IfState VK_MENU_NEXT,S13_SetLength

IfState VK_MENU_PREV,S11_SetTimer

IfState VK_MENU_ENTER,S21_SetAlarmTime

lgoto SM_Rtn

S13_SetLength

SetMsg 0x04 ; MSG_SetLength

IfState VK_MENU_EXIT,S10_AdjustTimer

IfState VK_MENU_NEXT,S11_SetTimer

IfState VK_MENU_PREV,S12_SetAlarm

IfState VK_MENU_ENTER,S16_SetLengthValue

lgoto SM_Rtn

S15_SetTimerValue

SetMsg 0x06 ; MSG_Set

movlw D_SEL_TIMER

movwf VAL_STAT

GoToState S_EnterValueHMS

lgoto SM_Rtn

S16_SetLengthValue

SetMsg 0x06 ; MSG_Set

movlw D_SEL_TIMER_LENGTH

movwf VAL_STAT

GoToState S_EnterLongValue

lgoto SM_Rtn

S20_AdjustClock

SetMsg 0x02

IfState VK_MENU_EXIT,S00_TimerSelectLoop

IfState VK_MENU_NEXT,S10_AdjustTimer

;IfState VK_MENU_NEXT,S30_ThermometerSetup

IfState VK_MENU_PREV,S10_AdjustTimer

IfJump VK_START_STOP,S20_StartStopClock

IfJump VK_SKIP_FORWARD,S20_StartStopClock

lgoto SM_Rtn

S20_StartStopClock

movlw 0x01<<F_CLOCK_STOPPED

xorwf FLAGS,f

lgoto SM_Rtn

S20_SkipForward

movlw (0x01<<F_CLOCK_STOPPED) % 0xFF

andwf FLAGS,f

incf INT_PULSECTR,f

incf INT_PULSECTR,f

incf INT_PULSECTR,f

incf INT_PULSECTR,f

lgoto SM_Rtn

;S30_ThermometerSetup

; SetMsg 0x03

; IfState VK_MENU_EXIT,S00_TimerSelectLoop

; IfState VK_MENU_NEXT,S10_AdjustTimer

; IfState VK_MENU_PREV,S20_AdjustClock

; lgoto SM_Rtn

S21_SetAlarmTime

SetMsg 0x08

IfState VK_MENU_EXIT,S12_SetAlarm

IfState VK_MENU_NEXT,S22_SetSound

IfState VK_MENU_PREV,S23_AlarmAction

IfState VK_MENU_ENTER,S21_EnterAlarmValue

lgoto SM_Rtn

S21_EnterAlarmValue

SetMsg 0x06 ; MSG_Set

movlw D_SEL_TIMER_ALARM

movwf VAL_STAT

movf SEL_TMR,w

movwf CTR1

lcall LoadSelTmrSettingsAndLen

movlw REG_Z

lcall M_CLR

movlw REG_X

lcall M_CLR

bsf STATUS,IRP ; TUK E PROBLEMAT!!!

lcall MC_Normalize_NO_CLR

bcf STATUS,IRP

lcall MC_NormalizedTo86400

lcall MC_86400toHMS

GoToState S_EnterValueHMS

lgoto SM_Rtn

S22_SetSound

SetMsg 0x09

IfState VK_MENU_EXIT,S12_SetAlarm

IfState VK_MENU_NEXT,S23_AlarmAction

IfState VK_MENU_PREV,S21_SetAlarmTime

IfState VK_MENU_ENTER,S40_SoundSelect

lgoto SM_Rtn

S23_AlarmAction

SetMsg 0x0A

IfState VK_MENU_EXIT,S12_SetAlarm

IfState VK_MENU_NEXT,S21_SetAlarmTime

IfState VK_MENU_PREV,S22_SetSound

IfState VK_MENU_ENTER,S51_SelectAction

lgoto SM_Rtn

S40_SoundSelect

movlw 0x03

andwf SEL_TMR_SETTINGS,w

movwf TMP

btfss STATUS,Z

goto S40_SoundSelect_0

; звук Безмолвен

GoToState S44_SoundSilent

lgoto SM_Rtn

S40_SoundSelect_0

movlw SND_PIP

subwf TMP,w

btfss STATUS,Z

goto S40_SoundSelect_1

; звук - это Косточка

GoToState S41_SoundPip

lgoto SM_Rtn

S40_SoundSelect_1

movlw SND_PEEP

subwf TMP,w

btfss STATUS,Z

goto S40_SoundSelect_2

; звук - это Чирикание

GoToState S42_SoundPeep

lgoto SM_Rtn

S40_SoundSelect_2

; звук - это Кнут

GoToState S43_SoundWhip

lgoto SM_Rtn

lgoto SM_Rtn

S41_SoundPip

SetMsg 0x0B

movlw SND_PIP

вызовите SetSound

IfState VK_MENU_ENTER,S22_SetSound

IfState VK_MENU_EXIT,S22_SetSound

IfState VK_MENU_NEXT,S42_SoundPeep

IfState VK_MENU_PREV,S44_SoundSilent

lgoto SM_Rtn

S42_SoundPeep

SetMsg 0x0C

movlw SND_PEEP

вызовите SetSound

IfState VK_MENU_ENTER,S22_SetSound

IfState VK_MENU_EXIT,S22_SetSound

IfState VK_MENU_NEXT,S43_SoundWhip

IfState VK_MENU_PREV,S41_SoundPip

lgoto SM_Rtn

S43_SoundWhip

SetMsg 0x0D

movlw SND_WHIP

вызовите SetSound

IfState VK_MENU_ENTER,S22_SetSound

IfState VK_MENU_EXIT,S22_SetSound

IfState VK_MENU_NEXT,S44_SoundSilent

IfState VK_MENU_PREV,S42_SoundPeep

lgoto SM_Rtn

S44_SoundSilent

SetMsg 0x0E

movlw SND_SILENT

вызовите SetSound

IfState VK_MENU_ENTER,S22_SetSound

IfState VK_MENU_EXIT,S22_SetSound

IfState VK_MENU_NEXT,S41_SoundPip

IfState VK_MENU_PREV,S43_SoundWhip

lgoto SM_Rtn

Action_SetAddress ; ПРЕДУПРЕЖДЕНИЕ: Это наборы STATUS,IRP! Очистите это после сделанного с INDF

movf SEL_TMR,w

addlw низкий TMR_SETTINGS

movwf FSR

bsf STATUS,IRP

bcf INDF,TMR_ON_ALARM_STOP

bcf INDF,TMR_ON_ALARM_RESET

возврат

S51_SelectAction

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_RESET

goto S51_SelectAction_ResetOff

S51_SelectAction_ResetOn

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_STOP

goto S51_SelectAction_GoToReset

S51_SelectAction_GoToBoth

GoToState S54_ActionBoth

lgoto SM_Rtn

S51_SelectAction_GoToReset

GoToState S52_ActionReset

lgoto SM_Rtn

S51_SelectAction_ResetOff

btfss SEL_TMR_SETTINGS,TMR_ON_ALARM_STOP

goto S51_SelectAction_GoToNone

S51_SelectAction_GoToStop

GoToState S53_ActionStop

lgoto SM_Rtn

S51_SelectAction_GoToNone

GoToState S51_ActionNone

lgoto SM_Rtn

S51_ActionNone

SetMsg 0x0F

movf SEL_TMR,w

вызовите Action_SetAddress

movf INDF,w

bcf STATUS,IRP

movwf SEL_TMR_SETTINGS

IfState VK_MENU_ENTER,S23_AlarmAction

IfState VK_MENU_EXIT,S23_AlarmAction

IfState VK_MENU_NEXT,S52_ActionReset

IfState VK_MENU_PREV,S54_ActionBoth

lgoto SM_Rtn

S52_ActionReset

SetMsg 0x10

вызовите Action_SetAddress

bsf INDF,TMR_ON_ALARM_RESET

movf INDF,w

bcf STATUS,IRP

movwf SEL_TMR_SETTINGS

IfState VK_MENU_ENTER,S23_AlarmAction

IfState VK_MENU_EXIT,S23_AlarmAction

IfState VK_MENU_NEXT,S53_ActionStop

IfState VK_MENU_PREV,S51_ActionNone

lgoto SM_Rtn

S53_ActionStop

SetMsg 0x11

вызовите Action_SetAddress

bsf INDF,TMR_ON_ALARM_STOP

movf INDF,w

bcf STATUS,IRP

movwf SEL_TMR_SETTINGS

IfState VK_MENU_ENTER,S23_AlarmAction

IfState VK_MENU_EXIT,S23_AlarmAction

IfState VK_MENU_NEXT,S54_ActionBoth

IfState VK_MENU_PREV,S52_ActionReset

lgoto SM_Rtn

S54_ActionBoth

SetMsg 0x12

вызовите Action_SetAddress

bsf INDF,TMR_ON_ALARM_STOP

bsf INDF,TMR_ON_ALARM_RESET

movf INDF,w

bcf STATUS,IRP

movwf SEL_TMR_SETTINGS

IfState VK_MENU_ENTER,S23_AlarmAction

IfState VK_MENU_EXIT,S23_AlarmAction

IfState VK_MENU_NEXT,S51_ActionNone

IfState VK_MENU_PREV,S53_ActionStop

lgoto SM_Rtn

SetSound

movwf TMP

movlw низкий TMR_SETTINGS

movwf FSR

movf SEL_TMR,w

addwf FSR,f

bsf STATUS,IRP

movlw 0xFC

andwf INDF,f

movf TMP,w

iorwf INDF,f

bcf STATUS,IRP

возврат

S_CopyFromTimer

movlw D_SEL_TIMER_COPY

movwf VAL_STAT

GoToState S_EnterLongValue

lgoto SM_Rtn

S_EnterLongValue ; введите длинное значение

movlw REG_Z

lcall M_CLR

lcall M_MOV_Z_TO_VAL

clrf VAL_IND

addlw 0x80 | 0x44

movwf LCD_CURSOR_POSITION

bsf FLAGS,F_CURSOR_DIRTY

bcf FLAGS,F_VAL_DISPLAY_DIRTY ; НЕ обновите показ VAL - это не используется здесь

GoToState S_EnterLongValue_Digit

lgoto SM_Rtn

S_EnterLongValue_Digit

pagesel $

IfState VK_MENU_EXIT,S_EnterLongValue_End

IfState VK_MENU_ENTER,S_EnterLongValue_Accept

pagesel $

btfsc BTN_ID,7

goto S_EnterLongValue_DigitRTN

movf BTN_ID,w

andlw 0x0F

lcall LOOKUP_DigitFromKeyID

movwf VAL_DIGIT

pagesel $

btfss VAL_DIGIT,7

goto S_EnterLongValue_Digit_1

lgoto SM_Rtn

S_EnterLongValue_Digit_1

movlw REG_Y

lcall M_CLR

movlw .10

movwf REG_Y

lcall M_MOV_VAL_TO_X

lcall M_MUL

movlw REG_X

lcall M_CLR

movf VAL_DIGIT,w

movwf REG_X

lcall M_ADD

lcall M_MOV_Z_TO_VAL

movf VAL_IND,w

addlw LCDCMD_SET_DD_RAM | 0x44

lcall LCD_SendCMD

movf VAL_DIGIT,w

addlw LCD_0

lcall LCD_SendDAT

incf VAL_IND,f

movf VAL_IND,w

addlw 0x80 | 0x44

movwf LCD_CURSOR_POSITION

bsf FLAGS,F_CURSOR_DIRTY

pagesel $

movf VAL_IND,w

sublw .10

btfsc STATUS,Z

decf VAL_IND,f

S_EnterLongValue_DigitRTN

lgoto SM_Rtn

S_EnterLongValue_Accept

bsf FLAGS,F_VALUE_ENTERED

S_EnterLongValue_End

clrf LCD_CURSOR_POSITION

bsf FLAGS,F_CURSOR_DIRTY

GoToState S13_SetLength

lgoto SM_Rtn

org 0x1800

da MSG_AdjustTimer ; 0x00

da MSG_SetTimer ; 0x01

da MSG_AdjustClock ; 0x02

da MSG_ThermometerSetup ; 0x03 - не используют в этой версии

da MSG_SetLength ; 0x04

da MSG_SetFormat ; 0x05

da MSG_Set ; 0x06

da MSG_SetAlarm ; 0x07

da MSG_SetAlarmTime ; 0x08

da MSG_SetSound ; 0x09

da MSG_AlarmAction ; 0x0A

da MSG_SoundPip ; 0x0B

da MSG_SoundPeep ; 0x0C

da MSG_SoundWhip ; 0x0D

da MSG_SoundSilent ; 0x0E

da MSG_ActionNone ; 0x0F

da MSG_ActionReset ; 0x10

da MSG_ActionStop ; 0x11

da MSG_ActionBoth ; 0x12

MSG_AdjustTimer

da "Приспособить Таймер",0

MSG_SetTimer

da "Установленный Таймер",0

MSG_AdjustClock

da "Приспособить Отмечает время",0

MSG_ThermometerSetup

"Терм da . Setup",0 ; не используют в этой версии


Подобные документы

  • Этапы разработки микропроцессорной системы на основе микроконтроллера. Общая характеристика солнечных часов. Разработка схемы, программного обеспечения и алгоритма управления солнечных часов. Технико-экономическое обоснование разработки и охрана труда.

    дипломная работа [5,9 M], добавлен 16.07.2010

  • Описание структурной и функциональной схем электронных часов, выбор элементной базы. Разработка счетчика времени с системой управления на базе микроконтроллера. Экономический расчет затрат на проектирование, разработку и сборку макета электронных часов.

    дипломная работа [223,5 K], добавлен 26.07.2015

  • Функциональная спецификация и структурная схема автомобильных вольтметра-термометра-часов. Описание ресурсов микроконтроллера, назначение выводов микросхемы. Ассемблирование и разработка алгоритма работы, коды кнопок и описание команд управления.

    курсовая работа [2,0 M], добавлен 27.12.2009

  • Описание работы электронных часов и микроконтроллера АТTiny2313 фирмы Atmel. Выходные буферы порта. Принципиальная схема электронных часов. Разработка печатной платы и практическое её применение. Принципы программирования и прошивки микроконтроллера.

    курсовая работа [749,0 K], добавлен 29.05.2009

  • Технология сквозного проектирования. Разработка принципиальной электронной схемы устройства. Обоснование выбора цифровых электронных компонентов. Трёхмерное моделирование: разработка модели корпуса, 3D-печать. Разработка программы микроконтроллера.

    дипломная работа [1,2 M], добавлен 22.08.2017

  • Разработка микропроцессорной системы на основе микроконтроллера. Методы и средства совместной отладки аппаратных и программных средств. Структурная схема и функциональная спецификация устройства - регулятора яркости ламп накаливания. Алгоритм управления.

    дипломная работа [1,4 M], добавлен 15.07.2010

  • Функциональная спецификация и преимущества термометрического датчика. Структурная схема микроконтроллера РIС16F84A. Алгоритм работы программы, описание функциональных узлов, выбор элементной базы и принципиальная схема терморегулятора для аквариума.

    курсовая работа [4,7 M], добавлен 27.12.2009

  • Функциональная спецификация, описание объекта, структура системы и ресурсов микроконтроллера. Ассемблирование, программирование микроконтроллера и разработка алгоритма работы устройства, описание выбора элементной базы и работы принципиальной схемы.

    курсовая работа [2,2 M], добавлен 02.01.2010

  • Роль микроконтроллерных технологий в развитии микроэлектроники. Алгоритм разработки микропроцессорной системы термометр-часы на базе микроконтроллера PIC16F84A. Разработка схемы электрической принципиальной устройства и программы для микроконтроллера.

    курсовая работа [584,1 K], добавлен 19.03.2012

  • Проектирование шахматных часов с функцией будильника. Создание и разводка печатной платы на основе микроконтроллера при помощи программы Proteus, выбор его архитектуры. Разработка схемы и программного кода. Тестирование прототипа на макетной плате.

    дипломная работа [41,0 M], добавлен 22.01.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.