у меня есть проект часов на RTC с выводом времени на LCD 16x2 и установкой времени через 4 кнопки подключенные через резисторы на аналоговый вход. когда я добавил возможность настроить ЧАС, по принципу что я описал ниже все работало, когда добавил возможность установить минуты все работает только до момента нажатия кнопки далее чтоб перейти в режим установки текущего числа. тоесть минуты установить я могу но на нажатии кнопки далее уже реакции нет. Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с часами реального времени #include "TroykaRTC.h" #include <LiquidCrystal.h> // EEPROM — энергонезависимая память // библиотека для записи и считывания информации с EEPROM #include <EEPROM.h> // размер массива для времени с учётом завершающего нуля #define LEN_TIME 12 // размер массива для даты с учётом завершающего нуля #define LEN_DATE 12 // размер массива для дня недели с учётом завершающего нуля #define LEN_DOW 12 // создаём объект для работы с часами реального времени RTC clock; // опишем подключение дисплея LiquidCrystal lcd(4, 5, 10, 11, 12, 13); // добавим в проект переменные в которые будем записывать данные с часов int h=10; int m=25; int s=00; int d=8; int mo=5; int y=2015; int w=5; // добавим переменную в которую будем записывать сколько раз //была нажата кнопка чтоб отобразить необходимый пункт настройки int buttonset=0; int button= A0; void setup(){ // инициализация часов и дисплея clock.begin(); lcd.begin(16, 2); } void loop() { //запишем в переменные текущее показания с часов m= clock.getMinute(); s= clock.getSecond(); h= clock.getHour(); w= clock.getDOW(); d= clock.getDay(); mo= clock.getMonth(); y= clock.getYear(); // считываем нажатие кнопки buttonset и в зависимости от того какой режим // в данный момент выбран переходим в следующий режим // у меня подключены через резисторы 4 кнопки к аналоговому входу // при нажатии кнопки "УСТАНОВКА" на аналоговый вход подается значение =70 // при нажатии кнопки "+" значение равно 500 // при нажатии кнопки "-" значение равно 700 // при нажатии кнопки "далее" значение равно 950 int keyValue = analogRead(button); //если кнопка не нажата то значение buttonset=0 и на экран выводяться просто часы, //если buttonset=1 то выводятся установка часа // если buttonset=2 то выводятся установка минут // если buttonset=3 то выводятся установка дня //считываем нажалась ли кнопка, если да то к текущему значению прибавим 1 //и тем самым перейдем на сл екран с установкой часа if(keyValue>0&&keyValue<100&&buttonset==0){ buttonset=1; lcd.clear(); } //далее на экране установки часа при нажатии "+" или "-" меняем значение переменной h //и сразу устанавливаем это значение в часы чтоб оно отобразилось на экране if(keyValue>100&&keyValue<600&&buttonset==1){ if(h<23){ h=h+1; } else { lcd.clear(); h=00; } clock.set(h,m,00,d,mo,y,w); } if(keyValue>600&&keyValue<800&&buttonset==1){ if(h>0){ h= h-1; lcd.clear(); } else { h=23; } clock.set(h,m,00,d,mo,y,w); } //после нажатия кнопки "далее" добавляем к buttonset единицу чтоб отобразился другой экран if(keyValue>900&&keyValue<1000&&buttonset==1){ buttonset=buttonset+1; lcd.clear(); } // экран отобразился с начтройкой минут if(keyValue>100&&keyValue<600&&buttonset==2){ if(m<59){ m=m+1; } else { lcd.clear(); m=00; } clock.set(h,m,00,d,mo,y,w); } if(keyValue>600&&keyValue<800&&buttonset==2){ if(m>0){ m= m-1; lcd.clear(); } else { m=59; } clock.set(h,m,00,d,mo,y,w); } // после нажатия кнопки "далее" должен отобразиться экран настройки текущего числа if (keyValue>900&&keyValue<1000&&buttonset==2){ buttonset=buttonset+1; lcd.clear(); } if(keyValue>100&&keyValue<600&&buttonset==3){ if(d<31){ d=d+1; } else { lcd.clear(); d=1; } clock.set(h,m,00,d,mo,y,w); } if(keyValue>600&&keyValue<800&&buttonset==3){ if(d>0){ d= d-1; lcd.clear(); } else { d=31; } clock.set(h,m,00,d,mo,y,w); } // после установки числа нажимаем кнопку "далее" и попадаем на экран с отображением часов //где уже применились все наши коректировки if(keyValue>900&&keyValue<1000&&buttonset==3){ buttonset=0; lcd.clear(); } // массив для хранения текущего времени char time[LEN_TIME]={0}; // массив для хранения текущей даты char date[LEN_DATE]={0}; // массив для хранения текущего дня недели char dow[LEN_DOW]={0}; // запрашиваем данные с часов clock.read(); // сохраняем текущее время в массив time clock.getTimeStr(time, LEN_TIME); // сохраняем текущую дату в массив date clock.getDateStr(date, LEN_DATE); // сохраняем текущий день недели в массив dow clock.getDOWStr(dow, LEN_DOW); // выводим на дисплей текущее время или экраны настройки параметров в зависимости от того чему равно buttonset if (buttonset==0){ lcd.setCursor(11, 0); lcd.print(time); lcd.setCursor(0,0); lcd.print(date); lcd.setCursor(9, 1); lcd.print(dow); } if (buttonset==1) { lcd.setCursor(4, 0); lcd.print("Set Hour"); lcd.setCursor(6,1); lcd.print(h); } if (buttonset==2) { lcd.setCursor(4, 0); lcd.print("Set Minute"); lcd.setCursor(6,1); lcd.print(m); } if (buttonset==3) { lcd.setCursor(4, 0); lcd.print("Set Day"); lcd.setCursor(6,1); lcd.print(d); } // ждём пол секунды delay(500); }
Для начала вот вам функция обработки нажатой кнопки. Возвращает цифру от 0 до 5 (подписано). Для своей схемы подкорректировать показания пина. Уже упростит ваш код, а так же ускорит и возможно исправит: Код (C++): byte buttonPress () { // обработка нажатия кнопок на LСD (срабатывает после отжатия) byte bP = 0; int tx = analogRead (BUTTONS); if (tx < 60) { // right bP = 5; } else if (tx < 200) { // up bP = 3; } else if (tx < 350) { // down bP = 4; } else if (tx < 600) { // left bP = 2; } else if (tx < 800) { // select bP = 1; } if (tx < 800) { // ждем отжатия кнопки delay(10); while ((analogRead (BUTTONS)) < 800); } return bP; }