Количество переключений C для состояний увеличения

#c #count #switch-statement

#c #количество #оператор переключения

Вопрос:

Как я могу увеличить состояния с помощью конструкции switch. Нужно ли мне количество ? Я поместил выражение [((button_in amp; 0x0040) != 0)] в переключатель (выражение). Это дало мне первые два состояния, которые я намеревался. (1) Нажатие кнопки 1 выдает 0001. (2) Нажатие кнопки 2 выдает 0010. Я не совсем уверен в том, как запрограммировать нажатие кнопки 1 ДВАЖДЫ, чтобы получить 0010. Должен ли я реализовывать счетчик внутри цикла while? Могу ли я использовать выражение while в качестве подсчета? Должен ли я поместить еще один цикл while в каскад? Я хотел бы увеличить свои состояния. Существует 7 состояний: 0000, 0001 (5 центов), 0010 (10 центов), 0011 (15 центов), 0100 (20 центов), 1000 (25 центов), 0111 (изменение). Я обновил свой вопрос и код, чтобы попытаться четко отразить свое намерение. Я не программист, и мой друг упомянул, что когда я нажимаю кнопку; Я должен проверить текущее состояние; затем запрограммируйте мой код для этого. Он также упомянул двоичный калькулятор. Какой метод является наиболее эффективным? Спасибо

 int main() 
{
  char A; //placed for switch expression... (not needed?)
  int button_in = 0; // button is set for 0 (not-engaged)
  DeviceInit(); //set LED1 thru LED4 as digital output
  DelayInit(); //Initialize timer for delay
  int count; //maybe required for 5 button pushes. Requesting help with this

  while (1) //Can I initiate a count? for a second button push?
  { 
    button_in = PORTReadBits(IOPORT_A, BIT_6 | BIT_7); //Button 1 and button 2 defined
    if (button_in != 0) //if button is engaged utilize switch statement
    { 
      switch ((button_in amp; 0x0040) != 0) //if button1 is engaged
      { 
      case 0:
        ((button_in amp; 0x0080) != 0); //Statement: Button2 engages case0 
        PORTWrite(IOPORT_B, BIT_11); //State goes to 010 (BIT_11 lights up).
        break;

      default: ((button_in amp; 0x0040) != 0); //Statement: Button1 engages default. 
        PORTWrite(IOPORT_B, BIT_10);  //This is state 0001 (BIT_10) lights up.
        break;
      }

      DelayMs(100); //100millisecond delay for light shine
      PORTClearBits(IOPORT_B, BIT_10 | BIT_11 | BIT_12 | BIT_13); //ClearLEDs
    }
  }
}
  

Комментарии:

1. Я думаю, что вам нужен конечный автомат

Ответ №1:

Во-первых, на мой взгляд, switch ((button_in amp; 0x0040) != 0) следует избегать выполнения, поскольку вы можете заменить его простым if утверждением, которое будет более привычным и простым для чтения.

Затем, когда дело доходит до вашей проблемы с состоянием, в данном конкретном случае, когда ваш конечный автомат

 (o)-->(s1)-->(s2)-->(s3)-->(s4)-->(s5)-->(s6)-->((s7))
  

В котором переход, похоже, происходит каждый раз при нажатии кнопки 1, вы можете просто увеличить счетчик, указывающий, в каком состоянии вы находитесь в данный момент (по модулю 8, если вы хотите вернуться в исходное состояние из конечного). Правильное значение для записи IOPORT_B (приведенное [1] ниже) может быть определено либо после проверки двоичного значения вашего счетчика, либо вы можете сохранить его в массиве перед входом в цикл и его извлечением arr[state] . Выбор зависит от вашего приложения и значений.

 int main()
{
    int state = 0;
    while(1)
    {
      if (button 1 is pressed)
      {
        state = (state >= 7) ? 7 : (state   1);
        PORTWrite(IOPORT_B, ...);     // [1]
        DelayMs(100);                 // wait
        PORTClearBits(IOPORT_B, ...); // Clear what you want to clear
      } 
    } 
}
  

Комментарии:

1. Я попытался реализовать оператор if с самого начала, но у меня это получилось не слишком гладко.

2. Я не могу помочь намного больше без дополнительной информации. Это зависит от того, что вы PORTReadBits возвращаете. Но определенно, вы делаете странные вещи в своем коде. Как и утверждения сразу после case 0: и default это просто сравнение и не имеет смысла, поскольку вы не используете их результат. Возможно, вы действительно не понимаете switch это утверждение.

3. Понял это. Спасибо за ваш вклад.