Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
63 / 5 / 1
Регистрация: 17.02.2019
Сообщений: 237

(PIC16F84A) Вычислить логические функции (дополнительно - запрещено применять функцию OR)

31.05.2020, 20:10. Показов 1588. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, писал код для микроконтроллера, чтобы тот вычислял определенные логические функции. Мой код ниже:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
;****************************************************************************
; Filename: dz.asm
; Программа вводит тактовый сигнал через порт RA4, вычисляет очередной код
; заданной последовательности (7 11 5 3 8 2 4 6) с помощью логической функции
; и выводит результат через линии порта A (Q1-RA3, Q2-RA2, Q3-RA1, Q4 – RA0).
; P.S Автор почему-то использовал слова типа "копировать" и "переместить" в одном значении
;****************************************************************************
 
    list p=16F84A          ; list directive to define processor
#include <p16F84a.inc> ; processor specific variable definitions
 
    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
var1 EQU 0x0C ;
var2 EQU 0x0D ; - переменные
var3 EQU 0x0E ;
var4 EQU 0x0F ;
tmp EQU 0x10 ;
now  EQU 0x11 ; переменная, содержащая текущее состояние
d1   EQU 0x12 ; переменная для подпрограммы - задержки
d2   EQU 0x13 ; переменная для подпрограммы - задержки
;**********************************************************************
    ORG    0x000      ; processor reset vector
    bcf    STATUS,RP1 ; устанавливаем
    bsf    STATUS,RP0 ; банк памяти 1
    movlw  0x10       ; управляющее слово для порта A
    movwf  TRISA      ; RA4 - на ввод, RA3, RA2, RA1, RA0 - на вывод
    movlw  0x00       ; управляющее слово для порта B
    movwf  TRISB      ; все на вывод
    bcf    STATUS,RP0 ; возвращаемся в банк 0
; Приветливо мигнем индикатором на PORTA[3] и оставим его включенным -
    movlw  0xff
    movwf  PORTA      ; погасили
    call   del_200    ; подождали 200 мс
    movlw  0x00
    movwf  PORTA      ; зажгли
    call   del_200    ; подождали 200 мс
    movlw  0xff
    movwf  PORTA      ; погасили
    call   del_200    ; подождали 200 мс
;----------------------------------------------------------------------------
; Установка начального состояния
    movlw  0x07
    movwf  now
; --------------- Основной исполнительный цикл -----------------------
; --------------- выводим результат в порт -----
loop 
    movf   now, w      ; устанавливаем результат
    movwf  PORTA       ; выводим в порт
; ----- Ждем синхроимпульс на PORTA[4] ------
key1 
    btfsc   PORTA,4     ; анализ состояния бита 4 порта A
    goto    key1        ; если 1 - продолжаем анализировать сигнал
; если 1 - дождались импульса, продолжаем выполнять программу
     call    del_200     ; подождали 200 мс, пропустили дребезг
; ----- Ждем окончания синхроимпульса на PORTA[4] ------
key2 
    btfss   PORTA,4     ; анализ состояния бита 4 порта A
    goto    key2        ; если 0 - продолжаем ждать
; если 0 - дождались окончания импульса
     call    del_200     ; подождали 200 мс, пропустили дребезг
; выделяем разряды текущего кода по отдельности и помещаем их в ячейки var1, ;var2 и var3
    movf    now, w      ; копируем текущий код в аккумулятор
    andlw   0x01        ; накладываем маску 000000001 - выделяем младший разряд Q4
    movwf   var4        ; копируем Q4 в var4
    movf    now, w      ; копируем текущий код в аккумулятор
    andlw   0x02        ; накладываем маску 000000010 - выделяем младший разряд Q3
    movwf   var3        ; копируем Q3 в var3
    rrf     var3, f     ; сдвиг Q3 вправо - выравниваем с Q4 в младшем разряде 
    movf    now, w      ; копируем текущий код в аккумулятор w
    andlw   0x04        ; накладываем маску 000000100 - выделяем младший разряд Q2
    movwf   var2        ; копируем Q2 в var2
    rrf     var2, f     ; сдвиг Q2 вправо
    rrf     var2, f     ; сдвиг Q2 вправо - выравниваем с Q3 и Q4 в младшем разряде
    movf    now, w      ; копируем текущий код в аккумулятор w
    andlw   0x08        ; накладываем маску 000001000 - выделяем старший разряд Q1
    movwf   var1        ; копируем Q1 в var1
    rrf     var1, f     ; сдвиг Q1 вправо
    rrf     var1, f     ; сдвиг Q1 вправо
    rrf     var1, f     ; сдвиг Q1 вправо - выравниваем с Q4, Q3 и Q2 в младшем разряде
    clrf now ;
