GrabDuck

RTC (DS1307) с ARDUINO | Аппаратная платформа Arduino

:

mik пишет:

void read_rtc1307()
{

hr_00=RTC.get(DS1307_HR,true);
mn_00=RTC.get(DS1307_MIN,false);
sc_00=RTC.get(DS1307_SEC,false);
DD_00=RTC.get(DS1307_DATE,false);
MM_00=RTC.get(DS1307_MTH,false);
YY_00=RTC.get(DS1307_YR,false);

  lcd.begin(16,2);
  sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00);
  lcd.setCursor(0,0);
 lcd.print(buffer); 
  sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00);
  lcd.setCursor(0,1);
 lcd.print(buffer);
delay (1000);
  lcd.clear();
}

 Все заработало как надо, теперь работаю над кнопками установки времени...........

 

И с чего бы вашей программе работать, если вы почти не оставили ей шансов среагировать на нажатие кнопок. Сделать это она может лишь в короткие промежутки времени между длительными блокировками микроконтроллера. 

lcd.begin(16,2); - здесь производится инициализация дисплея. С очисткой от имеющейся на нем информации.

[...]

lcd.print(buffer);
delay (1000);
lcd.clear(); - здесь вы выводите информацию, ждете секунду (а по существу блокируете микроконтроллер на все это время), а потом стираете все.

Лучше сделать так: в начале процедуры стереть информацию с экрана (lcd.clear();), потом сформировать выводимый текст и вывести его на дисплей (lcd.print(buffer);). И ВСЕ! никаких инициализаций дисплея не требуется - она должна выполняться ОДИН РАЗ - в setup(). И НИКАКИХ delay(1000) - это самый надежный способ угробить любой работающий алгоритм.

Чтобы не слишком часто выполнять вывод на экран, в главном цикле (функция loop()) вызов процедуры read_rtc1307() делайте не каждый раз, а, например, по итогам проверки текущего времени:

if(millis()%1000==0) read_rtc1307(); 

(вывод каждую тысячную миллисекунду)

или if(millis()%1000<2) read_rtc1307();

(во втором случае - вывод каждую тысячную и тысяча первую миллисекунду (сделано с запасом, т.к. я не знаю, за сколько миллисекунд у вас прокручивается цикл )

Более аккуратный вариант - ввести переменную, в которой будет храниться время (в миллисекундах) последнего вывода на дисплей и определять момент очередного обновления текста на дисплее по количеству миллисекунд, прошедших с момента последнего обновления:

if(millis()-lastLcdModiified>1000) read_rtc1307();

и в начале процедуры read_rtc1307(): lastLcdModiified = millis();

Только после того, как избавитесь от вызванных безумными задержками ( = блокировками микроконтроллера) побочных эффектов (грубо: кнопка нажимается, а контроллер никак на это не реагирует), начинайте отлавливать другие баги.

И, поскольку опыта в программировании у вас пока с Гулькин ..., не пытайтесь реализовать сразу весь алгоритм - с работающей основы и добавляйте по одной реакции/функции. Только отладив очередной блок операторов, переходите к вводу нового. Иначе просто утонете в отладке.