2016-10-08 26 views
0

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

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 & 0x0040) != 0) //if button1 is engaged 
     { 
     case 0: 
     ((button_in & 0x0080) != 0); //Statement: Button2 engages case0 
     PORTWrite(IOPORT_B, BIT_11); //State goes to 010 (BIT_11 lights up). 
     break; 

     default: ((button_in & 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 
    } 
    } 
} 
+0

Я думаю, что вам нужно, это состояние машины – Mobius

ответ

0

Во-первых, на мой взгляд, делать switch ((button_in & 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 
     } 
    } 
} 
+0

я пытался реализации, если заявление с самого начала, но это не сработало слишком гладко для меня. – Jeremiah

+0

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

+0

Выяснил это. Спасибо за ваш вклад. – Jeremiah