Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по МПТ (2015 г.).doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.3 Mб
Скачать

12. Операции отношения и логические в языке mikroC. Виды операций, примеры их использования в программах.

Операции отношения применяются для вычисления соотношений между операндами. Логические операции, используя правила логики, также возвращают соотношения между операндами.

В формальной логике ключевым понятием являются ЛОЖЬ и ИСТИНА. В языке Си лжи соответствует 0, а истине – любое значение, отличное от 0. Выражения, использующие операции отношения или логические, возвращают 0 для лжи и 1 для истины. В таблице 1 приведены обозначения логических и операций отношения, применяемых в языке mikroC.

Таблица 1

Логические операции и операции отношения

Знак операции

Выполняемое действие

Пример

&&

Логическое И

if ( k > 1 && k < 10)

||

Логическое ИЛИ

if ( c == 0 || c == 9 )

!

Логическое НЕ

if ( ! ( c > 1 && c < 9 ))

<

Меньше

if ( j < 0 )

<=

Меньше или равно

if ( j <= 0 )

>

Больше

if ( j > 10 )

>=

Больше или равно

if ( x >= 8.2 )

==

Равно

if (c == b)

!=

Не равно

if (c != b )

В качестве примера рассмотрим программу log_op.c, в которой используются операции отношения и логические для целых чисел.

/************************************************************

log_op.c –программа для исследования операций

отношения и логических

***********************************************************/

char var1 = 10, var2 = 20;

char res1, res2, res3, res4, res5, res6, res7, res8;

void main( )

{

res1 = var1 > var2; // res1 = 0

res2 = var1 < var2; // res2 = 1

res3 = var1 == var2; // res3 = 0

res4 = var1 != var2; // res4 = 1

res5 = var1 && var2; // res5 = 1

res6 = var1 || var2; // res6 = 1

res7 = ! var1; // res7 = 0

res8 = ! var2; // res8 = 0

}

13. Поразрядные операции в языке mikroC. Виды операций, примеры их использования в программах.

В языке mikroC, как и в классическом Си, широко используются поразрядные (побитовые) операции, с помощью которых можно выполнять тестирование, установку, сброс, инвертирование и сдвиг отдельных битов операндов. Поразрядные операции могут выполняться только с целыми типами данных, т.е. char, int, long. В таблице 1 приведены поразрядные операции языка mikroC.

Таблица 1

Поразрядные операции в языке mikroC

Знак операции

Выполняемое действие

Пример

&

Поразрядное И

i & 0x25

|

Поразрядное ИЛИ

j | 64

^

Поразрядное исключающее ИЛИ

k ^ 0x0F

~

Поразрядное НЕ (инверсия)

~ m

<<

Поразрядный сдвиг влево

i << 2

>>

Поразрядный сдвиг вправо

j >> 3

Рассмотрим программу bit_op.c, в которой используются различные поразрядные операции.

/***********************************************************

bit_op.c –программа для исследования поразрядных операций

***********************************************************/

char i = 0x0F, j = 0x1A, k1, k2, k3, k4, k5, k6, k7;

void main( )

{

k1 = i & j; // k1 = 0b00001010 = 0x0A

k2 = i | j; // k2 = 0b00011111 = 0x1F

k3 = i ^ j; // k3 = 0b00010101 = 0x15

k4 = ~ i; // k4 = 0b11110000 = 0xF0

k5 = ~ j; // k5 = 0b11100101 = 0xE5

k6 = i << 2; // k6 = 0b00111100 = 0x3C

k7 = j >> 3; // k7 = 0b00000011 = 0x03

}

Для сокращения текста программ в языке mikroC широко используются поразрядные составные операторы присваивания, которые являются комбинацией поразрядных операций и присваивания. В таблице 2 приведены составные поразрядные операции присваивания.

Таблица 2

Составные поразрядные операторы присваивания

Оператор

Длинная форма

Пример

x &= y;

x = x & y;

i &= 0x0F;

x |= y;

x = x | y;

j |= 64;

x ^= y;

x = x ^ y;

k ^= 0x80;

x <<= n;

x = x << n;

j <<= 2;

x >>= n;

x = x >> n;

k >>= 3;

Примечание. В составных операторах присваивания между знаком поразрядной операции (&, |, ^, >>, <<) и знаком присваивания “=“ пробел не допускается!

Поразрядные операции очень часто используются для управления отдельными разрядами портов микроконтроллеров. В этом случае первым операндом в операции является регистр данных порта (PORTA, PORTB, PORTC и т.п.), а вторым операндом служит однобайтное число, называемое маской.

Для сброса битов в 0 порта используется поразрядная операция И ( & ), при этом в соответствующих разрядах числа-маски должны быть нули.

Для установки битов в 1 порта используется поразрядная операция ИЛИ ( | ), при этом в соответствующих разрядах числа-маски должны быть единицы.

Для инвертирования битов порта используется поразрядная операция Исключающее ИЛИ (^), при этом в соответствующих разрядах числа-маски должны быть единицы.

Предположим, что в порт В, настроенного на вывод, нужно:

1) установить в единицу 0-й и 7-й разряды порта.

Определим маску для установки битов с помощью поразрядной операции ИЛИ. Это будет число 0b10000001 = 0x81.

На mikroC эту операцию можно выполнить как

PORTB = PORTB | 0b10000001;

или в сокращенной форме

PORTB |= 0b10000001;

2) сбросить в нуль 3-й и 4-й разряды порта В.

Определим маску для сброса этих битов с помощью поразрядной операции И. Это будет число 0b11100111 = 0xE7.

На mikroC эту операцию можно выполнить как

PORTB = PORTB & 0b11100111;

или в сокращенной форме

PORTB &= 0b11100111;

3) инвертировать 7-й, 5-й, 3-й, 1-й разряды порта В.

Определим маску для инвертирования этих битов с помощью поразрядной операции Исключающее ИЛИ. Это будет число 0b10101010 = 0xAA.

На mikroC эту операцию можно выполнить как

PORTB = PORTB ^ 0b10101010;

или в сокращенной форме

PORTB ^= 0b10101010;

Программа для выполнения рассматриваемых действий с портом В может иметь вид:

void main( )

{

TRISB = 0; // настроить все линии порта В на вывод

PORTB |= 0b10000001; // вывести 1 на выводы RB7 и RB0

PORTB &= 0b11100111; // вывести 0 на выводы RB4 и RB3

POTRB ^= 0b10101010; // инвертировать состояния выводов RB7, RB5, RB3, RB1

}