Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

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

Вт май 28, 2013 11:40:04

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

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

main
{
 ...
 function_1;
 function_2;
}

Не знаю на сколько понятно высказал проблему, но уповаю на мудрость котов. Если что, пишу под тиньку13, вот.
Заранее спасибо :)

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

Вт май 28, 2013 12:05:44

Литературы вагон и маленькая тележка, исходников - за полжизни не пересмотреть... Даже на форуме немеряно и того и другого. Лень искать или что?

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

Вт май 28, 2013 12:07:26

как сделать так, чтобы по нажатию кнопочки выполнялась следующая функция
... добавить проверку нажатия внутри function_1, function_2, иначе выйти из while(1) не выйдет
Код:
function_x
{
  ...
  while(1)
  { if(!button.x) goto exit; // button.x==0?
мяу-мяу-мяу}
exit:
}

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

Вт май 28, 2013 12:51:14

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

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

Спасибо большое. Буду пробовать. :)

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

Вт май 28, 2013 13:04:10

я думаю так понятнее
Код:
...
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  в соответствии с этом выбирается нужная функция

}
}

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

Вт май 28, 2013 16:35:27

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

Спасибо большое. Кроме того, что понятно еще и заработало :))
С goto у меня не получилось, надо будет разобраться почему. Со switch заработало.
Объявляю вам, ребята, огромную благодарность за помощь и советы :beer:

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

Пн мар 17, 2014 01:49:00

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;
}

Ответить