Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Разбираемся с правильностью написании условий

Страниц (1): [1]
 

1. Not_invented - 09 Августа, 2012 - 23:18:36 - перейти к сообщению
Помогите разобраться с условием:

if (!(PINC & (0<<PINC1)))
{ // (PIND0 = 0)
PORTA |= _BV(PA5);
}

if (PINC & (0<<PINC1))
{
PORTA &= ~_BV(PA5);
}
как это работает..??
2. Artem - 10 Августа, 2012 - 11:10:14 - перейти к сообщению
если порт с1 не равен нулю то установить 1 на выходе 5 порта а, если порт с1 равен нулю то установить 0 на выходе 5 порта а Улыбка вроде всё просто Улыбка
3. Not_invented - 10 Августа, 2012 - 18:26:43 - перейти к сообщению
Мне бы хотелось узнать механизм.... Улыбка по обезьяннему я могу это сделать, но не понимая правильность написания условия, я не могу делать следующие действия, например залипание кнопки... Улыбка разжуйте мне пожалуйста...Улыбка
4. m_w - 10 Августа, 2012 - 21:30:28 - перейти к сообщению
Ответ на этот вопрос весьма объемен.

Полная форма условного оператора:
if( /* выражение */ )
{
/* код1 */
}
else
{
/* код2 */
}
/* код3 */

Если выражение в круглых скобках истинно, то выполняется код1 и сразу за ним код3. Если выражение в круглых скобках ложно, то выполняется код2 и сразу за ним код3.

Сокращенная форма условного оператора:
if( /* выражение */ )
{
/* код1 */
}
/* код3 */

Если выражение в круглых скобках истинно, то выполняется код1 и сразу за ним код3. Если выражение в круглых скобках ложно, то сразу выполняется код3.

Выражение в круглых скобках ложно, если в результате его вычисления получен ноль. Все, что не ноль является истинным.

Пара примеров:
if( 1 )
{
PORTD = 0b00000001;
}
else
{
PORTD = 0b00000010;
}
PORTD = 0b00000000;

При выполнении этого кода на PD0 будет на несколько тактов установлена 1, а затем 0. На PD1 никогда не будет 1.
if( 0 )
{
PORTD = 0b00000001;
}
else
{
PORTD = 0b00000010;
}
PORTD = 0b00000000;

При выполнении этого кода на PD1 будет на несколько тактов установлена 1, а затем 0. На PD0 никогда не будет 1.

Чтобы узнать, что там на ножке микроконтроллера разработчики придумали специальные регистры: PINB для порта B, PIND для порта D и т.д.

if( PINB )
{
PORTD = 0b00000001;
}
else
{
PORTD = 0b00000000;
}

Если на порту В на всех ножках 0, то на PD0 будет 0. Если хотябы на одной из ножек установить 1, то на PD0 также будет 1.

Если я сказал что-то понятное, намекни и тогда я продолжу.
5. Predator - 10 Августа, 2012 - 21:36:41 - перейти к сообщению
m_w +100
если надо "расшифровать" (перевести с С на русский язык) именно тот пример - я продолжу (ну или кто-нибудь меня опередит).
6. cjAndrews - 10 Августа, 2012 - 22:09:54 - перейти к сообщению
Artem пишет:
а, если
???
(Добавление)
залипание кнопок - очеь просто! цикл ставишь на 10 (100, 1000 - зависит от частоты) цыклов -если кнопка жалась более 50% времени- значит кнопка была нажата.