1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
| ;----------------------------------------------------------------------
;
LIST P=18F4520,R=DEC, X=ON, F=INHX8M ;директива определяющая целевой микроконтроллер
#include <P18F4520.INC>
;
;
CONFIG OSC = LP ;LP
CBLOCK 0x080
W_TEMP ;переменная для сохранения контекста
STATUS_TEMP ;переменная для сохранения контекста
RP ;переменная для сохранения контекста
ENDC
ORG 0x00 ; адрес начала программы
GOTO BEGIN ; обойти прерывание (начало 04 установлено физически)
;------------обработка прерывания (каждые 0.4mc)---------------------
ORG 0x04 ; адрес начала обработки прерывания
MOVWF W_TEMP ; запомнить содержимое W
MOVF STATUS,0 ;
MOVWF STATUS_TEMP ; запомнить содержимое STATUS
INCFSZ TMR1,1 ; TMR1 переполнен?(переход с 0FFh на 00h через 100мс)
GOTO MINT1 ; перехода TMR1 с "0FF" на "0" не было-закончить
INCF TMR2,1 ; TMR1 переполнен, увеличить TMR2
MINT1
BCF INTCON,2 ; очистить запрос прерывания (от TMR0)
CLRWDT ; обнулить сторожевой таймер
MOVF STATUS_TEMP,0 ; восстановить STATUS
MOVWF STATUS ;
SWAPF W_TEMP,1 ; восстановить W не меняя STATUS (при такой операции
; биты регистра STATUS не изменяются)
SWAPF W_TEMP,0 ; SWAPF W_TEMP,1 -обменять тетрады, сохранить в F
; SWAPF W_TEMP,1 -обменять тетрады, сохранить в W
RETFIE ; выход из подпрограммы прерывания
;------------------конец обработки прерывания----------------------------
BEGIN
CLRF INTCON ; запретить все прерывания
;------------ инициализация регистра OPTION------------------------------
BCF STATUS, RP ; выбрать банк 0
CLRF TMR0
BSF STATUS, RP ; выбрать банк 1
MOVLW 01Fh
MOVWF OPTION_REG
; PSA = "1" включить предварительный делитель после WDT
; T0CS = "0" источник тактирования-внутренняя тактовая частота
; NOT_RBPU = "0" подключить подтягивающие резисторы на входах
; PS0=PS1=PS2 = "1" коэффициент деления 1:128 [для WDT] и 1:256 [для TMR0]
BCF STATUS, RP ; выбрать банк 0
;------------инициализация регистра PORTA--------------------------------
BCF STATUS, RP ; выбрать банк 0
CLRF PORTA ; очистить выходные защелки PORTA
BSF STATUS, RP ; выбрать банк 1
MOVLW 01Ch ; значение для выбора направления
MOVWF TRISA ; установить RA<4,3,2> - вход, остальные (0,1) выход
;-----------инициализация регистра PORTB---------------------------------
BCF STATUS, RP ; выбрать банк 0
CLRF PORTB ; очистить выходные защелки PORTB
BSF STATUS, RP ; выбрать банк 1
MOVLW 0Bh ; значение для выбора направления
MOVWF TRISB ; установить RB<3,1,0> - вход, остальные (7-4,2) выход
BCF STATUS, RP ; выбрать банк 0
;-------------инициализация регистра INTCON-----------------------------
MOVLW 0A0h ; очистить запросы прерываний
MOVWF INTCON ; разрешить прерывание от TMR0
;;;;;;;;;;;;;;;окончание начальных установок;;;;;;;;;;;;;;;;;;;
CLRF FLAG3
M01
CLRWDT ; обнулить сторожевой таймер
BCF PORTA,SR ; выключить сирену
CLRF FLAG0 ; обнулить регистр флагов признаков режима
BSF FLAG0,OFF ; включить признак режима "отключено"
CLRF FLAG1 ; обнулить регистр флагов признаков индикации
CLRF FLAG2 ; обнулить регистр флагов признаков звука
BCF FLAG3,S1 ; выключить признак прерывистой работы сирены
BCF FLAG3,PZK ; обнулить признак запрета проверки кнопки "режим"
BSF PORTB,TZ ; обнулить триггер пьезодатчика
BCF PORTA,SR ; Отключить сирену
M02
CLRWDT
CLRF TEMP0 ; Проверим и запомним состояние кнопки "режим"
BTFSS PORTB,KR ; Если кнопка не нажата, ТЕМР0 останется обнулённым
INCF TEMP0,1 ; Кнопка нажата, ТЕМР0 увеличить на 1
CLRF TEMP1 ; Загрузим признак состоян кн "режим" в регистр TEMP1
BTFSC FLAG3,SST ; Если признак НЕ нажатой, ТЕМР1 останется =0
INCF TEMP1,1 ; Если признак НАЖАТОЙ, ТЕМР1 увеличится на 1
;---Сравнить СОСТОЯНИЕ (PORTB,KR) кнопки и ПРИЗНАК состояния (FLAG3,SST)---
MOVF TEMP0,0 ; Загрузить значение TEMP0 в W (в TEMP0-состояние)
XORWF TEMP1,0 ; Сравним содержимое TEMP0 и TEMP1 (в TEMP1-признак)
BTFSS STATUS,Z ;
GOTO M021 ; Состояние кнопки "режим" не соответствует признаку
;BTFSS FLAG3,OPZ ; Установлен признак опознавания состояния кнопки?
;GOTO M024 ; Нет
GOTO M023 ; Состояние кнопки "режим" соответствует признаку
M021 ; ПРИЗНАК не соответствует СОСТОЯНИЮ
BTFSC FLAG3,OPZ ; Установлен признак опознавания состояния кнопки?
GOTO M022 ; Да
BSF FLAG3,OPZ ; Установить признак опознавания состояния кнопки
MOVF TMR1,0 ; Установим таймер минимальной длительности проверки
ADDLW CONSO ; Прибавить константу [мс] к текущему значению TMR1
MOVWF TMRO ; и запомнить полученное ожидаемое знач TMR1 в TMRO
GOTO M024 ; Продолжить
M022
MOVF TMR1,0 ; Изменённое состоян кнопки "режим" длится уже 100мс?
XORWF TMRO,0 ; Сравнить значение TMRO с TMR1
BTFSS STATUS,Z ; Прошло 100мс? (Z="1"?)
GOTO M024 ; Нет, продолжить
; Прошло 100 мс опознавания, в течение этого времени состояние кнопки
; (PORTB,KR) не изменилось и оставалось противоположным признаку состоя-
; ния, обновим (инвертируем) признак состояния кнопки "режим" [FLAG3,SST]
CLRF TEMP0 ; Обнулить TEMP0
BSF TEMP0,SST ; Бит TEMP0,SST установить в "1"
MOVF TEMP0,0 ; Загрузить TEMP0 в W
XORWF FLAG3,1 ; Получим инверсию одного бита FLAG3,[PKR]
M023
BCF FLAG3,OPZ ; Обнулить признак опознавания состояния кн
M024
BTFSC FLAG3,PZK ; Запрет проверки кнопки "режим"?
GOTO M03 ; Запрет
BCF PORTB,TZ ; Нет запрета, разрешить триггер пьезодатчика
GOTO M04
M03
MOVF TMR2,0 ; Выяснить, после установки запрета уже прошло 60мс?
XORWF TMRZP,0 ; Сравнить значение TMRZP с TMR1
BTFSC STATUS,Z ; Прошло 200мс? (Результат сравнения =0?)
BCF FLAG3,PZK ; Да, прошло - обнулить запрет
M04
CLRWDT ; Обнулить сторожевой таймер (иначе он прервёт прогр)
MOVF TMR1,0 ; Можно-ли разрешить проверку датчика двери?
XORWF TMRZW,0 ; Сравнить значение TMRZW с TMR1
BTFSC STATUS,Z ; Результат сравнения =0?
BCF FLAG3,PZD ; Да, время запрета закончилось - обнулить запрет
;--------------- Обработка короткого звукового сигнала ------------------
BTFSS FLAG2,KSR ; Включен признак короткого звук сигнала?
GOTO M370 ; Нет, обойти
MOVF TMR1,0 ; Для сравнения TMR1 и TMRSN1 значение TMR2 в W
XORWF TMRSN1,0 ; Пора выключить звук сигн постановки в дежурн режим?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M370 ; Нет, 0.2с не закончились
BCF PORTA,SR ; Выключить звук сигнал (сирену)
BCF FLAG2,KSR ; Выключить признак короткого звук сигнал
M370
BTFSS FLAG1,IPR ; признак изменения индикации -включенo?
GOTO M06 ; нет
BCF FLAG1,IPR ; Да, выключить признак изменения ндикации
MOVF TMR2,0 ; Загрузить значение TMR2 в W
ADDLW CONB ;
MOVWF TMRB ; Установить таймер быстрого мигания
MOVF TMR2,0 ; Загрузить значение TMR2 в W
ADDLW CONM ;
MOVWF TMRM ; Установить таймер медленного мигания
BCF PORTB,LR ; выключить индикацию питания -красный
BCF PORTB,LG ; выключить индикацию питания -зелёный
BTFSC FLAG1,INO ; признак индикации питания- потушены оба светодиода?
GOTO M10 ; Да
BTFSS FLAG1,ING ; Нет. Признак нндикации - "зелёный"?
GOTO M05 ; Нет, признак нндикации "красный"
BSF PORTB,LG ; Иначе, включить индикацию - "зелёный"
GOTO M10 ;
M05 ;
BSF PORTB,LR ; включить индикацию питания -красный
GOTO M10 ;
M06 ;
BTFSC FLAG1,INO ; Признак ндикации - "потушено"?
GOTO M10 ; Да
BTFSS FLAG1,IMG ; Включен признак МИГАНИЯ индикации?
GOTO M10 ; Нет
BTFSS FLAG1,IMB ; Включен признак БЫСТРОГО мигания индикации?
GOTO M07 ; Нет, а значит должно быть МЕДЛЕННОЕ миг индикации
;--------------------- быстрое мигание индикации -----------------------
MOVF TMR2,0 ; Иначе, для сравнения TMR2 и TMRB значение TMR2 в W
XORWF TMRB,0 ; Пора потушить (зажечь) индикатор?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M10 ; Нет, результат сравнения не равен нулю
MOVF TMR2,0 ; Результат сравнения равен нулю
ADDLW CONB ;
MOVWF TMRB ; Загрузить TMRB новым значением TMR2
GOTO M08 ;
;--------------------- медленное мигание индикации -----------------------
M07
MOVF TMR2,0 ; Для сравнения TMR2 и TMRM, значение TMR2 загрузи в W
XORWF TMRM,0 ; Пора потушить (зажечь) индикатор?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M10 ; Нет, результат сравнения не равен нулю
MOVF TMR2,0 ; Результат сравнения равен нулю
ADDLW CONM ;
MOVWF TMRM ; Загрузить TMRB новым значением TMR2
;------инвертировать (потушить или зажечь) красный или зелёный светодиод -
M08
BTFSS FLAG1,ING ; Признак нндикации - "зелёный"?
GOTO M09 ; Нет, к инвертированию красного светодиода
CLRF TEMP0 ; подготовка к инвертированию бита LG порта B
BSF TEMP0,LG ; TEMP0 обнулен, а место бита LG устанавливаем в "1"
MOVF TEMP0,0 ; грузим в регистр W TEMP0
XORWF PORTB,1 ; исключающее или W и PORTB, результат в PORTB
GOTO M10 ; В результате получилась инверсия бита (LG) порта B
; не изменяющая остальные биты порта
M09 ; начало инвертирования красного светодиода
CLRF TEMP0 ; подготовка к инвертированию бита LR порта B
BSF TEMP0,LR ; TEMP0 обнулен, а место бита LR устанавливаем в "1"
MOVF TEMP0,0 ; грузим в регистр W TEMP0
XORWF PORTB,1 ; исключающее или W и PORTB, результат в PORTB
; В результате получилась инверсия бита (LR) порта B
BTFSC PORTA,PS ; есть сетевое (основное) питание?
GOTO M162 ; нет
BSF FLAG1,PPS ; Есть сетевое питание, включить признак
GOTO M10
M162
BTFSS FLAG1,PPS ; Нет сетевого, признак сетевого включен?
GOTO M10 ; Выключен
BCF FLAG1,PPS ; Пропало сетевое питание, выключить признак
MOVLW CONSKSR ; Установить длительность звукового сигнала
CALL PKSR ; Подать звуковой сигнал пропадания сетевого питания
M10
BTFSS FLAG0,OFF ; Признак режима устройства - "выключено"?
GOTO M17 ; Нет, искать текущий режим
BTFSC FLAG0,PRH ; "Выключено". Признак ИЗМЕНЕНИЯ режима включен?
GOTO M01 ; Да, к установке режима
;---------- режим OFF, уточнение состояния индикатора питания -------------
BTFSS PORTA,PS ; есть сетевое (основное) питание?
GOTO M12 ; да
BTFSS FLAG1,INR ; Нет сетевого признак ндикации питания- красный?
GOTO M11 ; нет
BTFSS FLAG1,IMG ; Красный. Включен признак МИГАНИЯ индикации?
GOTO M16 ; Признак МИГАНИЯ выключен, к обработке режима "OFF"
M11
CLRF FLAG1 ; Обнулить флаг индикации
BSF FLAG1,INR ; Установить признак ндикации - красный
BSF FLAG1,IPR ; Установить признак перехода ндикации
GOTO M16 ; К обработке режима "OFF"
M12
BTFSC PORTA,PG ; резервное (батарейное) питание есть?
GOTO M14 ; Нет
BTFSS FLAG1,ING ; признак индикации зеленый?
GOTO M13 ; Нет
BTFSS FLAG1,IMG ; Включен признак МИГАНИЯ индикации?
GOTO M16 ; Нет. К обработке режима "OFF"
M13
CLRF FLAG1 ; Обнулить флаг индикации
BSF FLAG1,ING ; Установить признак ндикации - "зелёный"
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
GOTO M16 ; К обработке режима "OFF"
M14
BTFSS FLAG1,ING ; Признак индикации ЗЕЛЁНЫЙ?
GOTO M15 ; Нет
BTFSS FLAG1,IMG ; Зелёный. Включен признак МИГАНИЯ индикации?
GOTO M15 ; Нет.
BTFSS FLAG1,IMB ; Включен признак БЫСТРОГО мигания индикации?
GOTO M16 ; Нет. К обработке режима "OFF"
M15
CLRF FLAG1 ; Обнулить флаг индикации
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
BSF FLAG1,ING ; Установить признак индикации - "ЗЕЛЁНЫЙ"
BSF FLAG1,IMG ; Установить признак МИГАНИЯ индикации
;------------------- обработка режима "OFF" ----------------------------
M16
BTFSS FLAG3,PU ; Проверить, отпущена-ли кнопка "режим"
GOTO M120 ; Да, продолжить
BTFSS FLAG3,SST ; Нет. Проверить, нажата-ли кнопка "режим"
BCF FLAG3,PU ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
GOTO M02 ;
M120
BTFSS FLAG3,SST ; Проверить, нажата-ли кнопка "режим"
GOTO M02 ; Кнопка "режим" не нажата
CLRF FLAG0 ; Кнопка нажата. Обнулить регистр флагов режима
BSF FLAG0,PRH ; Включить признак ИЗМЕНЕНИЯ режима
BSF FLAG0,OFF1 ; Включить признак режима "OFF1"
CLRF FLAG1 ; Обнулить регистр флагов индикации
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
BSF FLAG1,INR ; Установить признак индикации - "КРАСНЫЙ"
BSF FLAG1,IMG ; Установить признак МИГАНИЯ индикации
BSF FLAG1,IMB ; Установить признак БЫСТРОГО мигания индикации
BSF FLAG3,PU ; Установить ПРИЗНАК НАЖАТОЙ
GOTO M02 ; Повторять, но в режиме "OFF1"
M17
BTFSS FLAG0,OFF1 ; Признак режима устройства - "OFF1"?
GOTO M23 ; Нет. Определить текущий режим
;------------------ включен признак режима "OFF1" ------------------------
BTFSS FLAG0,PRH ; Включен признак ИЗМЕНЕНИЯ режима?
GOTO M20 ; Нет
BCF FLAG0,PRH ; Включен признак ИЗМЕНЕНИЯ режима, - обнулить его
MOVF TMR2,0 ;
ADDLW CONO ; Для задержки установки дежурного режима при выходе
MOVWF TMRZ ; установить таймер (TMRZ) режима "OFF1" на 8с
M18
BSF FLAG2,SNP ; Установить признак ПЕРЕХОДА звука
BCF FLAG3,DTD ; Для уточнения признака состояния датчика двери обнул
BTFSC PORTA,DD ; Дверь закрыта?
BSF FLAG3,DTD ; Нет. Установить призн сост датч двери в "1"
BSF FLAG2,SOFF1 ; Установить признак звука SOFF1 в "1"
BCF FLAG2,SOFF2 ; Обнулить признак звука SOFF2
BTFSC PORTA,DD ; Дверь закрыта?
GOTO M02 ; Нет, открыта, признак SOFF1 остается в "1"
BSF FLAG2,SOFF2 ; Закрыта. Установить признак звука SOFF2
BCF FLAG2,SOFF1 ; Обнулить признак звука SOFF1
GOTO M02 ; Повторять с самого начала
M20
MOVF TMR2,0 ;
XORWF TMRZ,0 ; Закончилась задержка времени OFF1 (8с)
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M21 ; Нет
;----------- Закончилась задержка времени OFF1 (8с) ----------------------
MM20
CLRF FLAG0
CLRF FLAG1
BSF FLAG0,PRH ; Установить признак ПЕРЕХОДА режима
BSF FLAG0,OHR ; Установить признак режима "ДЕЖУРНЫЙ"
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
BSF FLAG1,INR ; Установить признак индикации - "КРАСНЫЙ"
BSF FLAG1,IMG ; Установить признак МИГАНИЯ индикации
GOTO M02 ; К началу
M21
BTFSS FLAG3,PU ; Проверить, отпущена-ли кнопка "режим"?
GOTO M130 ; Да
BTFSC FLAG3,SST ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
GOTO M132 ; Кнопка "режим" ещё нажата, ждать отпускания
BCF FLAG3,PU ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M130
BTFSC FLAG3,SST ; Проверить, нажата-ли кнопка "режим"
GOTO M22 ; Кнопка "режим" нажата.
;---------- Изменилось-ли состояние датчика двери? ------------
M132
CLRF TEMP0 ; Для того, чтоб проверить, изменилось-ли состояние
BTFSC FLAG3,DTD ; датчика двери, загрузим TEMP0 значением бита DTD
INCF TEMP0,0 ; Ниже TEMP0 загружен либо "1" (нарушен), либо "0"
CLRF TEMP1 ; А состояние двери загрузим в TEMP1
BTFSC PORTA,DD ; Дверь закрыта?
INCF TEMP1,0 ; Ниже TEMP1 загружен либо "1", либо "0"
MOVF TEMP1,0 ; Загрузить TEMP1 в W
XORWF TEMP0,0 ; Сравнить TEMP0 и W
BTFSS STATUS,Z ;
GOTO M18 ; Состояние датчика двери изменилось- уточнить звук
GOTO M02 ; Состояние датчика двери не изменилось
;---------------- Нажата кнопка в режиме "OFF1" --------------------------
M22
CLRF FLAG0 ; Обнулить регистр флагов режима
BSF FLAG0,PRH ; Включить признак ИЗМЕНЕНИЯ режима
BSF FLAG0,OFF ; Включить признак режима "OFF"
BSF FLAG3,PU ; Включить признак нажатой кнопки
GOTO M02
M23
BTFSS FLAG0,OHR ; Признак режима устройства - "дежурный"?
GOTO M26 ; Нет, уточнить дальше текущий режим
;------------- текущий режим устройства - "дежурный" (охрана) -----------
BTFSS FLAG0,PRH ; Признак ИЗМЕНЕНИЯ режима включен?
GOTO M24 ; Нет, проверять датчики и кнопку
BTFSC FLAG3,PZD ; Запрет проверки датчика двери?
GOTO M02 ; Запрет, подождать
BCF FLAG0,PRH ; Выключить признак изменения режима.
CLRF FLAG3 ; Обнулить регистр признаков звука
BTFSC PORTA,DD ; Датчик двери нарушен?
GOTO M22 ; Да, к установлению режима "OFF"
M360
BSF FLAG2,PKSR ; Включить признак звукового сигнала
MOVLW CONS1 ; Включить короткий звуковой сигнал (сирену), подтве-
CALL PKSR ; ждающий успешную установку в дежурный режим охраны
GOTO M02 ; Повторять всё сначала, режим-дежурный
M24
BTFSC PORTA,DD ; Датчик двери нарушен?
GOTO M25 ; Да
BTFSS FLAG3,PU ; Проверить, отпущена-ли кнопка "режим"?
GOTO M140 ; Да
BTFSC FLAG3,SST ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
GOTO M142 ; Кнопка "режим" ещё нажата, ждать отпускания
BCF FLAG3,PU ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M140
BTFSC FLAG3,SST ; Проверить, нажата-ли кнопка "режим"
GOTO M22 ; Кнопка "режим" нажата
;---------- Обработка сигнала пьезодатчика в дежурном режиме -----------
M142
BTFSC FLAG2,PST ; Пьезосторож включен?
GOTO M144 ; Да
BTFSS PORTB,DZ ; Пьезосторож выключен, пьезодатчик включен?
GOTO M02 ; Нет
BSF FLAG2,PST ; Пьезодатчик включен. Включить пьезосторож
MOVF TMR2,0 ; Загрузить значение TMR2 в W
ADDLW CONSPZ ; Прибавиь значение CONSPZ к W (примерно для 10с)
MOVWF TMRPZ ; Устан таймр пьезо (длительность контроля колич стукв)
BSF FLAG2,STPZ ; Установить старое состояние пьезо в "1"
CLRF SHPZ ; Обнулить счетчик пьезо (число для включения сирены)
CLRF SHPZ1 ; Обнулить счетчик пьезо1 (число для вклч коротк звук)
GOTO M02 ;
M144
MOVF TMR2,0 ; Для сравнения TMR2 и TMRPZ значение TMR2 в W
XORWF TMRT,0 ; Закончилось контрольное время?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M146 ; Нет, контрольное время не закончилось
BCF FLAG2,PST ; Закончилось контрольное время, выключить пьезосторож
GOTO M02 ;
M146
BTFSC PORTB,DZ ; Пьезодатчик включен?
GOTO M148 ; Включен
BCF FLAG2,STPZ ; Выключен. Обнулить старое состояние пьезо
GOTO M02 ;
M148
BTFSC FLAG2,STPZ ; Старое состояние пьезо = "0"?
GOTO M02 ; Нет, "1"
BSF FLAG2,STPZ ; Признак старого состояние пьезо установить в "1"
INCF SHPZ,1 ; Увеличить счетчик срабатываний пьезодатчика
INCF SHPZ1,1 ; Увеличить счетчик1 срабатываний пьезодатчика
MOVF SHPZ1,0 ; Загрузить значение счетчика1 в W
XORLW CONSSP1 ; Cравнить с константой CONSSP1 (03). Счётчик =03?
BTFSS STATUS,Z ;
GOTO M158 ; Нет, значение счетчика меньше CONSSP1 (3)
CLRF SHPZ1 ; Значение счетчика равно CONSSP1, обнулить счетчик
MOVLW CONSDZ ; Стар сост пьезо = "0", задаём длительность звук сигн
CALL PKSR ; Включить короткий звуковой сигнал
M158
MOVF SHPZ,0 ; Загрузить значение счетчика в W
XORLW CONSSP ; Cравнить с константой CONSSP (10). Счётчик =10?
BTFSS STATUS,Z ;
GOTO M02 ; Нет, значение счетчика меньше CONSSP (10)
BCF FLAG2,PST ; Кол-во срабатываний пьезо=10. Выключить пьезосторож
BCF FLAG2,KSR ; Выключить признак короткого звук сигнал
GOTO M28 ; К установке режима "тревога"
M25 ;--------- Нарушен датчик двери в дежурном режиме -------------------
CLRF FLAG0 ; Обнулить регистр признаков режима
CLRF FLAG1 ; Обнулить регистр признаков индикации
BSF FLAG0,PRH ; Включить признак изменения режима.
BSF FLAG0,TR0 ; Установить признак режима "тревога0"
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА индикации
BSF FLAG1,INO ; Установить признак индикации -"потушен"
GOTO M02 ; Повторять всё сначала, режим- "тревога0"
M26
BTFSS FLAG0,TR0 ; Признак режима утройства - "тревога0"?
GOTO M30 ; Нет, уточнить дальше текущий режим
;------------- включен признак режима "тревога0" -----------------------
BTFSS FLAG0,PRH ; Признак ИЗМЕНЕНИЯ режима включен?
GOTO M27 ; Нет
BCF FLAG0,PRH ; Обнулить признак изменения режима
MOVF TMR2,0 ;
ADDLW CONI ; Увеличить текущее значение TMR2 на константу для 8с
MOVWF TMRT ; Установить таймер запрета сирены на 8с при входе
GOTO M02 ; Повторять
M27
MOVF TMR2,0 ; Для сравнения TMR2 и TMRB значение TMR2 в W
XORWF TMRT,0 ; Пора включать "сирену"?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M29 ; Нет, результат сравнения не равен нулю
;------------- включение режима "тревога" (включение сирены) --------------
M28
CLRF FLAG0 ; Обнулить регистр флагов режима
BSF FLAG0,PRH ; Включить признак ИЗМЕНЕНИЯ режима
BSF FLAG0,TR ; Включить признак режима "тревога"
CLRF FLAG1 ; Обнулить регистр флагов индикации
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
BSF FLAG1,INO ; Установить признак индикации - "ПОТУШЕН"
GOTO M02 ; Повторять, пока не нажмут долго кнопку "режим"
M29
BTFSS FLAG3,PU ; Проверить, отпущена-ли кнопка "режим"?
GOTO M150 ; Да
BTFSC FLAG3,SST ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
GOTO M02 ; Кнопка "режим" ещё нажата, ждать отпускания
BCF FLAG3,PU ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M150
BTFSS FLAG3,SST ; Проверить, нажата-ли кнопка "режим"
GOTO M02 ; Кнопка "режим" не нажата
M152
CLRF FLAG0 ; Кнопка нажата. Обнулить регистр флагов режима
BSF FLAG0,PRH ; Включить признак ИЗМЕНЕНИЯ режима
BSF FLAG0,TR1 ; Включить признак режима "тревога1"
CLRF FLAG1 ; Обнулить регистр флагов индикации
BSF FLAG1,IPR ; Установить признак ПЕРЕХОДА ндикации
BSF FLAG1,ING ; Установить признак индикации - "ЗЕЛЁНЫЙ"
BSF FLAG1,IMG ; Установить признак МИГАНИЯ индикации
BSF FLAG1,IMB ; Установить признак БЫСТРОГО мигания индикации
GOTO M02 ; Повторять, пока не отпустят кнопку (и TMROFF1]
M30
BTFSS FLAG0,TR1 ; Признак режима устройства - "тревога1"?
GOTO M32 ; Нет. Уточнить дальше текущий режим
;------------- включен признак режима "тревога1" -----------------------
BTFSS FLAG0,PRH ; Включен признак ИЗМЕНЕНИЯ режима?
GOTO M31 ; нет
BCF FLAG0,PRH ; Иначе обнулить признак ИЗМЕНЕНИЯ режима
MOVF TMR2,0 ;
ADDLW CONK ;
MOVWF TMRK ; Установить таймер "TMRK" времени нажатия кнопки
GOTO M02 ;
M31
MOVF TMR2,0 ;
XORWF TMRK,0 ; Закончилось-ли контрольное время нажатия кнопки "реж?
BTFSC STATUS,Z ; Результат сравнения равен нулю?
GOTO M22 ; Да, к установке режима "OFF"
BTFSC FLAG2,PZK ; Запрет 40мс?
GOTO M02 ; Да, подождать
BTFSS PORTB,KR ; Иначе, кнопка "режим" отпущена?
GOTO M02 ; Нет, повторить сначала
GOTO M28 ; Рано отпущена-включить режим "тревога"(сирену)
M32
BTFSS FLAG0,TR ; Признак режима утройства - "тревога"?
GOTO M10 ; Нет, уточнить дальше текущий режим
;--------------обработка включенного режима "тревога" -------------------
BTFSS FLAG0,PRH ; Признак ИЗМЕНЕНИЯ режима включен?
GOTO M33 ; Нет
MOVF TMR2,0 ; Да, установить TMRS0 [40c]
ADDLW CONS ;
MOVWF TMRS0 ;
BCF FLAG3,S1 ; выключить признак прерывистой работы сирены
BCF FLAG0,PRH ; Выключить признак ИЗМЕНЕНИЯ режима
BSF PORTA,SR ; Включить сирену
GOTO M02 ;
M33
BTFSS FLAG3,PU ; Проверить, отпущена-ли кнопка "режим"?
GOTO M330 ; Да
BTFSC FLAG3,SST ; Нет. Проверить фактически, нажата-ли кнопка "режим"?
GOTO M332 ; Кнопка "режим" ещё нажата, продолжить
BCF FLAG3,PU ; Кнопка "режим" отпущена, обнулить ПРИЗНАК НАЖАТОЙ
M330
BTFSC FLAG3,SST ; Проверить, нажата-ли кнопка "режим"
GOTO M152 ; Кнопка "режим" нажата, к установке режима "ТРЕВОГА1"
M332 ; Кнопка "режим" вновь не нажата (или не отпущена)
BTFSS FLAG3,S1 ; Сирена звучит уже больше 40с?
GOTO M34 ; Нет, меньше
MOVF TMR2,0 ; Сирена звучит уже больше 40с
XORWF TMRS1,0 ; Закончилось время переключения сирены 12с?
BTFSS STATUS,Z ; Результат сравнения равен нулю?
GOTO M36 ; Нет
MOVF TMR2,0 ; Да, переустановить TMRS1
ADDLW CONP ;
MOVWF TMRS1 ;
;---------- инвертируем выход управления включением сиреной --------
CLRF TEMP0 ; подготовка к инвертированию бита SR порта A
BSF TEMP0,SR ; TEMP0 обнулен, а место бита SR устанавливаем в "1"
MOVF TEMP0,0 ; грузим в регистр W TEMP0
XORWF PORTA,1 ; исключающее или W и PORTA, результат в PORTA
GOTO M36 ; В результате получилась инверсия бита (SR) порта A
M34
MOVF TMR2,0 ; Для сравнения TMR2 и TMRS0 значение TMR2 в W
XORWF TMRS0,0 ; Сирена звучит уже 40с?
BTFSC STATUS,Z ; Результат сравнения равен нулю?
GOTO M35 ; Да
MOVF TMR2,0 ; Нет. Результат сравнения не равен нулю
ADDLW CONP
MOVWF TMRS1 ; Переустановить TMRS1
GOTO M02 ;
M35
BSF FLAG3,S1 ; Установить признак времени после 20с звуч сирены
M36
BTFSC PORTA,DD ; Датчик двери нарушен?
GOTO M02 ; Да, продолжать звук "сирены"
BCF FLAG3,S1 ; Обнулить признак времени после 20с звучания сирены
MOVLW CONW1 ; Загрузить в W мс запрета проверки датчика двери
; Для устранения эффекта дребезга контактов
CALL PZDD ; Установить запрет (FLAG3,PZD =1 и TMRZW на Wмс)
BCF PORTA,SR ; Выключить сирену
GOTO MM20 ; К установке дежурного режима
END |