Перейти к содержанию

Программа на ассемблере.


Рекомендуемые сообщения

Я написал прогамму на ассемблере для AVR 4.

Нужно, чтобы при запуске данной программы на рабочем макете при нажатой первой кнопки загорелся первый светоиод, при нажатии второй кнопки первый светодиод потух а второй светодиод загорелся и так далее в любой последовательности для восьми кнопок (01234567).

Помогите упростить ее.

 

.include "8515def.inc"

.def Temp=r16;

.def Null=r17;

ldi Null,0b0;

rjmp START

 

START: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

out ddrb,Null;

rjmp START;

 

OUTLED: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b1;

out ddrb,Temp;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp OUTLED;

 

SECOND: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b10;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp SECOND;

 

THIRD: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b100;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp THIRD;

 

ASAS: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b1000;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp ASAS;

 

ZZZZ: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b10000;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp ZZZZ;

 

AAAA: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b100000;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd6;

rjmp QQQQ;

sbis pind,pd7;

rjmp WWWW;

rjmp AAAA;

 

QQQQ: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b1000000;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd7;

rjmp WWWW;

rjmp QQQQ;

 

WWWW: Как этот цикл можно преобразовать, при это чтобы работал также. Если можно с коментариями

ldi Temp,0b10000000;

out ddrb,Temp;

sbis pind,pd0;

rjmp OUTLED;

sbis pind,pd1;

rjmp SECOND;

sbis pind,pd2;

rjmp THIRD;

sbis pind,pd3;

rjmp ASAS;

sbis pind,pd4;

rjmp ZZZZ;

sbis pind,pd5;

rjmp AAAA;

sbis pind,pd6;

rjmp QQQQ;

rjmp WWWW;

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Программа очень простая

вариант, когда светодиод загорается только при нажатии на соответствующую кнопку:

.def temp=r16; назначает регистру r16 имя temp
;====================================================
; Начало программы
.cseg		; начало сегмента
.org 0			 ; начало первой строки программы

; ====================================================

clr temp; обнуляет регистр temp
out DDRB,temp; переводит все биты порта B на ввод
ser temp; устанавливает все биты регистра temp  в 1
out DDRA,temp; переводит все биты порта A на вывод
out PortB,temp; подключает подтягивающие резисторы к порту B		  

Loop: 
in temp,PinB; считывает значение порта B
com temp; инвертирует значение порта В 
out PortA, temp; переводит результат в порт A
rjmp Loop; Возвращает к метке Loop,  и повторяет все с начала...

 

вариант, когда светодиол продолжает гореть после отпускания кнопки, и горит до нажатия другой кнопки:

.def temp=r16		; назначает регистру r16 имя temp
;====================================================
; Начало программы
.cseg				; начало сегмента
.org 0			   ; начало первой строки программы

; ====================================================

clr temp		; обнуляет регистр temp
out DDRB,temp	; переводит все биты порта B на ввод
ser temp		; устанавливает все биты регистра temp  в 1
out DDRA,temp	; переводит все биты порта A на вывод
out PortB,temp	; подключает подтягивающие резисторы к порту B		  

Loop: 
in temp,PinB	; считывает значение порта B
com temp		; инвертирует значение регистра temp
breq Loop		; если регистр temp обнуляется, то переход в начало... 
out PortA, temp	; если нет, то переводит результат в порт A
rjmp Loop		; Возвращает к метке Loop,  и повторяет все с начала...

 

схема подключения:

post-10514-1414086989_thumb.jpg

Изменено пользователем galrad
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...