Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2015, 14:22   #1
@ngel111
Пользователь
 
Регистрация: 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
Изображения
Тип файла: jpg Алг. раб. таймера.jpg (24.8 Кб, 118 просмотров)
Тип файла: jpg Ввод кода.jpg (59.3 Кб, 116 просмотров)
Тип файла: jpg Принципиальная схема.jpg (78.8 Кб, 111 просмотров)
Тип файла: jpg Работа программы.jpg (35.0 Кб, 110 просмотров)
Тип файла: jpg Структурная схема.jpg (40.8 Кб, 110 просмотров)
@ngel111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программка на ассемблере tiernahrung Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 03.03.2012 13:39
Еще одна программка airesjke Visual C++ 9 30.10.2011 17:28
нужна программка на ассемблере Святойspb Фриланс 1 24.05.2010 20:42
программка на Ассемблере Flora0 Помощь студентам 0 02.01.2010 19:13