Необходимо осуществить переход с помощью матричной клавиатуры по меню. Вот тут код для меню 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; } }
У вас принципиальная ошибка. Сначало надо определиться что у вас за клавиатура 1 вариант - клавиатура для ввода цифровых значений , где 0-9 это цифры. * забой последней введеной цифры # ввод значения. 2 вариант 4 клавиши управления положением в меню и кнопка выбора для ввода. 3 вариант гибрид 2-х вариантов. Но тогда надо ввести переменую , что-бы клавиатура определяла что сейчас с нее вводят. Вариант сложный, но такова жизнь.
Вот на этом месте без дополнительного кода, включающего опрос клавиатуры, все зависнет: Код (C++): while(key != keys[1][0]) { //Insert Task for Menu A here } Если конечно клава не опрашивается в прерывании, но судя по этой строке, не опрашивается: Код (C++): char key = keypad.getKey(); Вообще весьма странный код. Точнее несистемный. Все делается как то поочередно, все равно что через delay(), не люблю такого.
примеры работы с матричной клавиатурой - определяетесь какие кнопки что будут делать с вашим меню потом прописываете что выводится на дисплей