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