Привет , прошу о помощи , не секрет нашёл его в инрнете , залил , но при перезаключение вверх и вниз , меню как БЕШАННЫЕ, бегают . Если не сложно подскажите что да как . Код (C++): /*+++++++++++++++++++++++++++++++++++++++++++++++++++ Author : Fahmi Ghani Date : 5 July 2015 Project : LCD Menu Function Component : LCD Keypad shield Description : Simple Menu function on LCD Button Function: Up/Down - change Menu Page Select - enter page Left - Exit Video Link: http://youtu.be/cMqif5ICS5M +++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display int keypad_pin = A0; int keypad_value = 0; int keypad_value_old = 0; char btn_push; byte mainMenuPage = 1; byte mainMenuPageOld = 1; byte mainMenuTotal = 4; void setup() { lcd.init(); // initialize the lcd lcd.clear(); lcd.backlight(); MainMenuDisplay(); delay(1000); } void loop() { btn_push = ReadKeypad(); MainMenuBtn(); if(btn_push == 'S')//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(ReadKeypad()!= 'L') { //Insert Task for Menu A here } } void MenuB() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Inside Menu B"); while(ReadKeypad()!= 'L') { //Insert Task for Menu B here } } void MenuC() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Inside Menu C"); while(ReadKeypad()!= 'L') { //Insert Task for Menu C here } } void MenuD() { lcd.clear(); lcd.setCursor(0,0); lcd.print("Inside Menu D"); while(ReadKeypad()!= 'L') { //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(btn_push == 'U') { mainMenuPage++; if(mainMenuPage > mainMenuTotal) mainMenuPage = 1; } else if(btn_push == 'D') { mainMenuPage--; if(mainMenuPage == 0) mainMenuPage = mainMenuTotal; } if(mainMenuPage != mainMenuPageOld) //only update display when page change { MainMenuDisplay(); mainMenuPageOld = mainMenuPage; } } char ReadKeypad() { /* Keypad button analog Value no button pressed 1023 select 741 left 513 down 454 up 341 right 0 мое 1 -0 2 -340 3 -453 4 -511 */ keypad_value = analogRead(keypad_pin); if(keypad_value < 50) // вниз return 'L'; else if(keypad_value < 400) return 'U'; // вних else if(keypad_value < 500) return 'D'; // вверх else if(keypad_value < 600) return 'S'; // ок } void WaitBtnRelease() { while( analogRead(keypad_pin) < 200){} }
Вот здесь сможеш найти ответ на свой вопрос https://sohabr.net/habr/post/251181/ Проблема в опросе кнопок, нужно устанавливать границы от и до Код (C++): if((keypad_value >300) && (keypad_value<400)) return 'U'; // вниз Примерно так!