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

         ldi F reqConst,Note_7

         ldi BeepDuration,1

         rcall Beep

         ldi FreqConst,Note_5

         ldi BeepDuration,1

         rcall Beep

         ldi FreqConst,Note_3

         ldi BeepDuration,1

         rcall Beep

         ldi FreqConst,Note_5

         ldi BeepDuration,1

         rcall Beep

EndRing:

         clt; Сбрасываем флаг нажатия клавиши

NoRing:

         ret

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

Beep_Declass="underline" ; Короткая пауза перед нотой и сама нота

         ldi BeepVar,50

Del2: clr DelayVar

Del1: dec DelayVar

         brne Del1

         dec BeepVar

         brne Del2

         cli

         rjmp Beep

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

; Сканирование клавиатуры: установка на выходных линиях заданного кода и прием

; ответа вызывается из функции GetKey

GetKeyAnswer:

        mov Key,r31

        andi Key,$0F

        out PORTB,Key

        clr DelayVar

Delay1: dec DelayVar

        brne Delay1

        in Key,PINB

        com Key

        andi Key,$70;Если что-то было найдено, флаг Z не нулевой

        ret

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

; Запись события EventType в текущую ячейку EEPR0M памяти и обнуление времени

WrireEEPROM:

        ; Поиск последней записи

        clr tmp

        ldi EEadr,2

FincNextAdr:

        out TCNTO,ZerReg; Пока не сработал таймер, читающий из EEPROM (через 300 мс). все операции должны быть завершены

        subi EEadr, — 2

        cpi EEadr,62

        brne EERead

        ldi EEadr,4; Если дошли до 64-ro адреса, начинаем с начала

EERead

        sbic EECR,EEWE; Ждем обнуления бита EEWE

        rjmp EERead

        out EEAR,EEadr; Подготавливаем адрес

        sbi EECR,EERE; Устанавливаем бит для синхронизации

        sbi EECR,EERE; Дважды

        in r31,EEDR; Читаем данные

        dec tirp; Если было 256 неудачных попыток найти бит

       breq NoZav; признак последней записи, значит, его нет вообще, значит, пишем по любому адресу

        sbrs r31,0

        rjmp FindNextAdr

NoZav: andi r31,$FE

EEWrite0:; Запись дня сброса флага, указывающего на последнюю запись

        sbic EECR,EEWE

        rjmp EEWrite0

        out EEAR,EEadr

        out EEDR,r31

        sbi EECR,EEWE

        inc EEadr

EEWrite1:; Запись старшего байта времени

        sbic EECR,EEWE

        rjmp EEWrite1

        out EEAR,EEadr

        out EEDR,Time2

        sbi EECR,EEWE

        inc EEadr

EEWrite2:; Запись времени, типа события и флага последней записи

        sbic EECR,EEWE

        rjmp EEWrite2

        out EEAR,EEadr

        mov r31,Time1

        andi r31,SF8

        or r31,EventType

        out EEDR,r31

        sbi EECR,EEWE

        clr Time1; Счетчик считает время между записями в EEPROM,

        clr Time2; поэтому сбрасываем его

        ret

.EXIT

; Таблица использования линий микроконтроллера

; Порт В используется для подключения клавиатуры и динамика

; PORTB,7 — вывод на динамик

; PORTB,0…3 — выходы на сканирование клавиатуры

; PORTB,4…6 — входы от 12-клавишной клавиатуры, подключены к +5 В через резисторы

; Порт D используется для управления замком, выдачи информации и проверки двери

; PORTD.0 используется для вывода информации из ЕЕРАОН, на нем с частотой

; 3815 Гц (@ 1МГц) побитно выводится все ее содержимое

; PORTD.1 Подключен на электромагнит или двигатель, единица разрешает открытие

; PORTD.2 Подключен на концевику, срабатывающему (=0) при открытии

Автор: Сафонников В. В. (E-maiclass="underline" sw@ufanet.ru).

6.12. Музыкальный звонок

1. Краткое описание

Эта схема музыкального звонка собрана на микроконтроллере, может быть, это похоже на «забивание гвоздей логарифмической линейкой», тем не менее у нее есть некоторые преимущества. Во-первых, используется всего одна микросхема, благодаря чему, кроме традиционных преимуществ вроде увеличения надежности, уменьшения потребления энергии, появляется принципиальная возможность разместить всю схему в очень небольшом объеме, например оформив в виде музыкальной поздравительной открытки.