Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МвСУ_16.11.2011.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
6.76 Mб
Скачать

3.3. Язык Ассемблера

Прежде чем начать разработку какого-либо устройства на базе МК очень важно познакомиться с основами программирования на языке Ассемблера.

Чтобы процесс изучения языка, написание и отладка программ на Ассемблере был более простым и понятным, используется два приема. Первый – визуализация процедур выполнения команд процессором. Второй – использование методов структурного программирования, чтобы сделать программы более простыми для чтения и понимания.

Например, формат команды MOV:

Метка: MOV Операнд1, Операнд2 ;комментарии

Алфавит Ассемблера включает большие и малые буквы латинского алфавита, символ подчеркивания (который также считается буквой), цифры и спецсимволы. По умолчанию различий между большими и малыми буквами не делается. Буквы кириллицы допустимы только в комментариях и в значениях символьных переменных и констант.

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

Формат команды:

Метка: Мнемокод Операнды ;Комментарий

Формат директивы:

Имя Мнемокод Операнды ;Комментарий

Визуализацию выполнения команд лучше всего осуществить, используя структурную схему МП или МК, на которой отмечается прохождение данных при выполнении каждой команды. В результате обеспечивается хорошее визуальное представление процесса выполнения команд.

Далее представлен листинг программы на языке ассемблера для МК AVR, которая включает светодиод при нажатии кнопки.

;***** Демонстрация использования светодиодов и кнопок в составе STK500

.include "8515def.inc"

.def Temp =r16 ; Регистр хранения временных данных

.def Delay =r17 ; Переменная 1 для генерации задержки

.def Delay2 =r18 ; Переменная 2 для генерации задержки

;***** Инициализация

RESET:

ser temp

out DDRB, temp ; Настройка порта В (PORTB) на вывод

;**** Тестирование ввода/вывода

LOOP:

out PORTB,temp ; Обновление состояния светодиодов

sbis PIND,0x00 ; Если PortD.0 = 0,

inc temp ; то уменьшение на 1 двоичного кода, формируемого свечением светодиодов

sbis PIND,0x01 ; Если PortD.1 = 0,

dec Temp ; то увеличение на 1 двоичного кода, формируемого свечением светодиодов

sbis PIND,0x02 ; Если PortD.2 = 0,

ror Temp ; то циклический сдвиг состояния светодиодов на 1 вправо

sbis PIND,0x03 ; Если PortD.3 = 0,

rol Temp ; то циклический сдвиг состояния светодиодов на 1 влево

sbis PIND,0x04 ; Если PortD.4 = 0,

com Temp ; то инверсия состояния всех светодиодов

sbis PIND,0x05 ; Если PortD.5 = 0,

neg Temp ; то инверсия состояния и прибавление 1

sbis PIND,0x06 ; Если PortD.6 = 0,

swap Temp ; то обмен тетрадами светодиодов

;**** Далее необходима задержка, чтобы сделать проделанные изменения видимыми

DLY:

dec Delay

brne DLY

dec Delay2

brne DLY

rjmp LOOP ; Повторение цикла заново

Применение некоторых методов структурного программирования делает ассемблерные программы более удобными для чтения.

Один из этих методов заключается в том, чтобы разделять функциональные блоки программного текста пустыми строками.