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

.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