Пользователь
Регистрация: 24.02.2014
Сообщений: 12
|
Одна программка на ассемблере
Всем доброго дня!
По сути одна не сложная задачка, по-тиху выносящая мозг.
Суть темы: нужна программа для работы сигнализации построенной на atmel 8051. Алгоритмы вроде написал - препод одобрил. Единственное не очень понял "ввод кода" (но это уж он так захотел). Нарыл вполне вменяемый текст программы аналогичного устройства, пытался править входы выходы, но прога сразу перестает работать. Прошу помощи кто чем сможет. Спасибо.
Код:
dseg
door_code equ r0 ;массив введённых значений
attempts equ 38h ;переменная – число попыток ввода
cseg
org 00h
ajmp main
org 0bh
ajmp timer0
org 100h
main:
anl p2,#1h ;выключение светодиода и динамика
mov ie,#82h ;разрешаем прерывания от таймера
mov tmod,#1h ;задаём режим таймера – 16 бит
mov door_code,#30h ;задание адреса для вводимых цифр кода
mov attempts,#3h ;количество попыток
sjmp ent1 ;переход к началу главного цикла
enter_digit: ;обработка введённого значения
mov @door_code,a ;запоминаем цифру
inc door_code ;переходим к след. адресу
mov a,door_code
call delay2
cjne a,#36h,ent1 ;проверяем,все ли цифры введены (из 6)
ajmp compare ;переход к сравнению кодов
ent0: ;ввод 0
mov p0,#0f7h
jb p0.5,ent1
call delay2
mov a,#0h
wait0:
jnb p0.5,wait0
ajmp enter_digit
ent9: ;ввод 9
jb p0.6,ent0
call delay2
mov a,#9h
wait9:
jnb p0.6,wait9
ajmp enter_digit
ent1: ;ввод 1
mov p0,#0feh ;устанавливаем 0 на выходе P0.0
jb p0.4,ent2 ;если не нажата кнопка, к след. кнопке
call delay2 ;ждём, пока пройдёт дребезг контактов
mov a,#1h ;запоминаем введённую цифру
wait1:
jnb p0.4,wait1 ; ждём, пока отпустят кнопку
ajmp enter_digit ;переход к обраб. введённого значения
ent2: ;ввод 2
jb p0.5,ent3
call delay2
mov a,#2h
wait2:
jnb p0.5,wait2
ajmp enter_digit
ent3: ;ввод 3
jb p0.6,ent4
call delay2
mov a,#3h
wait3:
jnb p0.6,wait3
ajmp enter_digit
ent4: ;ввод 4
mov p0,#0fdh
jb p0.4,ent5
call delay2
mov a,#4h
wait4:
jnb p0.4,wait4
ajmp enter_digit
ent5: ;ввод 5
jb p0.5,ent6
call delay2
mov a,#5h
wait5:
jnb p0.5,wait5
ajmp enter_digit
ent6: ;ввод 6
jb p0.6,ent7
call delay2
mov a,#6h
wait6:
jnb p0.6,wait6
ajmp enter_digit
ent7: ;ввод 7
mov p0,#0fbh
jb p0.4,ent8
call delay2
mov a,#7h
wait7:
jnb p0.4,wait7
ajmp enter_digit
ent8: ;ввод 8
jb p0.5,ent9
call delay2
mov a,#8h
wait8:
jnb p0.5,wait8
ajmp enter_digit
code_wrong: ;обработка неверного кода
mov door_code,#30h ;возвращаемся к началу массива
djnz attempts,ent1 ;если есть ещё попытки, в гл. цикл
setb p2.1 ;включение звукового сигнала
call delay ;задержка 1 с
clr p2.1 ;выключение звукового сигнала
mov attempts,#4h ;восстан. число попыток
jmp code_wrong
compare: ;сравнение кодов
dec door_code ;переходим к предыдущей цифре
cjne @door_code,#6h,code_wrong;проверяем 6-ю цифру и далее все
dec door_code ;цифры по порядку
cjne @door_code,#5h,code_wrong
dec door_code
cjne @door_code,#4h,code_wrong
dec door_code
cjne @door_code,#3h,code_wrong
dec door_code
cjne @door_code,#2h,code_wrong
dec door_code
cjne @door_code,#1h,code_wrong
clr p2.0 ;открыть замок
setb p2.2 ;включить светодиод
mov attempts,#3h ;восстан. кол-во попыток
wait_open:
jnb p0.7,wait_open ;ждём, пока откроется дверь
call delay2
wait_close:
jb p0.7,wait_close ;ждём, пока закроется дверь
setb p2.0 ;закрыть замок
clr p2.2 ;выключить светодиод
ajmp ent1 ;переход в гл. цикл
timer0: ;обработка прерывания от T0
clr tcon.4
clr tcon.5
reti
delay: ;задержка 1 с
mov r1,#1fh
loop1:
mov th0,#0h
mov tl0,#0h
setb tcon.4
loop2:
jb tcon.4,loop2
djnz r1,loop1
ret
delay2: задержка 5 мс
mov r3,#13h
loop4:
mov r2,#0ffh
loop3:
djnz r2,loop3
djnz r3,loop4
ret
end
|