Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
encyclon
Открыл глаза
Сообщения: 42 Зарегистрирован: Вт окт 30, 2012 10:33:28
Сообщение
encyclon » Пн сен 30, 2013 10:29:55
Добрых суток, рассматривал пример инициализации и работы 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
Откуда: Винница
Контактная информация:
Сообщение
urry » Пн сен 30, 2013 10:43:41
encyclon
Открыл глаза
Сообщения: 42 Зарегистрирован: Вт окт 30, 2012 10:33:28
Сообщение
encyclon » Пн сен 30, 2013 11:46:39
Ок, с этим понятно, спасибо.
А может ещё подскажете, почему тут используется две конструкции а не какая нибудь одна?
Код: Выделить всё
//Программа передачи команд в ЖКИ 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
Откуда: Планета Земля
Контактная информация:
Сообщение
Аlex » Пн сен 30, 2013 11:55:18
Потому, что в одном случае RS сбрасывается (посылается команда), а в другом устанавливается (посылаются данные).
encyclon
Открыл глаза
Сообщения: 42 Зарегистрирован: Вт окт 30, 2012 10:33:28
Сообщение
encyclon » Пн сен 30, 2013 11:58:45
спасибо, что-то ступил)
YS
Друг Кота
Сообщения: 7518 Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:
Сообщение
YS » Чт окт 10, 2013 19:48:25
Вообще, лучше не надеяться на предопределенный порядок операций, а указывать его явно, скобками.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
encyclon
Открыл глаза
Сообщения: 42 Зарегистрирован: Вт окт 30, 2012 10:33:28
Сообщение
encyclon » Чт окт 10, 2013 20:01:21
А есть ли другие способы (&~) получить тот же результат на си?
YS
Друг Кота
Сообщения: 7518 Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:
Сообщение
YS » Чт окт 10, 2013 21:17:17
Зависит от ситуации. Но обычно достаточно такого подхода.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Jack_A
Друг Кота
Сообщения: 6307 Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk
Сообщение
Jack_A » Чт окт 10, 2013 21:25:00
YS писал(а): Вообще, лучше не надеяться на предопределенный порядок операций, а указывать его явно, скобками.
У одного гуру прочитал : "Некоторые программисты полагают, что мировой запас скобок ограничен и используют их крайне редко"
Прямо в точку и с юмором. Хотя излишне перегружать скобками тоже, imho, плохой стиль.
BCluster
Собутыльник Кота
Сообщения: 2512 Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:
Сообщение
BCluster » Чт окт 10, 2013 22:05:07
Я научен уже горьким опытом, и скобки ставлю везде, потому что обработка разнится от компилятора к компилятору. Почему - не знаю. Но это так. Хотя в стандарте это как будто описано, но на деле иначе. Особенно IAR любит ерундой заниматься
Flasher
Мудрый кот
Сообщения: 1802 Зарегистрирован: Ср сен 07, 2011 21:40:30
Сообщение
Flasher » Чт окт 10, 2013 22:19:04
Вот как раз IAR и меньше всего ерундой занимается. А вот все остальные не столь строго стандарта придерживаются.
Kavka
Мудрый кот
Сообщения: 1810 Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины
Сообщение
Kavka » Пт окт 11, 2013 07:32:28
Так как gcc последних версий, сейчас, тоже крут в стандартах, то остаётся CV.
PS: Замолкаю, замолкаю с оффтопом.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
BCluster
Собутыльник Кота
Сообщения: 2512 Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:
Сообщение
BCluster » Пт окт 11, 2013 13:21:41
Не знаю как для других платформ, а для х51 и мсп430 с иаром есть проблемы, и не только эти
YS
Друг Кота
Сообщения: 7518 Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:
Сообщение
YS » Пт окт 11, 2013 19:36:35
Кстати, о стандартах.
MISRA C рекомендует всегда ставить скобочки.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
ploop
Модератор
Сообщения: 13490 Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.
Сообщение
ploop » Пт окт 11, 2013 19:52:45
Не будем спорить на чёт компиляторов, но скобки ставить надо. Хотя бы для более удобочитаемого кода.