Переключить регистр с while /, если внутри него возникли ошибки - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над программой, которая выполняет дебетовую транзакцию с помощью кнопок в качестве ключей. До сих пор я получал сообщение по умолчанию «Hello», отображаемое в самом начале, пока не была нажата кнопка 1 или кнопка 2 (PB1 и PB2). Кажется, у меня возникла проблема с моим заявлением о переключении. Вот что я пытаюсь сделать: инициализировать с помощью «Hello» на экране и подождать, пока пользователь нажмет кнопку. Если нажата PB1, перейдите к случаю 2. В случае 2 он отобразит общую сумму и предложит пользователю нажать либо PB1 для подтверждения, либо PB2 для отмены. Если нажата PB1, перейдите к случаю 3. Если нажата PB2, вернитесь к случаю 1 и снова представляйте сообщение по умолчанию, пока пользователь не нажмет кнопку. Случай 3 затем просто определит, с какого аккаунта они берутся, и перейдет к случаю 4, чтобы принять пин-код # (я не включил это, но по сути это процесс, который я пытаюсь завершить).

Состояния кнопок pu sh равны '1', когда они НЕ нажаты, а когда нажаты, они равны '0'. Вот почему я попытался использовать while (PB1 == 0), чтобы при нажатии на PB1 сделать следующее. Я также пытался использовать if (PB1 == 0), чтобы сделать то же самое, но я, похоже, застрял в oop просто печатать привет снова и снова в обоих случаях. Затем, в то время как в этом l oop, если я нажимаю PB1, он сразу же перемещается к «Всего составляет $ 20,75. Нажмите 1 для OK или 2 для ОТМЕНЫ» на «Отменено», после чего он просто повторяет «Отменено», вместо того, чтобы вернуться к Case 1. «Отменено» следует печатать только в том случае, если нажата PB2, а это еще не то, что я сделал, но оно все еще печатает.

Любая помощь будет принята с благодарностью.

int beginProcess = 1;


  while (1)
  {

      switch (beginProcess)
      {

          case 1:
            printf("Hello \r\n");
            PB1 = readPin1;

            while (PB1 == 0)
            {
                beginProcess = 2;
            }
            break;

          case 2:
              printf("Total is $20.75 \r\n");
              printf("Press 1 for OK or 2 for CANCEL\r\n");

              PB1 = readPin1;
              PB2 = readPin2;

              while (PB1 == 0)
              {
                  beginProcess = 3;
              }
              while (PB2 == 0)
              {
                  printf("Cancelled \r\n");
                  beginProcess = 1;
              }
             break;

          case 3:

              printf("Press 1 for chequing \r\n");
              printf("Press 2 for savings \r\n");

              PB1 = readPin1;
              PB2 = readPin2;

              while (PB1 == 0)
              {
                  beginProcess = 4;
              }

              while (PB2 == 0)
              {
                  beginProcess = 4;
              }
              break;
     }
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Я считаю, что это тип кода, который вы ищете. Вы хотите, чтобы ваши циклы while блокировались во время ожидания ввода. Но вам нужно постоянно читать оба вывода для ввода, чтобы менять экраны. Этот код должен блокироваться в каждом, пока l oop ДО обнаружения входа. Клавиша постоянно считывает состояние вывода в течение времени, пока l oop!

#include <stdio.h>

int readPin1(void)
{
    return 1;
}

int readPin2(void)
{
    return 0;
}

int main()
{

    int beginProcess = 1;
    int PB1 = 0;
    int PB2 = 0;

    while (1)
    {

        switch (beginProcess)
        {

            case 1:
                //printf("%i \r\n",beginProcess);
                while (PB1 == 0)
                {
                    PB1 = readPin1();
                    beginProcess = 2;
                }
            break;

            case 2:
                printf("Total is $20.75 \r\n");
                printf("Press 1 for OK or 2 for CANCEL\r\n");

                while (PB1 == 0 || PB2 == 0)
                {
                    PB1 = readPin1();
                    PB2 = readPin2();
                    if(PB1)
                    {
                        beginProcess = 3;
                    }

                    if(PB2)
                    {
                      printf("Cancelled \r\n");
                      beginProcess = 1;
                    }
                }

                break;

                case 3:
                    printf("Press 1 for chequing \r\n");
                    printf("Press 2 for savings \r\n");

                    PB1 = readPin1();
                    PB2 = readPin1();

                    while (PB1 == 0 || PB2 == 0)
                    {
                        PB1 = readPin1();
                        PB2 = readPin1();

                        if(PB1)
                        {
                             beginProcess = 4;
                        }

                        if(PB2)
                        {
                             beginProcess = 4;
                        }
                    }
              break;

              default:
              break;
          }
    }

    return 0;
}

Ниже выводится, когда функция readPin1 () всегда возвращает 1 и существует регистр по умолчанию. Output

0 голосов
/ 07 апреля 2020

Сначала замените циклы while в операторе switch на if logi c. Вторая марка beginProcess a volatile int

...