Страница 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
Не будем спорить на чёт компиляторов, но скобки ставить надо. Хотя бы для более удобочитаемого кода.