Страница 1 из 1

операция &~

Добавлено: Пн сен 30, 2013 10:29:55
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);   //Сигнал записи команды
...
}


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

Спасибо.

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

Добавлено: Пн сен 30, 2013 10:43:41
urry

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

Добавлено: Пн сен 30, 2013 11:46:39
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);

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

Добавлено: Пн сен 30, 2013 11:55:18
Аlex
Потому, что в одном случае RS сбрасывается (посылается команда), а в другом устанавливается (посылаются данные).

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

Добавлено: Пн сен 30, 2013 11:58:45
encyclon
спасибо, что-то ступил)

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

Добавлено: Чт окт 10, 2013 19:48:25
YS
Вообще, лучше не надеяться на предопределенный порядок операций, а указывать его явно, скобками.

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

Добавлено: Чт окт 10, 2013 20:01:21
encyclon
А есть ли другие способы (&~) получить тот же результат на си?

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

Добавлено: Чт окт 10, 2013 21:17:17
YS
Зависит от ситуации. Но обычно достаточно такого подхода.

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

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


У одного гуру прочитал : "Некоторые программисты полагают, что мировой запас скобок ограничен и используют их крайне редко" :) Прямо в точку и с юмором. Хотя излишне перегружать скобками тоже, imho, плохой стиль.

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

Добавлено: Чт окт 10, 2013 22:05:07
BCluster
Я научен уже горьким опытом, и скобки ставлю везде, потому что обработка разнится от компилятора к компилятору. Почему - не знаю. Но это так. Хотя в стандарте это как будто описано, но на деле иначе. Особенно IAR любит ерундой заниматься

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

Добавлено: Чт окт 10, 2013 22:19:04
Flasher
Вот как раз IAR и меньше всего ерундой занимается. А вот все остальные не столь строго стандарта придерживаются.

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

Добавлено: Пт окт 11, 2013 07:32:28
Kavka
Так как gcc последних версий, сейчас, тоже крут в стандартах, то остаётся CV. :)) :)) :))
PS: Замолкаю, замолкаю с оффтопом.

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

Добавлено: Пт окт 11, 2013 13:21:41
BCluster
Не знаю как для других платформ, а для х51 и мсп430 с иаром есть проблемы, и не только эти :)

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

Добавлено: Пт окт 11, 2013 19:36:35
YS
Кстати, о стандартах. :) MISRA C рекомендует всегда ставить скобочки.

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

Добавлено: Пт окт 11, 2013 19:52:45
ploop
Не будем спорить на чёт компиляторов, но скобки ставить надо. Хотя бы для более удобочитаемого кода.