Форум по микроконтроллерам: Кнопки и Условия - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Кнопки и Условия

#1 Пользователь офлайн   Sergey_Kostchev 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29 Апрель 18

Отправлено 07 Май 2018 - 15:58

Здравствуйте!

Попытался все уроки по гирляндам (бегущие и моргающие светодиоды) объединить в один проект. Получилось 6 вариантов. Для каждого выделил одну кнопку - работает.
Но 6 кнопок - многовато. Если оставлю 3 кнопки, то как можно указать их комбинации, чтобы исполнялся нужный код?
Попробовал либо схитрить (!(PINB&0b00000011)), но тогда он все равно выполняет 1й код, а соединяя с помощью &&, тогда у меня светодиоды начинают с ума сходить, и выполнять код один за другим уже без нажатия каких-либо кнопок.


Извините, что код криво лег, я его уже в третий раз правлю по предварительному просмотру, а он все равно мне влево вправо все скобки разбрасывает

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
	int a=0;
	int b=0;
    
	int speed=200;
	DDRD=0xFF;
	DDRB=0x00;
	PORTB = 0b00001111;
    
	while (1)
	{
		if (!(PINB&0b00000001)) // если 0 нажат
		{
			1-я гирлянда
		}
		else 
		{
       	if (!(PINB&0b00000010)) //  1 - нажат
       	{
       	2-я гирлянда
       	}
       	else 
       	{
 				if (!(PINB&0b00000100)) // 2 нажаты
             	{
					3-я гирлянда
                  }
                  else 
             	{
     					if  (!(PINB&0b00001000)) //3 нажаты
	                 		{
						4-я гирлянда
	                 		}
                     	else 
	                 		{
 								if (!(PINB&0b00000011)) // если 0 и 1 нажаты
 								{
                 			5-я гирлянда
                             	}
 			            		else 
 								{
         								if (!(PINB&00000100)&&(!(PINB&00000001)))
                                     	{
	                 				6-я гирлянда
								     	}
							}
					}
                  }
       	}
      }
  }
}



Стесняюсь спросить, а я вообще структуру-то хоть правильно построил: условие в условии в условии?

А чтобы увеличивать и уменьшать время задержки при мигании, можно связать переменную speed с нажатием кнопки? Я попробовал, но или компилятор ругался, или принимал, но никакой реакции на кнопки скорости не было...
0

#2 Пользователь офлайн   nick14 

  • Группа: Администраторы
  • Сообщений: 1 471
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 08 Май 2018 - 23:00

Условие неправильны.
Должно быть:
 if (проверка условия) {
  здесь код...
 } else if (проверка условия) {
   здесь код...
}


Лучше конечно делать это в прерывании, ну и дребезг контактов то же нужно учитывать.
0

#3 Пользователь офлайн   shindax 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 11 Май 18

Отправлено 11 Май 2018 - 09:56

Я как-то так раньше делал, на PIC только, но это непринципиально. Код у switch получается в среднем больше чем у if, но зато более наглядно

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
        int a=0;
        int b=0;
    
        int speed=200;
        DDRD=0xFF;
        DDRB=0x00;
        PORTB = 0b00001111;

        while (1)
        {
                if (!(PINB&0b00001111)) // если было нажатие
                {
                    delay_ms( 20 );// Ожидание окончания дребезга по нажатию
                    if (!(PINB&0b00001111)) // если нажатие продожается
                    {
                        switch( PINB )
                        {
                            case 1 : // действия по флагу '1';
                                     break ;
                            case 2 : // действия по флагу '2';
                                     break ;
                            case 3 : // действия по флагу '3';
                                     break ;
                            ...
                            default : // действия по умолчанию;
                                     break ;
                        }
                    }
                        while (!(PINB&0b00001111)); // Ждем опускание кнопок
                        delay_ms( 20 );// Ожидание окончания дребезга по опусканию
                }
        }
}
[size=2]
[/size]


0

#4 Пользователь офлайн   Sergey_Kostchev 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29 Апрель 18

Отправлено 12 Май 2018 - 20:22

