
Лабораторная работа 3 / lab3
.docМинистерство образования РФ
Санкт – Петербургский Государственный Электротехнический Университет
имени В.И. Ульянова (Ленина) “ЛЭТИ”
Кафедра ВТ
Отчет по лабораторной работе №3
Выполнили студенты гр.2371
Абрамов А.
Зевакина О.
Проверил преподаватель
Головина Людмила Константиновна
Санкт – Петербург
2006
РЕАЛИЗАЦИЯ ЛОГИЧЕСКИХ ФУНКЦИЙ.
Цель задания:
-
Ознакомление с командами логических операций ОМК P89LPC932.
-
Изучение способов реализации логических функций в ОМК и их сравнительный анализ.
Задания:
В
соответствии с вариантом задания
составить таблицу истинности заданной
функции
.
Подготовить тексты программ на Ассемблере, реализующих заданную логическую функцию с использованием описанных ниже методов. Принять, что значения аргументов функции (полный перебор значений) хранятся в виде массива размерностью 16 и упакованы в 8 байт (в одном байте – две комбинации аргументов) в резидентной памяти данных (РПД) в области прямоадресуемых битов. Массив значений функции разместить в той же области в 2-х байтах. Подготовить данные для индикации значений функции на 8-разрядной линейке светодиодов. Если функция принимает значение "1", байт индикации имеет значение FFh, в противном случае - 55h. Массив данных для индикации разместить в РПД. В программе предусмотреть вывод этого массива на индикацию следующим образом: в течении 1 сек. выполняется индикация очередного значения, затем 1 сек. индикация погашена. Использовать подпрограмму временной задержки DELAY из первой лабораторной работы.
Вариант
2:
№ |
х1 |
х2 |
х3 |
х4 |
f(x1,x2,x3,x4) |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
2 |
0 |
0 |
1 |
0 |
1 |
3 |
0 |
0 |
1 |
1 |
1 |
4 |
0 |
1 |
0 |
0 |
1 |
5 |
0 |
1 |
0 |
1 |
0 |
6 |
0 |
1 |
1 |
0 |
1 |
7 |
0 |
1 |
1 |
1 |
1 |
8 |
1 |
0 |
0 |
0 |
0 |
9 |
1 |
0 |
0 |
1 |
0 |
10 |
1 |
0 |
1 |
0 |
0 |
11 |
1 |
0 |
1 |
1 |
0 |
12 |
1 |
1 |
0 |
0 |
1 |
13 |
1 |
1 |
0 |
1 |
0 |
14 |
1 |
1 |
1 |
0 |
1 |
15 |
1 |
1 |
1 |
1 |
1 |
Значение аргументов, упакованных с 8 байт:
x1 |
x2 |
x3 |
x4 |
x1 |
x2 |
x3 |
x4 |
Значение |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
01h |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
23h |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
45h |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
67h |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
89h |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0АВh |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0CDh |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0EFh |
Значения функции, упакованные в 2 байта:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Значение |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0BBh |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0Bh |
1) Вычисление логической функции с помощью команд байтовых поразрядных логических операций
Использование данного подхода предполагает в качестве первого шага разделение входных булевых переменных, содержащихся в одном слове, т.е. аргументы булевой функции должны быть помещены в один и тот же разряд (например, младший) различных регистров или ячеек памяти. Это выполняется повторением нужного числа раз команд сдвига и пересылки. При этом для сохранения исходного кода аргументов его следует перед началом преобразования продублировать в некотором регистре (ячейке).
Затем над содержимым этих регистров выполняются команды логических операций (ANL, ORL, XRL, CPL), последовательность которых соответствует заданной логической функции, при этом в выделенном разряде формируется значение функции.
; Лабораторная работа №3 задание (а)
$NOMOD51
#include <REG932.H>
; Сегмент стека
StackSG SEGMENT IDATA
RSEG StackSG
DS 10
; Вспомогательный сегмент данных
AuxDataSG SEGMENT XDATA
RSEG AuxDataSG
IndVal: DS 16
; Сегмент данных
DSEG AT 20h
Args: DS 8
Values: DS 2
; Переход на начало программы
CSEG AT 0
AJMP Start
; Сегмент кода
CodeSG SEGMENT CODE
RSEG CodeSG
Start:
MOV PSW, #00010000b
MOV SP, #StackSG - 1
; устанавливается двунвправленный режим
; работы для P2
MOV P2M1, #00h
; Формирование массива полного
; перебора значений функций
MOV R0, #Args
MOV R2, #8
LoopOfCreateArgs:
MOV A, #8
SUBB A, R2 ;A-R2
RLC A ;<- c
MOV R3, A
SWAP A ; A74<->A30
MOV R4, A
MOV A, R3
INC A
ORL A, R4 ;or
MOV @R0, A
INC R0
DJNZ R2, LoopOfCreateArgs
; Формирование массива значений функций
; Инициализация массива значений функций
MOV R1, #Values
CLR A ;A=0
MOV @R1, A
INC R1
MOV @R1, A
MOV R2, #8
MOV R0, #Args
LoopOfCreateVals:
; Обработка первой тетрады
MOV A, @R0
MOV R6, A
RR A ;->
MOV R5, A
RR A
MOV R4, A
RR A
MOV R3, A
MOV A, R3
CPL A ;!A
ORL A, R4 ;AND
MOV R4, A
MOV A, R6
CPL A ;!A
ORL A, R5; AND
ANL A, R4 ;OR
MOV R7, A
; Обработка второй тетрады
MOV A, R3
MOV R6, A
RR A ;->
MOV R5, A
RR A
MOV R4, A
RR A
MOV R3, A
MOV A, R3
CPL A ;!A
ANL A, R4 ;AND
MOV R4, A
MOV A, R6
CPL A ;!A
ANL A, R5 ;AND
ORL A, R4 ;OR
XCH A, R7 ;A<->R7
ANL A, #3 ;AND
XCH A, R7 ;A<->R7
ANL A, #2 ;AND
ORL A, R7 ;OR
MOV R3, A
MOV A, R2
CLR C
SUBB A, #5
JC SA5 ;JUMP IF C=1
MOV R1, #Values
SJMP Then1
SA5:
MOV R1, #Values + 1
ANL A, #01
Then1:
RL A ;<-
XCH A, R3 ;A<->R3
LoopOfShift:
RL A ;<-
DJNZ R3, LoopOfShift
ORL A, @R1 ;OR
MOV @R1, A
INC R0
DJNZ R2, LoopOfCreateVals
; Подготовка данных к индикации
MOV R2, #2
MOV R0, #Values
MOV DPTR, #IndVal
LoopOfFirstPrepInd:
MOV R3, #8
MOV R4, #80h
LoopOfSecondPrepInd:
MOV A, @R0
ANL A, R4
JZ False ;JUMP IF A=0
MOV A, #0FFh
MOVX @DPTR, A
SJMP Then2
False:
MOV A, #55h
MOVX @DPTR, A
Then2:
MOV A, R4
RR A
MOV R4, A
INC DPTR
DJNZ R3, LoopOfSecondPrepInd
INC R0
DJNZ R2, LoopOfFirstPrepInd
; Индикация массива значений функции
MOV R2, #16
MOV DPTR, #IndVal
LoopOfIndication:
MOVX A, @DPTR
MOV P2, A
ACALL delay
MOV P2, #0
ACALL delay
INC DPTR
DJNZ R2, LoopOfIndication
RET
; Подпрограмма задержки (около 0.5 сек)
delay:
MOV R3, #12 ; заполнение регистров константами
firstL:
MOV R4, #255 ; аналогично
secondL:
MOV R5, #255 ; аналогично
ternL:
NOP ; пустая команда
DJNZ R5, ternL ; декрементируем регистры и переходим
DJNZ R4, secondL ;если регистр не обнулился
DJNZ R3, firstL
RET
END
2)
При данном способе вычисление функции
выполняется на основе разветвленного
алгоритма типа дерева решений. Значения
булевых аргументов последовательно
анализируются командами условного
перехода до тех пор пока не определится
значение функции. На рис. приведен
алгоритм реализации функции
с использованием условных переходов.
; Лабораторная работа №3 задание (б)
; Сегмент стека
StackSG SEGMENT IDATA
RSEG StackSG
DS 10
; Вспомогательный сегмент данных
AuxDataSG SEGMENT XDATA
RSEG AuxDataSG
IndVal: DS 16
; Сегмент данных
DSEG AT 20h
Args: DS 8
Values: DS 2
; Переход на начало программы
CSEG AT 0
AJMP Start
; Сегмент кода
CodeSG SEGMENT CODE
RSEG CodeSG
Start:
MOV PSW, #00010000b
MOV SP, #StackSG - 1
; устанавливается двунвправленный режим
; работы для P2
MOV P2M1, #00h
; Формирование массива полного
; перебора значений функций
MOV R0, #Args
MOV R2, #8
LoopOfCreateArgs:
MOV A, #8
SUBB A, R2 ;A-R2
RLC A ;<- c
MOV R3, A
SWAP A ; A74<->A30
MOV R4, A
MOV A, R3
INC A
ORL A, R4 ;or
MOV @R0, A
INC R0
DJNZ R2, LoopOfCreateArgs
; Формирование массива значений функций
; Инициализация массива значений функций
MOV R1, #Values
CLR A ;A=0
MOV @R1, A
INC R1
MOV @R1, A
MOV R2, #8
MOV R0, #Args
LoopOfCreateVals:
; Обработка первой тетрады
MOV A, @R0
RLC A ;<- through C
JNC x1isNull1 ;Jump if C=0
RLC A
JNC x2isNull1
RLC A
JNC x3isNull1
MOV R3, #2
RLC A
SJMP ProcessNext
x1isNull1:
RLC A ;<- through C
RLC A ;<- through C
JC x3isOne1 ;Jump if C=1
RLC A
JC x4isOne1 ;Jump if C=1
MOV R3, #2
SJMP ProcessNext
x2isNull1:
MOV R3, #0
RLC A
RLC A
SJMP ProcessNext
x3isNull1:
RLC A
JNC x4isNull1
MOV R3, #0
SJMP ProcessNext
x4isNull1:
MOV R3, #2
SJMP ProcessNext
x3isOne1:
RLC A
MOV R3, #1
SJMP ProcessNext
x4isOne1:
MOV R3, #0
ProcessNext:
; Обработка второй тетрады
RLC A ;<- through C
JNC x1isNull2 ;Jump if C=0
RLC A
JNC x2isNull2
RLC A
JNC x3isNull2
MOV A, #1
SJMP ToMemory
x1isNull2:
RLC A
RLC A
JC x3isOne2
RLC A
JC x4isOne2
MOV A, #1
SJMP ToMemory
x2isNull2:
MOV A, #0
SJMP ToMemory
x3isNull2:
RLC A
JNC x4isNull2
MOV A, #0
SJMP ToMemory
x4isNull2:
MOV A, #1
SJMP ToMemory
x3isOne2:
MOV A, #2
SJMP ToMemory
x4isOne2:
MOV A, #2
ToMemory:
; Запись результатов в память
ORL A, R3
MOV R3, A
MOV A, R2
CLR C
SUBB A, #5
JC SA5
MOV R1, #Values
SJMP Then1
SA5:
MOV R1, #Values + 1
ANL A, #01
Then1:
RL A
XCH A, R3
LoopOfShift:
RL A
DJNZ R3, LoopOfShift
ORL A, @R1
MOV @R1, A
INC R0
DJNZ R2, LoopOfCreateVals
; Подготовка данных для индикации
MOV R2, #2
MOV R0, #Values
MOV DPTR, #IndVal
LoopOfFirstPrepInd:
MOV R3, #8
MOV R4, #80h
LoopOfSecondPrepInd:
MOV A, @R0
ANL A, R4
JZ False ;JUMP IF A=0
MOV A, #0FFh
MOVX @DPTR, A
SJMP Then2
False:
MOV A, #55h
MOVX @DPTR, A
Then2:
MOV A, R4
RR A
MOV R4, A
INC DPTR
DJNZ R3, LoopOfSecondPrepInd
INC R0
DJNZ R2, LoopOfFirstPrepInd
; Индикация массива значений функции
MOV R2, #16
MOV DPTR, #IndVal
LoopOfIndication:
MOVX A, @DPTR
MOV P2, A
ACALL delay
MOV P2, #0
ACALL delay
INC DPTR
DJNZ R2, LoopOfIndication
RET
; Подпрограмма задержки (около 0.5 сек)
delay:
MOV R3, #12 ; заполнение регистров константами
firstL:
MOV R4, #255 ; аналогично
secondL:
MOV R5, #255 ; аналогично
ternL:
NOP ; пустая команда
DJNZ R5, ternL ; декрементируем регистры и переходим
DJNZ R4, secondL ;если регистр не обнулился
DJNZ R3, firstL
RET
END
3) Табличный способ
Идея данного способа заключается в использовании вводимой комбинации значений булевых аргументов в качестве адреса ячейки, содержимым которой является соответствующее значение функции. Таблица значений функции должна быть заранее загружена в память программ, начиная с некоторого базового адреса. Текущая комбинация входных значений определяет смещение адреса при обращении к этой таблице. Алгоритм реализации функции в данном случае включает в себя следующие шаги:
-
формирование адреса доступа к таблице;
-
считывание из таблицы значения функции и формирование массива значений функции;
-
формирование массива значений функции для индикации.
Таблица значений функции для индикации размещается в AUX RAM. Для обращения к таблице в этом случае должна использоваться косвенная адресация через регистр-указатель данных DPTR. Обращение к таблице осуществляется командой MOVX A,@DPTR, в результате выполнения которой в аккумулятор загружается код значения функции.
; Лабораторная работа №3 задание (в)
$NOMOD51
#include <REG932.H>
; Сегмент стека
StackSG SEGMENT IDATA
RSEG StackSG
DS 10
; Вспомогательный сегмент данных
AuxDataSG SEGMENT XDATA
RSEG AuxDataSG
IndVal: DS 16
; Сегмент данных
DSEG AT 20h
Args: DS 8
Values: DS 2
; Начало программы
CSEG AT 0
AJMP Start
; Сегмент кода
CodeSG SEGMENT CODE
RSEG CodeSG
ValTable:
DB 1, 0, 1, 1
DB 1, 0, 1, 1
DB 0, 0, 0, 0
DB 1, 0, 1, 1
Start:
MOV PSW, #00010000b
MOV SP, #StackSG - 1
; устанавливаем двунаправленный режим
; работы для P2
MOV P2M1, #00h
; Формирование массива полного перебора
; значений функции
MOV R0, #Args
MOV R2, #8
LoopOfCreateArgs:
MOV A, #8
SUBB A, R2
RLC A
MOV R3, A
SWAP A
MOV R4, A
MOV A, R3
INC A
ORL A, R4
MOV @R0, A
INC R0
DJNZ R2, LoopOfCreateArgs
; Формирование массива значений функции
; Инициализация значений функции
MOV R1, #Values
CLR A
MOV @R1, A
INC R1
MOV @R1, A
MOV R2, #8
MOV R0, #Args
MOV DPTR, #ValTable
LoopOfCreateVals:
; Обработка первой тетрады
MOV A, @R0
SWAP A
ANL A, #0Fh
MOVC A, @A + DPTR
JZ Acc0
MOV R3, #2
SJMP ProcessNext
Acc0:
MOV R3, #0
ProcessNext:
; Обработка второй тетрады
MOV A, @R0
ANL A, #0Fh
MOVC A, @A + DPTR
JNZ Acc1
MOV A, #0
SJMP ToMemory
Acc1:
MOV A, #1
ToMemory:
; Запись результатов в память
ORL A, R3
MOV R3, A
MOV A, R2
CLR C
SUBB A, #5
JC SA5
MOV R1, #Values
SJMP Then1
SA5:
MOV R1, #Values + 1
ADD A, #4
Then1:
RL A
XCH A, R3
LoopOfShift:
RL A
DJNZ R3, LoopOfShift
ORL A, @R1
MOV @R1, A
INC R0
DJNZ R2, LoopOfCreateVals
; Подготовка данных для индикации
MOV R2, #2
MOV R0, #Values
MOV DPTR, #IndVal
LoopOfFirstPrepInd:
MOV R3, #8
MOV R4, #80h
LoopOfSecondPrepInd:
MOV A, @R0
ANL A, R4
JZ FalseVal
MOV A, #0FFh
MOVX @DPTR, A
SJMP Then2
FalseVal:
MOV A, #55h
MOVX @DPTR, A
Then2:
MOV A, R4
RR A
MOV R4, A
INC DPTR
DJNZ R3, LoopOfSecondPrepInd
INC R0
DJNZ R2, LoopOfFirstPrepInd
; Индикация массива значений функции
MOV R2, #16
MOV DPTR, #IndVal
LoopOfIndication:
MOVX A, @DPTR
MOV P2, A
ACALL delay
MOV P2, #0
ACALL delay
INC DPTR
DJNZ R2, LoopOfIndication
RET
; Подпрограмма задержки (~0.5 сек)
delay:
MOV R3, #12
primLoop:
MOV R4, #255
secLoop:
MOV R5, #255
ternLoop:
NOP
NOP
DJNZ R5, ternLoop
DJNZ R4, secLoop
DJNZ R3, primLoop
RET
END
4) Использование команд битовых операций
Значение
функции вычисляется путем непосредственного
доступа к битам - аргументам логической
функции. При этом булевы значения
аргументов должны размещаться в регистрах
либо ячейках РПД, поддерживающих данный
режим доступа. На рис. приведен алгоритм
вычисления функции
,
где для хранения промежуточных результатов
используются младшие разряды аккумулятора
и регистра-расширителя B.
;Лабораторная работа №3, задание (г)
$NOMOD51
#include <REG932.H>
; Сегмент стека
StackSG SEGMENT IDATA
RSEG StackSG
DS 10
; Вспомогательный сегмент данных
AuxDataSG SEGMENT XDATA
RSEG AuxDataSG
IndVal: DS 16
; Сегмент данных
DSEG AT 20h
Args: DS 8
Values: DS 2
; Начало программы
CSEG AT 0
AJMP Start
; Сегмент кода
CodeSG SEGMENT CODE
RSEG CodeSG
Start:
MOV PSW, #00010000b
MOV SP, #StackSG - 1
; устанавливаем двунаправленный режим
; работы для P2
MOV P2M1, #00h
; Формирование массива полного перебора
; значений функции
MOV R0, #Args
MOV R2, #8
LoopOfCreateArgs:
MOV A, #8
SUBB A, R2
RLC A
MOV R3, A
SWAP A
MOV R4, A
MOV A, R3
INC A
ORL A, R4
MOV @R0, A
INC R0
DJNZ R2, LoopOfCreateArgs
; Формирование массива значений функции
; Инициализация значений функции
MOV R1, #Values
CLR A
MOV @R1, A
INC R1
MOV @R1, A
MOV R2, #8
MOV R0, #Args
LoopOfCreateVals:
; Обработка первой тетрады
MOV A, @R0
MOV C, ACC.6
ORL C, /ACC.7
MOV B.1, C
MOV C, ACC.5
ORL C, /ACC.4
ANL C, B.1
JNC CyIsNull ;Jump if C=0
MOV R3, #2
SJMP ProcessNext
CyIsNull:
MOV R3, #0
ProcessNext:
; Обработка второй тетрады
MOV C, ACC.2
ORL C, /ACC.3
MOV B.1, C
MOV C, ACC.1
ORL C, /ACC.0
ANL C, B.1
JC CyIsOne
MOV A, #0
SJMP ToMemory
CyIsOne:
MOV A, #1
ToMemory:
; Запись результатов в память
ORL A, R3
MOV R3, A
MOV A, R2
CLR C
SUBB A, #5
JC SA5
MOV R1, #Values
SJMP Then1
SA5:
MOV R1, #Values + 1
ADD A, #4
Then1:
RL A
XCH A, R3
LoopOfShift:
RL A
DJNZ R3, LoopOfShift
ORL A, @R1
MOV @R1, A
INC R0
DJNZ R2, LoopOfCreateVals
; Подготовка данных для индикации
MOV R2, #2
MOV R0, #Values
MOV DPTR, #IndVal
LoopOfFirstPrepInd:
MOV R3, #8
MOV R4, #80h
LoopOfSecondPrepInd:
MOV A, @R0
ANL A, R4
JZ FalseVal
MOV A, #0FFh
MOVX @DPTR, A
SJMP Then2
FalseVal:
MOV A, #55h
MOVX @DPTR, A
Then2:
MOV A, R4
RR A
MOV R4, A
INC DPTR
DJNZ R3, LoopOfSecondPrepInd
INC R0
DJNZ R2, LoopOfFirstPrepInd
; Индикация массива значений функции
MOV R2, #16
MOV DPTR, #IndVal
LoopOfIndication:
MOVX A, @DPTR
MOV P2, A
ACALL delay
MOV P2, #0
ACALL delay
INC DPTR
DJNZ R2, LoopOfIndication
RET
; Подпрограмма задержки (около 0.5 сек)
delay:
MOV R3, #12
firstL:
MOV R4, #255
secondL:
MOV R5, #255
ternL:
NOP
DJNZ R5, ternL
DJNZ R4, secondL
DJNZ R3, firstL
RET
END
END
Вывод:
В результате выполнения лабораторной работы были вспомнены и изучены новые команды языка Ассемблер. Рассмотрены различные способы реализации логических функций в ОМК P89LPC932.
Программы, написанные в соответствии с заданием, корректно работают в симуляторе KeiluVision 3. При прошивке микроконтроллера также не обнаружено никаких ошибок.