; --- Вычисляем D1=Q3*Q4*^Q1 ---
    comf    var1, w     ; инвертируем Q1 с сохранением в аккумуляторе w
    movwf   tmp         ; сохраняем в временной ячейке tmp
    movf    var4, w     ; копируем Q4 в аккумулятор w
    andwf   tmp, f      ; ^Q1*Q4 с сохранением в tmp
    movf    var3, w     ; копируем Q3 в аккумулятор w
    andwf   tmp, f      ; ^Q1*Q4*Q3 с сохранением в tmp
    rlf     tmp, f     ; сдвигаем влево с сохранением в var5
    rlf     tmp, f     ; сдвигаем влево с сохранением в var5
    rlf     tmp, w     ; сдвигаем влево с сохранением в w - выравниваем с 3-м разрядом
    andlw    0x08       ; накладываем маску 000001000 - чистим результат
    iorwf    now, f     ; устанавливаем D1 в 3-й разряд now
; --- Вычисляем D2=Q4*Q1+^Q4*Q1 ---
    comf    var4, w     ; инвертируем Q4 с сохранением в аккумуляторе w
    andwf   var1, w     ; ^Q4*Q1 с сохранением в w
    movwf   tmp         ; переносим полученный результать из w в tmp
    movf    var4, w     ; переносим Q4 в аккумулятор w
    andwf   var1, w     ; Q4*Q1 с сохранением в w
    iorwf   tmp, f      ; логическое сложение результатов w и tmp с получением D2 в 0-м разряде tmp
    rlf      tmp, f    ; сдвигаем влево с сохранением в f
    rlf      tmp, w    ; сдвигаем влево с сохранением в аккумуляторе w
    andlw    0x04       ; накладываем маску 000000100 - чистим результат
    iorwf    now, f     ; устанавливаем D2 во 2-й разряд now
; --- Вычисляем D3=^Q3+Q2 ---
    comf    var3, w     ; инвертируем Q3 с сохранением в аккумуляторе w
    movwf   tmp         ; сохраняем результат в tmp
    movf    var2, w     ; переносим Q2 в аккумулятор w
    iorwf   tmp, f      ; логическое сложение результатов w и tmp с получением D3 в 0-м разряде tmp
    rlf      tmp, w    ; сдвигаем влево с сохранением в аккумуляторе w
    andlw    0x02       ; накладываем маску 000000010 - чистим результат
    iorwf    now,f      ; устанавливаем D2 во 2-й разряд now
; --- Вычисляем D4=Q4*Q2+Q3*Q2+Q4*Q1=Q4*(Q1+Q2)+Q3*Q2 ---
    movf    var1, w     ; перемещаем Q1 в аккумулятор w
    movwf   tmp         ; перемещаем Q1 в tmp
    movf    var2, w     ; копируем Q2 в аккумулятор w
    iorwf   tmp, f      ; Q2+Q1 с сохранением результата в tmp
    movf    var4, w     ; копируем Q4 в аккумулятор w
    andwf   tmp, f      ; Q4*(Q2+Q1) с сохранением результата в tmp
    movf    var3, w     ; копируем Q3 в аккумулятор w
    andwf   var2, w     ; Q3*Q2 с сохранением результата в w
    iorwf     tmp, w    ; D4 в 0-м разряде var5
    andlw    0x01       ; накладываем маску 000000001 - чистим результат
    iorwf    now, f     ; устанавливаем D4 в 0-й разряд now - РЕЗУЛЬТАТ
    goto     loop       ; Зацикливаем программу
