який повинен реалізувати операцію віднімання двох чисел на базі мікроконтролера PIC16F8х. Одне число знаходиться в регістрі загального призначення, а інше в акумуляторі. Якщо результат дорівнює нулю то нарости вміст на одиницю, а якщо не дорівнює нулю то записати його в акумулятор.
2. Спеціальна частина
2.1 Вибір і опис способу адресації
У мікроконтролера існує три види адресації регістрів ОЗУ.
Безпосередня адресація - Байт даних (операнд команди) з машинної команди завантажується в регістр акумулятор.
Пряма адресація - Адреса регістра ОЗУ, який зберігає дані для виконання операції, вказаний в машинній команді, а його два старші біта вказані в регістрі STATUS АЛП.
Об'єднання 7міразрядного адреси з машинного команди і двох старших біт формує 9тіразрядний адресу.
Непряма адресація - Адреса регістра ОЗУ, який зберігає дані для виконання операції, заноситься в спеціалізований регістр адреси, а його один старший біт в регістр STATUS АЛП. Об'єднання 8міразрядного числа і старшого біта формує 9тіразрядний адресу. Потім з даними виконується необхідна операція через спеціалізований регістр даних.
У відповідності з технічним завданням для реалізації поставленої задачі обраний непрямий спосіб адресації даних.
. 2 Розробка програми відповідно до завдання
list p=16F84A; Тип використовуваного мікроконтролера.
; Підключається файл з описом основних регістрів мікроконтролера.
include p16f84a.inc raquo ;;
; Налаштування слова конфігурації мікроконтролера.
2007__config_CP_OFF ?? amp; _WDT_OFF amp; _PWRTE_ON amp; _RC_OSC, 11 1111 1111 00110Ch; 0000 1100 Осередок РОН для першого числа.
tempequ0Dh; 0000 1101 Осередок РОН для тимчасового збереження.
org0000h; Вектор скидання.
gotoinit; 10 1000 0000 0101 Перехід на цикл ініціалізації.
org0005h; Вектор початку ініціалізації.
init; Цикл ініціалізації.
bcfstatus, irp; 01 0011 1000 0011 Скидання біта непрямої адресації.
clrfporta; 00 0001 1000 0101 Очищення вхідний засувки PORT А.
clrfportb; 00 0001 1000 0110 Очищення вхідний засувки PORT В.
bsfstatus, rp0; 01 0110 1000 0011 Перехід до старшого банку регістрів.
movlwb 11111111; 11 0000 1111 1111 Налаштування стану портів.
Amovwftrisa; 00 0000 1000 0101 Записати його в регістр управління TRIS А.
Bmovwftrisb; 00 0000 1000 0110 Записати його в регістр управління TRIS В.
Cmovlwb 10000000; 11 0000 1000 0000 Налаштування TMR0 і PullUp - резисторів.
Dmovwfoption_reg; 00 0000 1000 0001 Записати його в регістр управління TMR0.
Ebcfstatus, rp0; 01 0010 1000 0011 Перехід до молодшого банку регістрів.
Fmovlw3Ch; 11 0000 0011 1100 Задати зменшуване в акумуляторі.
movwfone; 00 0000 1010 1100 Занести його в РОН.
movlw2Ch; 11 0000 0010 1100 Задати від'ємник в акумуляторі.
movwftemp; 00 0000 1000 1101 Зберегти від'ємник в тимчасовій комірці РОН.
movlw0Ch; 11 0000 0000 1100 Задати адреса для непрямої адресації.
movwffsr; 00 0000 1000 0100 Записати цю адресу в регістр адреси.
movftemp, w; 00 1000 0000 1101 Відновити від'ємник з тимчасової осередки.
subwfindf, f; 00 0010 1000 0000 Провести віднімання із збереженням результату.
btfssstatus, z; 01 1101 0000 0011 Якщо результат не нуль,
gotonext; 10 1000 0001 1001 то перейти на фрагмент next.
incfindf, f; 00 1010 1000 0000 Інакше нарости результат на одиницю.
Agotoquit; 10 1000 0001 1100 І перейти на завершення програми.
next; Фрагмент, якщо результат не нуль.
Bmovfindf, w; 00 1000 0000 0000 Занести результат в акумулятор.
quit; Частковий завершення програми.
Csleep; 00 0000 0110 0011 Зупинка ЦПУ, переводячи його в сплячий режим.
end; Вказівка ??на кінець програми.
Для реалізації поставленого завдання в схемі застосовані сім команд:
) MOVLW переслати W в f.
Код: 11 0...