Главная  Микроконтроллеры 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

; Вывод бита на внешний вывод порта и запись события в EEPROH Idi EventTypB,evDen ied bst Flags,0 brtc PasswordDenied sbi PORTD.1 ;

Idi EventType, evPassed

Если пароль совпал, включаем соленоид

PasswordDenied:

rcall WrireEEPROM

; Открытие двери при совпадении кода или цикл ожидания при ошибке Idi Key,5 OpenLoop:

rcall DelaylOO

Idi BeepDu rat ion, Time 7/2

Idi FreqConst,Note 7

rcall Beep

dec Key

sbic PIND,2 ; Если сработал концевик (открылась дверь), то выходим

brne OpenLoop ; или выходим из цикла по тайм-ауту

cbi PORTD, 1 ; Отключаем соленоид

; Нажатие на клавишу NewPassKey в этом месте приводит к загрузке

rcall GetKey

brtc MainLoop

cpi Key,NewPassKey

brne MainLoop

sbrs Flags,0

rjmp MainLoop

; Ввод нового секретного кода. Idi FreqConst.Note 3 Idi BeepDuration, 20 rcall Beep

Idi FreqConst,Note 5 Idi BeepDuration,20 rcall Beep

Idi FreqConst,Note 7 Idi BeepDuration, 20 rcall Beep rcall DelaylOO

NewPassword:

clr LastKey clr гЗО clr Г31

NewPassLoop:

rcall GetKey brtc NewPassLoop cp Key. LastKey breq NewPassLoop cpi Key,KeyEnter breq NewPassword mov LastKey,Key

нового секретного кода

Если старый был предъявлен верно

Проигрывание "приглашения" изменения пароля

Ожидаем нажатия клавиши

Если клавиша еще не отпущена, продолжаем цикл

; Если сброс, начинаем ввод строки с начала



Beep0uration,2«10

FreqConst,2»FreqKeyPressed

rcall

Beep

Удлиненный звуковой сигнал

Z,Key

Сохраняем введенную цифру

гЗО,KeyLen

Длина секретного кода

brne

NewPassLoop

rcall

DelaylOO

FreqConst, Note 7

; Проигрывание мелодии, говорящей

8eepDuration,20

; успешном изменении пароля

rcall

Beep

FreqConst,Note 5

BeepDuration, 20

rcall

Beep

FreqConst,Note 3

Beep0uration.20

rcall

Beep

rjmp

MainLoop

Дальше идут процедуры, вызываемые из основной программы

Веер:

Idi BeepVar,20 Beepi: mov DelayVar,FreqConst Delay2: rjmp NopJmpI NopJmp1;dec DelayVar brne Delay2 sbi PORTB,7 mov DelayVar FreqConst Delay3: rjmp NopJmp2 NopJmp2:dec DelayVar brne Delay3 PORTB,7 BeepVar Beepi

BeepDuration Beep

Выдача звукового сигнала

1 + = 5 мкс

cbi dec brne dec brne sei ret

: Задержка на время порядка секунды DelaylOO:

Idi BeepDuration,3

D100 3: clr FreqConst

D100 2: clr DelayVar

D100 1: dec DelayVar

brne D100 1



FreqConst

brne

D100 2

BeepDuration

brne

D100 3

: Проверка приема данных от клавиатуры

GetKey:

; Сброс признака, что была нажата клавиша

r31,$0E

; Младшая тетрада - запрос в порт, старшая -

rcall

GetKeyAnswer

; смещение ответа

brne

KeyPressed

r31.$3D

rcall

GetKeyAnswer

brne

KeyPressed

r31.$6B

rcall

GetKeyAnswer

brne

KeyPressed

r31.$97

rcall

GetKeyAnswer

brne

KeyPressed

KeyPressed:

swap

andi

r31.$0F

swap

andi

Key.$07

CCFind:

inc r31

; Поиск, какой конкретно бит установлен

brcc

CCFind

breq

NoMuI

; Если нажато несколько клавиш, то не нажата ни одна

NoMul:

mov Key,r31

; Проверка.

нажата ли кнопка Ring, если нажата, то будет выдан звуковой сигнал

: без сообщения об этом вызывающей функции

Key,KeyRing

breq

Ring

rjmp

NoRing

Ring- sbrc

KeyPass1,0

; Выбор типа мелодии в зависимости от четности

rjmp

SimpleRing

; старшей цифры секретного кода

rcall DelaylOO

; Проигрываем сложную мелодию (Отговорила роща золотая) ;1 ми 1/8

Idi FreqConst,Note mi1

Idi BeepDuration,2.DURATI0N/Note mi1

rcall Beep Del ;1 ми 1/8

Idi F reqConst, Note mi1



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

0.0016