операция &~

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
encyclon
Открыл глаза
Сообщения: 42
Зарегистрирован: Вт окт 30, 2012 10:33:28

операция &~

Сообщение encyclon »

Добрых суток, рассматривал пример инициализации и работы AVR с HD44780. Наткнулся на такой код

Код: Выделить всё

//Программа передачи команд в ЖКИ
void lcd_com (unsigned char lcd)
{
unsigned char temp;
 
temp=(lcd&~(1<<RS))|(1<<E);   //RS=0 – это команда
PORTD=temp;
asm("nop");
PORTD=temp&~(1<<E);   //Сигнал записи команды
 
temp=((lcd*16)&~(1<<RS))|(1<<E);   //RS=0 – это команда
PORTD=temp;
asm("nop");
PORTD=temp&~(1<<E);   //Сигнал записи команды
...
}


Возник такой вопрос, как и в каком порядке производится следующая операция &~?

Спасибо.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: операция &~

Сообщение urry »

encyclon
Открыл глаза
Сообщения: 42
Зарегистрирован: Вт окт 30, 2012 10:33:28

Re: операция &~

Сообщение encyclon »

Ок, с этим понятно, спасибо.

А может ещё подскажете, почему тут используется две конструкции а не какая нибудь одна?

Код: Выделить всё

//Программа передачи команд в ЖКИ
void lcd_com (unsigned char lcd)
{
   unsigned char temp;

   temp=(lcd&~(1<<RS))|(1<<E);   //RS=0 – это команда
   PORTB=temp;
   asm("nop");
   PORTB=temp&~(1<<E);      //Сигнал записи команды
     
   temp=((lcd*16)&~(1<<RS))|(1<<E);//RS=0 – это команда
   PORTB=temp;
   asm("nop");
   PORTB=temp&~(1<<E);      //Сигнал записи команды

   pause (10*TIME);      //Пауза для выполнения команды
}

//Программа записи данных в ЖКИ
void lcd_dat (unsigned char lcd)
{
   unsigned char temp;

   temp=(lcd|(1<<RS))|(1<<E);   //RS=1 – это данные
   PORTB=temp;
   asm("nop");
   PORTB=temp&~(1<<E);      //Сигнал записи данных

   temp=((lcd*16)|(1<<RS))|(1<<E);   //RS=1 – это данные
   PORTB=temp;
   asm("nop");
   PORTB=temp&~(1<<E);      //Сигнал записи данных

   pause(TIME);         //Пауза для вывода данных
}


т.е. temp=(lcd&~(1<<RS))|(1<<E); и temp=(lcd|(1<<RS))|(1<<E);
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: операция &~

Сообщение Аlex »

Потому, что в одном случае RS сбрасывается (посылается команда), а в другом устанавливается (посылаются данные).
encyclon
Открыл глаза
Сообщения: 42
Зарегистрирован: Вт окт 30, 2012 10:33:28

Re: операция &~

Сообщение encyclon »

спасибо, что-то ступил)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: операция &~

Сообщение YS »

Вообще, лучше не надеяться на предопределенный порядок операций, а указывать его явно, скобками.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
encyclon
Открыл глаза
Сообщения: 42
Зарегистрирован: Вт окт 30, 2012 10:33:28

Re: операция &~

Сообщение encyclon »

А есть ли другие способы (&~) получить тот же результат на си?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: операция &~

Сообщение YS »

Зависит от ситуации. Но обычно достаточно такого подхода.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: операция &~

Сообщение Jack_A »

YS писал(а):Вообще, лучше не надеяться на предопределенный порядок операций, а указывать его явно, скобками.


У одного гуру прочитал : "Некоторые программисты полагают, что мировой запас скобок ограничен и используют их крайне редко" :) Прямо в точку и с юмором. Хотя излишне перегружать скобками тоже, imho, плохой стиль.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: операция &~

Сообщение BCluster »

Я научен уже горьким опытом, и скобки ставлю везде, потому что обработка разнится от компилятора к компилятору. Почему - не знаю. Но это так. Хотя в стандарте это как будто описано, но на деле иначе. Особенно IAR любит ерундой заниматься
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: операция &~

Сообщение Flasher »

Вот как раз IAR и меньше всего ерундой занимается. А вот все остальные не столь строго стандарта придерживаются.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: операция &~

Сообщение Kavka »

Так как gcc последних версий, сейчас, тоже крут в стандартах, то остаётся CV. :)) :)) :))
PS: Замолкаю, замолкаю с оффтопом.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: операция &~

Сообщение BCluster »

Не знаю как для других платформ, а для х51 и мсп430 с иаром есть проблемы, и не только эти :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: операция &~

Сообщение YS »

Кстати, о стандартах. :) MISRA C рекомендует всегда ставить скобочки.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: операция &~

Сообщение ploop »

Не будем спорить на чёт компиляторов, но скобки ставить надо. Хотя бы для более удобочитаемого кода.
Ответить

Вернуться в «Разные вопросы по МК»