Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursach_ot.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
616.04 Кб
Скачать

Додаток а Розробка програми на мові програмування Assembler

.include "2313def.inc" ;підключення бібліотеки МК

.list ;генерація лістинга

.def temp=r16 ;іменуємо головний робочий регістр

.def loop1=r17 ;іменуємо регістр першого циклу затримки

.def loop2=r18 ;іменуємо регістр другог циклу затримки

.def loop3=r19 ;іменуємо регістр третього циклу затримки

.def speed=r20 ;іменуємо регістр зміни швидкості

.def count=r21 ;іменуємо регістр змінної для швидкості

.def count1=r22 ;іменуємо додатковий регістр

.cseg ;вибір сегменту програмного коду

.org 0 ;встановлення даного адреса в 0

;---------------------------------------------------------------------

;Ініціалізація програми

rjmp Init

Init:

ldi temp,low(RAMEND) ;вибір вершини стека

out SPL,temp ;запис регістр стека

clr temp ;очищуємо temp

out DDRD,temp ;порт для кнопок

ser temp ;temp=0xff

out DDRB,temp ;порт для светодиодов

out PORTD,temp ;подаємо 1 на виводи порта D

out PIND,temp ;заповнюємо порт D

ldi temp, 0x80

out ACSR,temp ;включаємо компаратор

ldi speed,2 ;початкова швидкість

clr temp ;очищуємо temp

;---------Запуск програми

main:

sbis PIND,PD0 ;перевіряємо стан кнопки, тобто коли нажмуть

rjmp Line ;переходимо до Line

rjmp main ;інакше назад на main

;---------Підпрограма бігаючого вогника

Line:

cpi temp,0 ;перевіряємо чи рівне temp 0

brne m1 ;якщо ні то преходимо на m1

ldi temp,0b00000001 ;інакше задаємо перший світодіод

m1:

out PORTB,temp ;виводимо стан temp в порт В

rcall wt ;преходимо до затримки

lsl temp ;двигаємо біт вліво

brcc PC+2 ;якщо відбувся перехід

ldi temp,0b00000001 ;то задаємо перший світодіод

sbis PIND, PD1 ;перевіряємо кнопку тормозу

rcall Down ;якщо нажата то переходимо до Down

rjmp m1 ;інакше переходимо на m1

;---------Підпрограма зменьшення швидкості в 1,8(1,75) раз

Down:

mov count1,speed ;копіюємо значення швидкості в count1

mov count,speed ;та count

j1:

inc speed ;збільшуємо speed на 1

dec count ;зменшуємо count на 1

cpi count,0 ;чи count=0, якщо ні

brne j1 ;то преходимо на мітку j1, тобто продовжуємо збільшувати speed

j2:

dec speed ;зменьшуємо speed на 1

dec count1 ;зменшуємо count1 на 1

cpi count1,0 ;чи count=0, якщо так

breq Downr ;то преходимо на мітку Downr

dec count1 ;інакше ще зменшуємо count1 на 1

cpi count1,0 ;чи count=0, якщо ні

brne j2 ;то преходимо на мітку j2, тобто зменьшуємо speed на 1/4

Downr:

sbis PIND,PD1 ;чекаємо доки відіжмуть кнопку

rjmp Downr

rjmp wt ;преходимо до затримки

;--------Підпрограма затримки

wt:

push loop1 ;встановлюємо в стек loop1

push loop2 ;встановлюємо в стек loop2

push loop3 ;встановлюємо в стек loop3

mov loop3, speed ;встановлюємо швидкість

wt1:

dec loop3 ;зменьшуємо loop3 на 1

breq wt4 ;якщо loop3=0, то преходимо на wt4

ldi loop2,100 ;інакше задаємо loop2

wt2:

dec loop2 ;зменьшуємо loop2 на 1

breq wt1 ;якщо loop2=0, то преходимо на wt1

ldi loop1,100 ;інакше задаємо loop1

wt3:

dec loop1 ;зменьшуємо loop2 на 1

brne wt3 ;якщо loop1=0, то преходимо на wt3

rjmp wt2 ;інакше преходимо на wt2

wt4:

pop loop1 ;зчитуємо з стека в loop1

pop loop2 ;зчитуємо з стека в loop2

pop loop3 ;зчитуємо з стека в loop3

ret ;повертаємося із підпрограми

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]