По-видимому, я упорно продолжаю лажать с кодом. Опять каждый код по отдельности функционирует, а пытаясь, включить их в комбинацию из нескольких кнопок, начинается чехарда: В каждой комбинации, где используется 1 кнопка, программа выполняет только первый код.
if ((!(PINB&0b0000001))&&(!(PINB&0b0000010))) // если нажаты 1 и 2 кнопки
{1 код}
else  if ((!(PINB&0b00000001))&&(!(PINB&0b0000010))&&(!(PINB&0b0000100))) // нажаты 1, 2 и 3 кнопки
{2 код}
else if ((!(PINB&0b00000001))&&(!(PINB&0b0000010))&&(!(PINB&0b0000100))&&(!(PINB&0b0001000)))  // нажаты 1, 2, 3 и 4 кнопки
{3 код}
else if  ((!(PINB&0b00000100))&&(!(PINB&0b0000010))&&(!(PINB&0b0001000))) // нажаты 2, 3 и 4 кнопки
{4 код}
else  if ((!(PINB&0b00000001))&&(!(PINB&0b0000100))&&(!(PINB&0b0001000)))  // нажаты 1, 3 и 4 кнопки
{5 код}
else  if ((!(PINB&00001000))&&(!(PINB&0b0000010))) // нажаты 2 и 4 кнопки
{6 код}
else if ((!(PINB&00000001))&&(!(PINB&0b0001000))) // нажаты 1 и 4 кнопки
{}



Также чехарда, немного другая, но все же, наблюдается, если я пробую использовать комбинации кнопок так: Уроков по комбинациям кнопок я не нашел. Подскажите, что не так в конструкциях? И да, прерывания я еще не прошел. Пойду почитаю, спасибо за подсказку.


if (!(PINB&0b0000011)) // если нажаты 1 и 2 кнопки
{1 код}
else  if (!(PINB&0b00000111)) // нажаты 1, 2 и 3 кнопки
{2 код}
else if ((!(PINB&0b00001111)))  // нажаты 1, 2, 3 и 4 кнопки
{3 код}
else if  (!(PINB&0b00001110))// нажаты 2, 3 и 4 кнопки
{4 код}
else  if (!(PINB&0b00001101))  // нажаты 1, 3 и 4 кнопки
{5 код}
else  if (!(PINB&00001010)) // нажаты 2 и 4 кнопки
{6 код}
else if (!(PINB&00001001)) // нажаты 1 и 4 кнопки
{}

Сообщение отредактировал Sergey_Kostchev: 12 Май 2018 - 20:10

0

#5 Пользователь офлайн   nick14 

  • Группа: Администраторы
  • Сообщений: 1 471
  • Регистрация: 15 Февраль 11
  • ГородРыбинск

Отправлено 14 Май 2018 - 05:50

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

#6 Пользователь офлайн   Sergey_Kostchev 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 5
  • Регистрация: 29 Апрель 18

Отправлено 14 Май 2018 - 09:59

nick14,
Извините за дилетантский вопрос, а

между
if ((!(PINB&0b0000001))&&(!(PINB&0b0000010)))

и
if (!(PINB&0b0000011))

есть разница? Или я требую от программы одного и того же?

Иначе я на два фронта сразу экспериментирую и туда и сюда. Может, какой-то из них вообще неправильный?


По поводу одновременного нажатия. Я хотел использовать тумблеры: пока выключен 1, идет 1-й код. Как только переключаю вдобавок третий (четвертый или второй), наступает выполнение другого кода. Но прерываний я еще не использовал. Теперь, кажется, понимаю, почему он не переключается на другой код, когда мне нужно.
0

#7 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 899
  • Регистрация: 15 Февраль 11

Отправлено 16 Май 2018 - 23:04

Просмотр сообщенияSergey_Kostchev (14 Май 2018 - 09:59) писал:

между
if ((!(PINB&0b0000001))&&(!(PINB&0b0000010)))

и
if (!(PINB&0b0000011))

есть разница?

Есть.
В первом случае, условие выполнится только тогда, когда оба бита (0-вой и 1-ый) у PINB будут нулями.
Во втором случае - когда любой из этих двух битов будет нулём.
Не говорите что мне делать, и я не скажу куда Вам идти !
1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей