МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота № 3
на тему:
«Робота з переферією LED-індикатора»
«Робота з панеллю кнопок»
Мета роботи: ознайомитися із командами мови програмування Assembler та принципами керування мікроконтролерами.
Основні теоретичні відомості
Асемблер (assembler) — система програмування, яка включає мову асемблера та транслятор з цієї мови. Є мовою програмування низького рівня. Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається, що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, оскільки програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку програми написані на асемблері компактні та швидкі.
Асемблер підтримує безліч директив. Директиви не транслюються безпосередньо в коди операції. Навпаки, вони використовуються, щоб коригувати місце розташування програми в пам'яті, визначати макрокоманди, ініцілізувати пам'ять і так далі. Тобто це вказівки самому ассемблеру, а не команди мікроконтролера. Всі директиви асемблера наведені в табл. 1.2.
Таблиця 1.2. Директиви асемблера
Директива
Опис
BYTE
Зарезервувати байт під змінну
CSEG
Сегмент кодів
DB
Задати постійним (и) байт (и) в пам'яті
DEF
Задати символічне ім'я регістру
DEVICE
Задати для якого типу мікроконтролера компілювати
DSEG
Сегмент даних
DW
Задати постійне (і) слово (а) в пам'яті
EQU
Встановіть символ рівний вираженню
ESEG
Сегмент EEPROM
EXIT
Вихід з файлу
INCLUDE
Включити вихідний код з іншого файлу
LIST
Включити генерацію .lst - файлу
NOLIST
Вимкнути генерацію .lst - файлу
ORG
Початкова адреса програми
SET
Встановіть символ рівний виразу
Синтаксис всіх директив наступний: . [Директива] Тобто перед директивою повинна стояти крапка. Інакше асемблер сприймає це як мітку. Дамо кілька пояснень найбільш важливим директивам асемблера
Код програми:
;-----------------— test program —----------DSEG ; створюємо сегмент даних;зарезервуємо в SRAM початкові адреси програми 20H, 30H, 60HORG 20H ; ...ORG 30h; ; ...ORG 60H Stack: DS 20H ; встановлюємо стек на адресі 20HCSEG ; початок сегменту кодів;декларація адресORG 0000H jmp start ORG 0003Hreti ORG 000BHreti ORG 0013Hreti ORG 001BHreti ORG 0023Hreti ORG 0030H;----------------------------------------------------Start:mov sp, #(stack-1)mov p0, #11111111Bmov p1, #11111111Bmov p2, #11111111Bmov p3, #11111111Bmov DPTR, #0A006hmov A, #00000001B;#####################################;## Main ##;#####################################MAIN:movx @DPTR, A ; вводимо в регістр DPTR адресу індикаціїcall knopka1 ; запуск функції для першої кнопкиrl A ; рух світла діодів в ліву сторонуcall knopka2 ; запуск функції другої кнопкиjmp m4 ; стрибок до мітки 4m4:call Delay ; викликаємо функцію затримкиjmp MAIN ; стрибок до мітки MAIN;-------------------------------------------------------; Procedures;-------------------------------------------------------knopka1: ; функція натискання кнопки 1jb p3.2,m1 ; перевірка натискання кнопки 1, якщо кнопка натиснута - перехід до мітки 1m1:rr A ; рух світла діодів вправоknopka2: ; функція натискання кнопки 2jb p3.3,m3 ; перевірка чи натиснута перша кнопка 2, якщо вірно - перехід на мітку 3mov r3,#033h ; записуємо в r3 значення 33m3:mov r3,#066h ; записуємо в r3 значення 66Delay: ; функція затримкиpush 2 ; вставляємо в стек значення з регістру 2 (поміщається першим)push 3 ; вставляємо в стек значення з регістру 3 (поміщається першим)d_m2:mov r2,#0ffh ; записуємо в r3 значення 0ffd_m1:djnz r2,d_m1 ; декремент і перехід, якщо значення рівне 0, містить 2 циклиdjnz r3,d_m2 ; цикл затримки іпульсу за рахунок регістра зсувуpop 3 ; виймаємо зі стеку значення, і поміщаємо в рег...