Выбор выполняемых функций по нажатию кнопки. Си

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Аватара пользователя
Волчок
Родился
Сообщения: 6
Зарегистрирован: Вт май 28, 2013 11:14:08

Выбор выполняемых функций по нажатию кнопки. Си

Сообщение Волчок »

Здравствуйте, товарищи! Надеюсь протянете мне свою мохнатую руку помощи.
Недавно занялся изучением микроконтроллеров AVR. Языков программирования раньше не изучал вообще, потому прошу по возможности отнестись к глупости моей по возможности лояльнее. Вопрос собственно вот в чем. Есть у меня в программе несколько функций, каждая из которых выполняет так сказать свой определенный режим свечения линейки светодиодов (ну там бегущие огоньки всякие и т.п.). Функции эти я изобразил и по отдельности они работают как хочется. Предположим что с включением сего устройства отображается один режим. Но вот как сделать так, чтобы по нажатию кнопочки выполнялась следующая функция (режим работы)? Вот упрощенно и корявенько скелет (иль как там его) программы:

Код: Выделить всё

...
function_1
{
  ...
  while(1)
  {мяу-мяу-мяу}
}

function_2
{
  ...
  while(1)
  {мяу-мяу-мяу}
}

main
{
 ...
 function_1;
 function_2;
}

Не знаю на сколько понятно высказал проблему, но уповаю на мудрость котов. Если что, пишу под тиньку13, вот.
Заранее спасибо :)
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение vAv »

Литературы вагон и маленькая тележка, исходников - за полжизни не пересмотреть... Даже на форуме немеряно и того и другого. Лень искать или что?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение ChipKiller »

как сделать так, чтобы по нажатию кнопочки выполнялась следующая функция
... добавить проверку нажатия внутри function_1, function_2, иначе выйти из while(1) не выйдет

Код: Выделить всё

function_x
{
  ...
  while(1)
  { if(!button.x) goto exit; // button.x==0?
мяу-мяу-мяу}
exit:
}
Аватара пользователя
Волчок
Родился
Сообщения: 6
Зарегистрирован: Вт май 28, 2013 11:14:08

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение Волчок »

vAv писал(а):Лень искать или что?

Комментировать не буду. Любой ответ имеет право на жизнь. Спасибо
ChipKiller писал(а): добавить проверку нажатия внутри function_1, function_2, иначе выйти из while(1) не выйдет

Спасибо большое. Буду пробовать. :)
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение pokk »

я думаю так понятнее

Код: Выделить всё

...
function_1
{
 {мяу-мяу-мяу}
}

function_2
{
 {мяу-мяу-мяу}
}
function_3
{
 {мяу-мяу-мяу}
}

main
{
while (1){
switch(number){   // number это счётчик нажатий на кнопку
    case 0:function_1
    case 1:function_2
    case 2:function_3

}
//тут опрашиваем кнопки и  изменяем number  в соответствии с этом выбирается нужная функция

}
}
Аватара пользователя
Волчок
Родился
Сообщения: 6
Зарегистрирован: Вт май 28, 2013 11:14:08

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение Волчок »

pokk писал(а):я думаю так понятнее

Спасибо большое. Кроме того, что понятно еще и заработало :))
С goto у меня не получилось, надо будет разобраться почему. Со switch заработало.
Объявляю вам, ребята, огромную благодарность за помощь и советы :beer:
Аватара пользователя
kisssko
Открыл глаза
Сообщения: 52
Зарегистрирован: Пт янв 10, 2014 02:05:13
Откуда: Воронеж

Re: Выбор выполняемых функций по нажатию кнопки. Си

Сообщение kisssko »

C запозданием, конечно... Но может кому ещё пригодится из начинающих.

Есть ещё в Си такая штука, как указатели на функции.

Код: Выделить всё

typedef void(*myfuncptr)(void);

void func1(void)
{
    do_somthing();
}

void func2(void)
{
    do_somthing();
}

void func3(void)
{
    do_somthing();
}

void func4(void)
{
    do_somthing();
}

myfuncptr funclist[4]={func1,func2,func3,func4};

int main(void)
{
    int funcnum=0;
    while(1)
    {
          funclist[funcnum++]();
          if(funcnum>3)funcnum=0;
          wait_for_button();
    }
    return 0;
}

Ответить

Вернуться в «Периферия»