Скачиваний:
17
Добавлен:
01.05.2014
Размер:
160.26 Кб
Скачать

Министерство образования РФ

Санкт – Петербургский Государственный Электротехнический Университет

имени В.И. Ульянова (Ленина) “ЛЭТИ”

Кафедра ВТ

Отчет по лабораторной работе №3

Выполнили студенты гр.2371

Абрамов А.

Зевакина О.

Проверил преподаватель

Головина Людмила Константиновна

Санкт – Петербург

2006

РЕАЛИЗАЦИЯ ЛОГИЧЕСКИХ ФУНКЦИЙ.

Цель задания:

  1. Ознакомление с командами логических операций ОМК P89LPC932.

  2. Изучение способов реализации логических функций в ОМК и их сравнительный анализ.

Задания:

В соответствии с вариантом задания составить таблицу истинности заданной функции .

Подготовить тексты программ на Ассемблере, реализующих заданную логическую функцию с использованием описанных ниже методов. Принять, что значения аргументов функции (полный перебор значений) хранятся в виде массива размерностью 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. При прошивке микроконтроллера также не обнаружено никаких ошибок.

Соседние файлы в папке Лабораторная работа 3