; Подпрограмма - задержка 200 мс
; Переменные: d1 и d2
del_200  movlw   0xCC
    movwf   d2
d200_2   movlw   0xF9
    movwf   d1
    nop
    nop
d200_1   nop
    decfsz d1,f
    goto   d200_1
    nop
    decfsz d2,f
    goto   d200_2
    return
; --------- end of DEL_200 -------------
    end ; directive 'end of program'

Вопрос в чем. Мне, оказывается, запретили использовать команду iorwf, делающую логическое сложение. Но чем её можно заменить, чтобы реализовать логическое сложение?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.05.2020, 20:10
Ответы с готовыми решениями:

(PIC16F84A) Вычислить логические функции
Здравствуйте, снова я по своей же проблеме (нельзя использовать команду iorwf). Необходимо посчитать логическое функции D1-D4. Даны...

Создать функцию для обработки символьных строк. За образец брать библиотечные функции обработки строк языка С, но не применять их в своей функции
Доброго времени суток! Крайне необходима помощь экспертов в С++! Кто может - не оставьте меня в беде))) Вот задания: 3. Создать...

Задача логические функции (составить функцию, которая определяет верно ли что сумма цифр числа четное число)
Помогите нужно составить функцию, которая определяет верно ли что сумма цифр числа четное число. обязательно использовать логическую...

5
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
31.05.2020, 20:30
Лучший ответ Сообщение было отмечено ZamyatinDanya как решение

Решение

Правило де Моргана
https://ru.wikipedia.org/wiki/Законы_де_Моргана

https://www.cyberforum.ru/cgi-bin/latex.cgi?A\,  or\,  B = not (not (A\,  or\,  B))=not((not \, A)and(not \, B))=\bar{\bar{A} \, and \, \bar{B}}
1
63 / 5 / 1
Регистрация: 17.02.2019
Сообщений: 237
31.05.2020, 20:32  [ТС]
ФедосеевПавел, то есть фактически мне следует функции D преобразовать по правилу Де Моргана и переработать код?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
31.05.2020, 20:58
Не буду обманывать - не понимаю происходящее в коде.
Раз вы утверждаете, что вычисляется некая логическая функция - верю.

Работа с логической функцией всегда состоит в
1. минимизации функции
2. реализации функции

После минимизации у вас будут операции OR. По правилу де Моргана замените каждую на инверсию и AND, в некоторых случаях может быть увидите XOR.

Если минимизация невозможна - забудьте о ней.
1
63 / 5 / 1
Регистрация: 17.02.2019
Сообщений: 237
31.05.2020, 21:00  [ТС]
ФедосеевПавел, спасибо за Вашу отзывчивость. Мне кажется, раз мне дают такое задание, то минимизация тут возможна. Пойду почитать про XOR
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8663 / 4500 / 1670
Регистрация: 01.02.2015
Сообщений: 13,921
Записей в блоге: 13
31.05.2020, 21:04
Да, переработать код.

Причём правило применимо не обязательно к двум операндам - оно справедливо для произвольного их числа.

Добавлено через 2 минуты
XOR не обязательно должен присутствовать. Это если в месиве формул сможете разглядеть.

Просто замена OR на AND - и лаба сдана. Только вывод формул покажите преподавателю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.05.2020, 21:04
Помогаю со студенческими работами здесь

Вычислить значение функции y раскладывая функцию f(x) в ряд Тейлора. Для вычисления f(x) и факториала использовать рекурсивную функцию
Вычислить значение функции y раскладывая функцию f(x) в ряд Тейлора. Для вычисления f(x) и факториала использовать рекурсивную функцию. ...

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции пользователем. При невозможности...

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции пользователем. При невозможности...

Описать производный класс, дополнительно содержащий функцию умножения вектора на число и сложения двух векторов
Добрый день. Нужна помощь по Объектно-ориентированному программированию. Сама задача: Описать производный класс, дополнительно содержащий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru