операция &~

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Открыл глаза
Сообщения: 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);	//Сигнал записи команды
...
}
Возник такой вопрос, как и в каком порядке производится следующая операция &~?

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

Сообщение urry »

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

Сообщение 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);
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение encyclon »

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

Сообщение YS »

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

Сообщение encyclon »

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

Сообщение YS »

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

Сообщение Jack_A »

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

Сообщение BCluster »

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

Сообщение Flasher »

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

Сообщение Kavka »

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

Сообщение BCluster »

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

Сообщение YS »

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

Сообщение ploop »

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

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