Помогите переделать код

Тема в разделе "Arduino & Shields", создана пользователем bogdan_z, 18 дек 2016.

  1. bogdan_z

    bogdan_z Нерд

    Необходимо осуществить переход с помощью матричной клавиатуры по меню.
    Вот тут код для меню http://pastebin.com/HKPsWB6z пытался переделать под клавиатуру, безуспешно

    Код (C++):
    #include <Keypad.h>
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)
    const byte ROWS = 4;
    const byte COLS = 3;

    char keys[ROWS][COLS] = {
      {'1','2','3'},
      {'4','5','6'},
      {'7','8','9'},
      {'*','0','#'}
    };

    byte rowPins[ROWS] = {5, 4, 3, 2};
    byte colPins[COLS] = {8, 7, 6};

    byte mainMenuPage = 1;
    byte mainMenuPageOld = 1;
    byte mainMenuTotal = 4;

    char btn_push;

    //int keypad_pin = A0;
    //int keypad_value = 0;
    //int keypad_value_old = 0;

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    char key = keypad.getKey();
    void setup()
    {
      lcd.begin(16,2);
      MainMenuDisplay();
      delay(1000);
    }
     
    void loop()
    {
        char key = keypad.getKey();
     
        MainMenuBtn();
     
        if(key == keys[3][2])//enter selected menu
        {
            //WaitBtnRelease();
            switch (mainMenuPage)
            {
                case 1:
                  MenuA();
                  break;
                case 2:
                  MenuB();
                  break;
                case 3:
                  MenuC();
                  break;
                case 4:
                  MenuD();
                  break;
            }
              MainMenuDisplay();
              //WaitBtnRelease();
        }
     
        delay(10);
    }//--------------- End of loop() loop ---------------------
    void MenuA()
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Inside Menu A");
     
        while(key != keys[1][0])
        {
            //Insert Task for Menu A here
         
        }
    }
    void MenuB()
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Inside Menu B");
     
        while(key != keys[1][0])
        {
            //Insert Task for Menu B here
         
        }
    }
    void MenuC()
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Inside Menu C");
     
        while(key != keys[1][0])
        {
            //Insert Task for Menu C here
         
        }
    }
    void MenuD()
    {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Inside Menu D");
     
        while(key != keys[1][0])
        {
            //Insert Task for Menu D here
         
        }
    }
    void MainMenuDisplay()
    {
        lcd.clear();
        lcd.setCursor(0,0);
        switch (mainMenuPage)
        {
            case 1:
              lcd.print("1. Menu A");
              break;
            case 2:
              lcd.print("2. Menu B");
              break;
            case 3:
              lcd.print("3. Menu C");
              break;
            case 4:
              lcd.print("4. Menu D");
              break;
        }
    }
    void MainMenuBtn()
    {
        //WaitBtnRelease();
        if(key == keys[0][1])
        {
            mainMenuPage++;
            if(mainMenuPage > mainMenuTotal)
              mainMenuPage = 1;
        }
        else if(key == keys[2][1])
        {
            mainMenuPage--;
            if(mainMenuPage == 0)
              mainMenuPage = mainMenuTotal;  
        }
     
        if(mainMenuPage != mainMenuPageOld) //only update display when page change
        {
            MainMenuDisplay();
            mainMenuPageOld = mainMenuPage;
        }
    }
     
     
  2. qwone

    qwone Гик

    У вас принципиальная ошибка. Сначало надо определиться что у вас за клавиатура
    1 вариант - клавиатура для ввода цифровых значений , где 0-9 это цифры. * забой последней введеной цифры # ввод значения.
    2 вариант 4 клавиши управления положением в меню и кнопка выбора для ввода.
    3 вариант гибрид 2-х вариантов. Но тогда надо ввести переменую , что-бы клавиатура определяла что сейчас с нее вводят. Вариант сложный, но такова жизнь.
     
  3. ostrov

    ostrov Гуру

    Вот на этом месте без дополнительного кода, включающего опрос клавиатуры, все зависнет:
    Код (C++):
        while(key != keys[1][0])
       {
           //Insert Task for Menu A here
       
       }
    Если конечно клава не опрашивается в прерывании, но судя по этой строке, не опрашивается:
    Код (C++):
        char key = keypad.getKey();
    Вообще весьма странный код. Точнее несистемный. Все делается как то поочередно, все равно что через delay(), не люблю такого.
     
  4. bogdan_z

    bogdan_z Нерд

    Третий вариант, необходимо передвигаться по меню и чтобы была возможность ввода данных.
     
  5. bogdan_z

    bogdan_z Нерд

    Есть какие то примеры меню? И можно ли как то этот код сделать более оптимизированным?
     
  6. vvr

    vvr Инженерище

    нельзя
    его надо писать с нуля
     
  7. bogdan_z

    bogdan_z Нерд

    Поможете начать, мыслю дать?
     
  8. vvr

    vvr Инженерище

    примеры работы с матричной клавиатурой - определяетесь какие кнопки что будут делать с вашим меню
    потом прописываете что выводится на дисплей
     
  9. bogdan_z

    bogdan_z Нерд

    по образцу того кода?