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