.EOU Time_1=1000/Note_1
.EOU Time_2=1000/Not e_2
.EOU Time_3=1000/Note_3
.EOU Time_4=1 000/Not e_4
.EOU Tinve_5=1000/Note_5
.EOU Time_6=1000/Note_6
.EOU Time_7=1000/Note_7
.DEF KeyPass=r0
.DEF tmp=r0
.DEF KeyPass1=r1
.DEF KeyPass2=r2
.DEF KeyPass3=r3
.DEF KeyPass4=r4
.DEF KeyPass5=r5
.DEF SSRE6=r6
.DEF DelayVar=r7
.DEF IntUse0=r8
.DEF LastKey=r9
.DEF ZerReg=r10
.DEF Time0=r16; Время, увеличивается 3815 раз в секунду
.DEF Time1=r17; Время, увеличивается раз в 67 секунд
.DEF Time2=r18; Время, увеличивается раз в 47721 час,
; насыщается за 50 суток
.DEF EEadr=r20; Адрес для записи в EEPROM, равен 255.
; если в текущий момент запись не производится
.DEF EventType=r21
.OEF BeepVar=r21
.DEF TimerEEByte=r22
.DEF TimerEEBit=r23
.DEF Key=r24
.DEF BeepDuration=r25
.DEF FreqConst=r26
.DEF IntUse1=r27
;.DEF PassLoopCounter=r28
.DEF Flags=r29
; bit 0 — Password accepted
.ORG 000
clr ZerReg
rjmp RESET
.ORG 002
;======================
; Здесь оказываемся при возникновении прерывания от таймера 3 раза в секунду
;======================
; Таймер используется как RTC и для вывода информации EEPR0N
; Увеличение счетчика времени
in SSREG.SREG
subi Time0,1
adc Time1,ZerReg
абс Time2,ZerReg
brcc TimeOk
com Time1; Если проело переполнение, счетчик времени остановлен
com Time2
TimeOk:
;Чтение данных из EEPROM и выдача на внешний порт.
;Процедура обработки прерывания будет вызвана не раннее, чей через 300-3∙4 мс
;после последнего обращения к EEPROM, поэтому проверка готовности EEPROM не
;производится, она должна быть уже готова.
andi TimerEEByte,$3F
out EEAR,TiirerEEByte
sbi EECR,EERE;set EEPROH Read strobe
sbi EECR,EERE;set EEPROH Read strobe 2nd time
in IntUse0,EEDR;get data
andi TimerEEBit,7
brne Bitlop
inc TimerEEByte
Bitlop: inc TimerEEBit; =1.8
mov IntUsel, TimerEEBit
rol IntUse0
BitShift:; Выбираем посылаемый бит
ror IntUse0; Используется как текущий считанный EEPROM байт
dec IntUse1; Используется как счетчик
brne BitSbift
in IntUse1,PORTD
bst IntUse0,0
bid IntUse1,0
out PORTD,IntUsel
out SREG.SSREG
reti
;===============
;Здесь оказываемся при включении питания схемы
;===============
RESET:
;Настройка микросхемы и программы.
Idi r31,$8F; Настраиваем направление работы портов
out DDRB,r31
ldi r31,$03
out DDRD,r31
ldi r31,$05; Настраиваем таймер
out TCCRO,r31
ldi r31,$02
out TIMSK,r31; Разрешаем прерывания при переполнении таймера
ldi r31.2
mov KeyPass1,r31 ; Загружаем пароль по умолчанию
ldi r31,3
mov KeyPass2,r31
ldi г31.2
mov KeyPass3,r31
ldi r31,3
mov KeyPass4,r31
ldi r31,2
clr Time1; Сбрасываем счетчик времени
clr Time2
rcall WrireEEPROM
sei; Разрешаем прерывания
Mainloop:
; Подготавливаемся к вводу пароля.
clr r30,0
clr r31,0
ori Flags,1; При предъявлении пароля пока ошибок не было
clr KeyPass
clr LastKey
Passloop:; Цикл ввода пароля
rcall GetKey; Записывает в переменную Key код нажатой клавиши
brtc Passloop; и устанавливает бит Т, если клавиша нажата
cp Key,LastKey
breq Passloop; Если предыдущая клавиша еще не отпущена
cpi Key,KeyEnter