Выбрать главу

         breq MainLoop; Если нажат сброс, начинаем ввод строки с начала

         ldi FreqConst,FreqKeyPressed

         ldi BeepDuration,5

         rcall Beep; Выдача короткого звукового сигнала

         mov LastKey,Key

         inc r30

         ld KeyPass.Z

         cpse Key,KeyPass; Сравниваем введенную цифру и цифру пароля из ОЗУ.

         andi Flags,~1; если ошибка, сбрасываем бит успешности пароля.

         cpi r30,Keylen; Длина секретного кода.

         brne PassLoop

         ; Вывод бита на внешний вывод порта и запись события в EEPROM

         ldi EventType,evDenied

         bst Flags,0

         brtc PasswordDenied

         sbi PORTD,1; Если пароль совпал, включаем соленоид

         ldi EventType,evPassed

PasswordDenied:

         rcall WrireEEPROW

          ; Открытие двери при совпадении кода или цикл ожидания при ошибке

          ldi Key,5

Openloop:

          rcall Delay100

          ldi BeepDuration,Time_7/2

          ldi FreqConst,Note_7

          rcall Beep

          dec Key

      sbic PIND,2; Если сработал концевик (открылась дверь), то выходим

          brne Openloop; или выходим из цикла по тайм-ауту

          cbi PORTD,1; Отключаем соленоид

          ; Нажатие на клавишу NewPassKey в этой месте приводит к загрузке

          rcall GetKey; нового секретного кода

          brtc NainLoop

          cpi Key,NewPassKey

          brne Mainloop

          sbrs Flags,0; Если старый был предъявлен верно

          rjmp Mainloop

;Ввод нового, секретного кода,

          ldi FreqConst,Note_3;Проигрывание "приглашения" для изменения пароля

          ldi BeepDuration,20

          rcall Beep

          ldi FreqConst,Note_5

          ldi BeepDuration,20

          rcall Beep

          ldi FreqConst.Note_7

          ldi BeepDuration,20

          rcall Beep

          rcall Delay100

NewPassword:

          clr LastKey

          clr r30

          clr r31

NewPassLoop:

          rcall GetKey

          brtc NewPassLoop; Ожидаем нажатия клавиши

          cp Key,LastKey

          breq NewPassLoop; Если клавиша еще не отпущена, продолжаем цикл

          cpt Key,KeyEnter

          breq NewPassword; Если сброс, начинаем ввод строки с начала

          mov LastKey,Key

          ldi BeepDuration,2*10

          ldi FreqConst,2*FreqKeyPressed

          rcall Beep; Удлиненный звуковой сигнал

          inc r30

          St Z,Key; Сохраняем введенную цифру

          cpi r30,Keylen; Длина секретного кода

          brne NewPassLoop

          rcall Delay100

          ldi FreqConst,Note_7; Проигрывание мелодии, говорящей об

          ldi BeepDuration,20; успешной изменении пароля

          rcall Beep

          ldi FreqCoost, Note_5

          ldi BeepDuration,20

          rcall Beep

          ldi FreqConst,Note_3

          ldi BeepDuration,20

          rcall Beep

          rjmp MainLoop

;==============

;Дальше идут процедуры, вызываемые из основной программы

;==============

Веер:; Выдача звукового сигнала

          ldi BeepVar,20

Beep1: mov DelayVar.FreqConst

Delay2: rjmp NopJmp1; 2 +

NopJmp1:dec DelayVar; 1 + = 5 мкс

          brne Delay2;2 +

          sbi P0RTB.7

          mov DelayVar.FreqConst

Delay3: rjrep NopJmp2

NopJmp2:dec DelayVar

          brne Delay3

          cbi P0RTB.7

          dec BeepVar

          brne Beep1

          dec BeepDuration

          brne Beep

          sei

          ret

;================

; Задержка на время порядка секунды

Delay100:

          ldi BeepOuration,3

D100_3: clr FreqConst

D100_2: clr DelayVar

D100_1: dec DelayVar