Volkov / ЛР_4 Шутова Д.С
.docxНижегородский государственный технический университет им. Р.Е. Алексеева
Кафедра «Компьютерные технологии в проектировании и производстве»
Лабораторная работа №4
Функции (подпрограммы) и макроопределения
выполнил:
студент группы М13-КТЭС
Шутова Д.С
проверил:
Волков М.Б
Нижний Новгород
2014 г.
Цель работы: Изучить написание и работу подпрограмм и макроопределений для МК. Закрепить полученные знания на практике.
Задание: Разработать программу вычислений по условиям лабораторной работы № 3, оформив расчёты уравнений в виде функций для Y1, Y2, и макроопределений для Y1, Y2. Продемонстрировать работу в интегрированной среде.
Выполнение:
-
Расчётные значения для Y1, Y2:
Вариант №6:
-
Алгоритм:
L1:
L2:
L3:
Конец
Load_Data
W=27 X1=W
W=02 X2=W
W=92 X3=W
W=~X1 n_X1=W
W=~X3 n_X3=W
W=X2 W=n_X1&W
W=n_X3&W
tmp1=W
t6_1=W
W=~tmp1
tmp1=W
f_call_Y1
f_call_Y2
W=t6_1 W=t6_2||W
Y2=W
B1:
B9:
Конец
B2:
W=tmp1 W=tmp2|W
Y1=W
Конец
W=~X2 n_X2=W
W=X1 W=n_X2&W
W= X3&W
tmp2=W
t6_2=W
W=~tmp2
tmp2=W
B3:
B4:
B5:
B6:
B7:
W=0
W=0
B8:
Начало
W=0
W=0
W=0
Конец
Load_Data
f_call_Y1
f_call_Y2
W=0
m_call_Y1
m_call_Y2
W=0
A9:
A2:
A3:
A4:
A5:
A6:
A7:
A8:
A1:
A10:
-
Программа:
; Lab_4
;-------------------------------
#include<p16F877.inc> ; подключение заголовочного файла
; для МК PIC 16F877
;-------------------------------
X1 EQU 0x20 ;
X2 EQU 0x21 ;
X3 EQU 0x22 ;
n_X1 EQU 0x23 ;
n_X2 EQU 0x24 ;
n_X3 EQU 0x25 ;
t6_1 EQU 0x28 ;
t6_2 EQU 0x29 ;
t_val_1 EQU 0x2A ;
t_val_2 EQU 0x2B ;
Y1 EQU 0x2C ;
Y2 EQU 0x2D ;
m_Y1 EQU 0x2E ;
m_Y2 EQU 0x2F ;
;-------------------------------
org 0x00 ; начало памяти программ (ПП)!
goto main ; произвести переход на метку 'main',
; с которой начнётся выполнение
; основной программы
org 0x05 ; адрес начала размещения кода в ПП
;---------------------------------------------;
;------ Функции программы ----------;
;---------------------------------------------;
Load_Data:
L1: movlw D'27' ; W = 27
movwf X1 ; X1 = W
L2: movlw D'02' ; W = 02
movwf X2 ; X2 = W
L3: movlw D'92' ; W = 92
movwf X3 ; X3 = W
return ; команда возврата
;---------------------------------------------;
f_call_Y1:
;---------------------------------------------; расчёт 1-ой части 1-го уравнения
B1: comf X1,W ; W =~ X1
movwf n_X1 ; n_X1 = W
B2: comf X3,W ; W =~ X3
movwf n_X3 ; n_X3 = W
B3: movfw X2 ; W = 02
andwf n_X1,W ; W = n_X1 & X2
andwf n_X3,W ; W = W & n_X3
movwf t6_1 ; t6_1 = W
comf t6_1,W ; W =~ t6_1
movwf t_val_1 ; t_val_1 = W
B4: clrw ; W = 0
B5: comf X2,W ; W =~ X2
movwf n_X2 ; n_X2 = W
B6: movfw X1 ; W = 27
andwf n_X2,W ; W = W & n_X2
andwf X3,W ; W = W & X3
movwf t6_2 ; t6_2 = W
comf t6_2,W ; W =~ t6_2
movwf t_val_2 ; t_val_2 = W
B7: clrw ; W = 0
B8: movfw t_val_1 ; W = t_val_1
iorwf t_val_2,W ; W = t_val_1 | t_val_2
movwf Y1 ; Y1 = W
;----------------------------------------------;
return ; команда возврата
;----------------------------------------------;
f_call_Y2:
;----------------------------------------------; расчёт 2-го уравнения
B9: movfw t6_1 ; W = t6_1
xorwf t6_2,W ; W = t6_1 || t6_2
movwf Y2 ; Y2 = W
return ; команда возврата
;---------------------------------------------;
;------ Макросы программы ----------;
;---------------------------------------------;
m_call_Y1 MACRO m_X1,m_X2,m_X3
D1: comf m_X1,W ; W =~ m_X1
movwf n_X1 ; n_X1 = W
D2: comf m_X3,W ; W =~ m_X3
movwf n_X3 ; n_X3 = W
D3: movfw m_X2 ; W = 02
andwf n_X1,W ; W = n_X1 & X2
andwf n_X3,W ; W = W & n_X3
movwf t6_1 ; t6_1 = W
comf t6_1,W ; W =~ t6_1
movwf t_val_1 ; t_val_1 = W
;----------------------------------------------;
D4: clrw ; W = 0
;----------------------------------------------; расчёт 2-ой части 1-го уравнения
D5: comf m_X2,W ; W =~ m_X2
movwf n_X2 ; n_X2 = W
D6: movfw m_X1 ; W = 27
andwf n_X2,W ; W = W & n_X2
andwf m_X3,W ; W = W & m_X3
movwf t6_2 ; t6_2 = W
comf t6_2,W ; W =~ t6_2
movwf t_val_2 ; t_val_2 = W
D7: clrw ; W = 0
;----------------------------------------------; расчёт общей части уравнения
D8: movfw t_val_1 ; W = t_val_1
iorwf t_val_2,W ; W = t_val_1 | t_val_2
movwf m_Y1 ; m_Y1 = W
;---------------------------------------------;
ENDM ; директива окончания
;---------------------------------------------;
m_call_Y2 MACRO m_t6_1,m_t6_2
;---------------------------------------------; расчёт 2-го уравнения
D9: movfw m_t6_1 ; W = m_t6_1
xorwf m_t6_2,W ; W = m_t6_1 || m_t6_2
movwf m_Y2 ; m_Y2 = W
ENDM ; директива окончания
;---------------------------------------------;
main:
;------- вызовы функций ---------------;
A1: call Load_Data ; загрузка данных
A2: clrw ; W = 0
A3: call f_call_Y1 ; расчёт 1-го уравнения с помощью
функции
A4: clrw ; W = 0
A5: call f_call_Y2 ; расчёт 2-го уравнения с помощью
функции
A6: clrw
;---------------------------------------------;
;------- работа макросов ---------------;
A7: m_call_Y1 X1,X2,X3 ;
A8: clrw ; W = 0
A9: m_call_Y2 t6_1,t6_2 ;
A10: clrw ; W = 0
;---------------------------------------------;
goto main
END
-
Вывод;