<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; Простые точные часы на  LCD 1602]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=455&amp;type=atom" />
	<updated>2022-08-25T17:27:34Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=455</id>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=6571#p6571" />
			<content type="html"><![CDATA[<p>все работает!<br />изменил форму некоторых цифр под свои предпочтения (1, 4, 7)</p><div class="codebox"><pre><code>void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break;
    case 1: d1 = 32, d2 = 32, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break;
    case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 32, d3 = 6, d4 = 2, d5 = 8, d6 = 6; break;
    case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break;
    case 7: d1 = 2, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break;
    case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-08-25T17:27:34Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=6571#p6571</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=6567#p6567" />
			<content type="html"><![CDATA[<p>Благодарю!<br />буду пробовать.</p>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-08-22T16:42:37Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=6567#p6567</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=6566#p6566" />
			<content type="html"><![CDATA[<p>Все верно.</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-08-22T16:38:36Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=6566#p6566</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=6564#p6564" />
			<content type="html"><![CDATA[<p>здравствуйте еще раз!<br />моя новая хотелка, к которой хочется привязать скетч из предыдущего поста</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/08/536a68c9f7fa301cbd05c8696a277ee2.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2022/08/536a68c9f7fa301cbd05c8696a277ee2.jpg" /></span></p><p>исходный скетч</p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;EEPROM.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7


byte v1[8] = {0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111};

byte v2[8] = {0b00111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v4[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v5[8] = {0b11100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11100, 0b11100};
byte v6[8] = {0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100};
byte v7[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b00111};
byte v8[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

unsigned long  times, times0, times1;
int sec, min, hour;
int min_alarm, hour_alarm;
int menu;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x;
bool w, alarm;


void setup() {
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
  lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // (16000000/((15624+1)x1024))=1 Hz
  //OCR1A = 15624;       // корректировка точности часов
  //OCR1A = 15587;//предварительный расчет
  
  OCR1A = 15587;

  TCCR1B |= (1 &lt;&lt; WGM12);
  // Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i &lt; 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }
  hour_alarm = EEPROM.read(0); min_alarm = EEPROM.read(1); alarm = EEPROM.read(2);
}

void loop() {
  if (millis() - times &lt; 500) {
    w = 1;
  }
  if (millis() - times &gt;= 500 &amp;&amp; millis() - times &lt; 600) {
    w = 0;
  }
  if (millis() - times &gt; 600) {
    times = millis();
  }
  if (digitalRead(6) == LOW) {
    menu++;
    lcd.clear();
    if (menu &gt; 4) {
      menu = 0;
    } delay(300);
  }

  if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {    //сброс секунд
      sec = 0;
    }
  }
  /////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
  if (menu == 0) {
    a[0] = hour / 10;
    a[1] = hour % 10;
    a[2] = min / 10;
    a[3] = min % 10;
    a[4] = sec / 10;
    a[5] = sec % 10;
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    /////////// мигание точек в режиме часы ////////////////////////////////
    if (millis() - times1  &gt; 900) {
      lcd.setCursor(6, 0); lcd.print(&quot; &quot;); lcd.setCursor(6, 1); lcd.print(&quot; &quot;);
      times1 = millis() ;
      delay(100);
    }
    else {
      lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    }
    ////////////////////////////////////////////////////////////////////////////////////////

    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
    if (alarm == 0) {
      lcd.setCursor(13, 0);
      //lcd.print(&quot;off&quot;);
    }
    if (alarm == 1) {
      lcd.setCursor(13, 0);
      lcd.print(&quot; on&quot;);
    }
  }
  ///////////////////////////////////////////////////////////////////////////////////////////////
  ///// korr hour
  if (menu == 1) {
    if (digitalRead(5) == LOW) {
      hour++;
      if (hour &gt; 23) {
        hour = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour--;
      if (hour &lt; 0) {
        hour = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }
  ///// korr min
  if (menu == 2) {
    if (digitalRead(5) == LOW) {
      min++;
      if (min &gt; 59) {
        min = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min--;
      if (min &lt; 0) {
        min = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = 10;
      a[3] = 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }

  ///// korr hour alarm
  if (menu == 3) {
    if (digitalRead(5) == LOW) {
      hour_alarm++;
      times = millis();
      w = 1;
      if (hour_alarm &gt; 23) {
        hour_alarm = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour_alarm--;
      times = millis();
      w = 1;
      if (hour_alarm &lt; 0) {
        hour_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }

  ///// korr min alarm
  if (menu == 4) {
    if (digitalRead(5) == LOW) {
      min_alarm++;
      times = millis();
      w = 1;
      if (min_alarm &gt; 59) {
        min_alarm = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min_alarm--;
      times = millis();
      w = 1;
      if (min_alarm &lt; 0) {
        min_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = 10;
      a[3] = 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }


  /// BUZZER
  if (alarm == 1 &amp;&amp; (hour * 100 + min == hour_alarm * 100 + min_alarm)) {
    buzzer();
  }

  if (millis() - times &gt; 10000 &amp;&amp; w == 1) {
    EEPROM.update(0, hour_alarm);
    EEPROM.update(1, min_alarm);
    EEPROM.update(2, alarm);
    menu = 0;
    w = 0;
  }
  delay(100);
}// loop

void buzzer() {
  for (int i = 0; i &lt; 200; i++) { // пищалка
    digitalWrite(3, HIGH); delay(1); digitalWrite(3, LOW); delay(1);
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 1: d1 = 32, d2 = 2, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break; case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 3, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break; case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break; case 7: d1 = 1, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }
  lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0); lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
  lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1); lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}

ISR(TIMER1_COMPA_vect) {
  sec++;
  if (sec &gt; 59) {
    sec = 0;
    min++;
  }
  if (min &gt; 59) {
    min = 0;
    hour++;
  }
  if (hour &gt; 23) {
    hour = 0;
  }
}</code></pre></div><p>правильно ли я мыслю по поводу изменений в исходном скетче или чего то не хватает?</p><div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;EEPROM.h&gt;
#include &lt;LiquidCrystal_I2C.h&gt;
//Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&amp;item=45&amp;download=1

LiquidCrystal_I2C lcd(0x27, 16, 2); // Устанавливаем дисплей
byte v1[8] = {0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111};
byte v2[8] = {0b00111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v4[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v5[8] = {0b11100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11100, 0b11100};
byte v6[8] = {0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100};
byte v7[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b00111};
byte v8[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

unsigned long  times, times0, times1;
int sec, min, hour;
int min_alarm, hour_alarm;
int menu;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x;
bool w, alarm;


void setup() {
  Wire.begin();

  lcd.init(); lcd.backlight(); // Включаем подсветку дисплея
  //lcd.noBacklight();// Выключаем подсветку дисплея

  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
  lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // (16000000/((15624+1)x1024))=1 Hz
  //OCR1A = 15624;       // корректировка точности часов
  //OCR1A = 15587;//предварительный расчет

  OCR1A = 15587;

  TCCR1B |= (1 &lt;&lt; WGM12);
  // Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i &lt; 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }
  hour_alarm = EEPROM.read(0); min_alarm = EEPROM.read(1); alarm = EEPROM.read(2);
}

void loop() {
  if (millis() - times &lt; 500) {
    w = 1;
  }
  if (millis() - times &gt;= 500 &amp;&amp; millis() - times &lt; 600) {
    w = 0;
  }
  if (millis() - times &gt; 600) {
    times = millis();
  }
  if (digitalRead(6) == LOW) {
    menu++;
    lcd.clear();
    if (menu &gt; 4) {
      menu = 0;
    } delay(300);
  }

  if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {    //сброс секунд
      sec = 0;
    }
  }
  /////////////////// ЧАСЫ /////////////////////////////////////////////////
  if (menu == 0) {
    a[0] = hour / 10;
    a[1] = hour % 10;
    a[2] = min / 10;
    a[3] = min % 10;
    a[4] = sec / 10;
    a[5] = sec % 10;
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    /////////// мигание точек в режиме часы ////////////////////////////////
    if (millis() - times1  &gt; 900) {
      lcd.setCursor(6, 0); lcd.print(&quot; &quot;); lcd.setCursor(6, 1); lcd.print(&quot; &quot;);
      times1 = millis() ;
      delay(100);
    }
    else {
      lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    }
    ///////////////////////////////////////////////////////////////////////////

    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
    if (alarm == 0) {
      lcd.setCursor(13, 0);
      //lcd.print(&quot;off&quot;);
    }
    if (alarm == 1) {
      lcd.setCursor(13, 0);
      lcd.print(&quot; on&quot;);
    }
  }
  /////////////////////////////////////////////////////////////////////////////////
  ///// korr hour
  if (menu == 1) {
    if (digitalRead(5) == LOW) {
      hour++;
      if (hour &gt; 23) {
        hour = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour--;
      if (hour &lt; 0) {
        hour = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }
  ///// korr min
  if (menu == 2) {
    if (digitalRead(5) == LOW) {
      min++;
      if (min &gt; 59) {
        min = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min--;
      if (min &lt; 0) {
        min = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = 10;
      a[3] = 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }

  ///// korr hour alarm
  if (menu == 3) {
    if (digitalRead(5) == LOW) {
      hour_alarm++;
      times = millis();
      w = 1;
      if (hour_alarm &gt; 23) {
        hour_alarm = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour_alarm--;
      times = millis();
      w = 1;
      if (hour_alarm &lt; 0) {
        hour_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }

  ///// korr min alarm
  if (menu == 4) {
    if (digitalRead(5) == LOW) {
      min_alarm++;
      times = millis();
      w = 1;
      if (min_alarm &gt; 59) {
        min_alarm = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min_alarm--;
      times = millis();
      w = 1;
      if (min_alarm &lt; 0) {
        min_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = 10;
      a[3] = 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }


  /// BUZZER
  if (alarm == 1 &amp;&amp; (hour * 100 + min == hour_alarm * 100 + min_alarm)) {
    buzzer();
  }

  if (millis() - times &gt; 10000 &amp;&amp; w == 1) {
    EEPROM.update(0, hour_alarm);
    EEPROM.update(1, min_alarm);
    EEPROM.update(2, alarm);
    menu = 0;
    w = 0;
  }
  delay(100);
}// loop

void buzzer() {
  for (int i = 0; i &lt; 200; i++) { // пищалка
    digitalWrite(3, HIGH); delay(1); digitalWrite(3, LOW); delay(1);
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break;
    case 1: d1 = 32, d2 = 2, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break;
    case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 3, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break;
    case 7: d1 = 1, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break;
    case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }
  lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0);
  lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
  lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1);
  lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}

ISR(TIMER1_COMPA_vect) {
  sec++;
  if (sec &gt; 59) {
    sec = 0;
    min++;
  }
  if (min &gt; 59) {
    min = 0;
    hour++;
  }
  if (hour &gt; 23) {
    hour = 0;
  }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-08-22T16:31:40Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=6564#p6564</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5454#p5454" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>v1ct0r пишет:</cite><blockquote><p>сделал разделительные точки &quot;:&quot; мигающими</p></blockquote></div><p>переделал на millis<br /></p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;EEPROM.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7


byte v1[8] = {0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111};

byte v2[8] = {0b00111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v4[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v5[8] = {0b11100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11100, 0b11100};
byte v6[8] = {0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100};
byte v7[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b00111};
byte v8[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

unsigned long  times, times0, times1;
int sec, min, hour;
int min_alarm, hour_alarm;
int menu;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x;
bool w, alarm;


void setup() {
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
  lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // (16000000/((15624+1)x1024))=1 Hz
  //OCR1A = 15624;       // корректировка точности часов
  //OCR1A = 15587;//предварительный расчет
  
  OCR1A = 15586;

  TCCR1B |= (1 &lt;&lt; WGM12);
  // Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i &lt; 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }
  hour_alarm = EEPROM.read(0); min_alarm = EEPROM.read(1); alarm = EEPROM.read(2);
}

void loop() {
  if (millis() - times &lt; 500) {
    w = 1;
  }
  if (millis() - times &gt;= 500 &amp;&amp; millis() - times &lt; 600) {
    w = 0;
  }
  if (millis() - times &gt; 600) {
    times = millis();
  }
  if (digitalRead(6) == LOW) {
    menu++;
    lcd.clear();
    if (menu &gt; 4) {
      menu = 0;
    } delay(300);
  }

  if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {    //сброс секунд
      sec = 0;
    }
  }
  /////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
  if (menu == 0) {
    a[0] = hour / 10;
    a[1] = hour % 10;
    a[2] = min / 10;
    a[3] = min % 10;
    a[4] = sec / 10;
    a[5] = sec % 10;
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    /////////// мигание точек в режиме часы ////////////////////////////////
    if (millis() - times1  &gt; 900) {
      lcd.setCursor(6, 0); lcd.print(&quot; &quot;); lcd.setCursor(6, 1); lcd.print(&quot; &quot;);
      times1 = millis() ;
      delay(100);
    }
    else {
      lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    }
    ////////////////////////////////////////////////////////////////////////////////////////

    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
    if (alarm == 0) {
      lcd.setCursor(13, 0);
      //lcd.print(&quot;off&quot;);
    }
    if (alarm == 1) {
      lcd.setCursor(13, 0);
      lcd.print(&quot; on&quot;);
    }
  }
  ///////////////////////////////////////////////////////////////////////////////////////////////
  ///// korr hour
  if (menu == 1) {
    if (digitalRead(5) == LOW) {
      hour++;
      if (hour &gt; 23) {
        hour = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour--;
      if (hour &lt; 0) {
        hour = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }
  ///// korr min
  if (menu == 2) {
    if (digitalRead(5) == LOW) {
      min++;
      if (min &gt; 59) {
        min = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min--;
      if (min &lt; 0) {
        min = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = 10;
      a[3] = 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }

  ///// korr hour alarm
  if (menu == 3) {
    if (digitalRead(5) == LOW) {
      hour_alarm++;
      times = millis();
      w = 1;
      if (hour_alarm &gt; 23) {
        hour_alarm = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour_alarm--;
      times = millis();
      w = 1;
      if (hour_alarm &lt; 0) {
        hour_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }

  ///// korr min alarm
  if (menu == 4) {
    if (digitalRead(5) == LOW) {
      min_alarm++;
      times = millis();
      w = 1;
      if (min_alarm &gt; 59) {
        min_alarm = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min_alarm--;
      times = millis();
      w = 1;
      if (min_alarm &lt; 0) {
        min_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = 10;
      a[3] = 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }


  /// BUZZER
  if (alarm == 1 &amp;&amp; (hour * 100 + min == hour_alarm * 100 + min_alarm)) {
    buzzer();
  }

  if (millis() - times &gt; 10000 &amp;&amp; w == 1) {
    EEPROM.update(0, hour_alarm);
    EEPROM.update(1, min_alarm);
    EEPROM.update(2, alarm);
    menu = 0;
    w = 0;
  }
  delay(100);
}// loop

void buzzer() {
  for (int i = 0; i &lt; 200; i++) { // пищалка
    digitalWrite(3, HIGH); delay(1); digitalWrite(3, LOW); delay(1);
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 1: d1 = 32, d2 = 2, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break; case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 3, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break; case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break; case 7: d1 = 1, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }
  lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0); lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
  lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1); lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}

ISR(TIMER1_COMPA_vect) {
  sec++;
  if (sec &gt; 59) {
    sec = 0;
    min++;
  }
  if (min &gt; 59) {
    min = 0;
    hour++;
  }
  if (hour &gt; 23) {
    hour = 0;
  }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-19T10:38:50Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5454#p5454</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5443#p5443" />
			<content type="html"><![CDATA[<p>сделал разделительные точки &quot;:&quot; мигающими</p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;EEPROM.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7


byte v1[8] = {0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111};

byte v2[8] = {0b00111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v4[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v5[8] = {0b11100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11100, 0b11100};
byte v6[8] = {0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100};
byte v7[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b00111};
byte v8[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

unsigned long times, times0;
int sec, min, hour;
int min_alarm, hour_alarm;
int menu;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x;
bool w, alarm;


void setup() {
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
  lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // (16000000/((15624+1)x1024))=1 Hz
  //OCR1A = 15624;       // корректировка точности часов
  //OCR1A = 15587;
  OCR1A = 15570;
  TCCR1B |= (1 &lt;&lt; WGM12);
  // Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i &lt; 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }
  hour_alarm = EEPROM.read(0); min_alarm = EEPROM.read(1); alarm = EEPROM.read(2);
}

void loop() {
  if (millis() - times &lt; 500) {
    w = 1;
  }
  if (millis() - times &gt;= 500 &amp;&amp; millis() - times &lt; 600) {
    w = 0;
  }
  if (millis() - times &gt; 600) {
    times = millis();
  }
  if (digitalRead(6) == LOW) {
    menu++;
    lcd.clear();
    if (menu &gt; 4) {
      menu = 0;
    } delay(300);
  }

  if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {    //сброс секунд
      sec = 0;
    }


  }
  /////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
  if (menu == 0) {
    a[0] = hour / 10;
    a[1] = hour % 10;
    a[2] = min / 10;
    a[3] = min % 10;
    a[4] = sec / 10;
    a[5] = sec % 10;
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;); delay(500);
    lcd.setCursor(6, 0); lcd.print(&quot; &quot;); lcd.setCursor(6, 1); lcd.print(&quot; &quot;); delay(500); // мигание точек в режиме часы
    
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
    if (alarm == 0) {
      lcd.setCursor(13, 0);
      //lcd.print(&quot;off&quot;);
    }
    if (alarm == 1) {
      lcd.setCursor(13, 0);
      lcd.print(&quot; on&quot;);
    }
  }
  ///////////////////////////////////////////////////////////////////////////////////////////////
  ///// korr hour
  if (menu == 1) {
    if (digitalRead(5) == LOW) {
      hour++;
      if (hour &gt; 23) {
        hour = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour--;
      if (hour &lt; 0) {
        hour = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }
  ///// korr min
  if (menu == 2) {
    if (digitalRead(5) == LOW) {
      min++;
      if (min &gt; 59) {
        min = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min--;
      if (min &lt; 0) {
        min = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = 10;
      a[3] = 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }

  ///// korr hour alarm
  if (menu == 3) {
    if (digitalRead(5) == LOW) {
      hour_alarm++;
      times = millis();
      w = 1;
      if (hour_alarm &gt; 23) {
        hour_alarm = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour_alarm--;
      times = millis();
      w = 1;
      if (hour_alarm &lt; 0) {
        hour_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }

  ///// korr min alarm
  if (menu == 4) {
    if (digitalRead(5) == LOW) {
      min_alarm++;
      times = millis();
      w = 1;
      if (min_alarm &gt; 59) {
        min_alarm = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min_alarm--;
      times = millis();
      w = 1;
      if (min_alarm &lt; 0) {
        min_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = 10;
      a[3] = 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }


  /// BUZZER
  if (alarm == 1 &amp;&amp; (hour * 100 + min == hour_alarm * 100 + min_alarm)) {
    buzzer();
  }

  if (millis() - times &gt; 10000 &amp;&amp; w == 1) {
    EEPROM.update(0, hour_alarm);
    EEPROM.update(1, min_alarm);
    EEPROM.update(2, alarm);
    menu = 0;
    w = 0;
  }
  delay(100);
}// loop

void buzzer() {
  for (int i = 0; i &lt; 200; i++) { // пищалка
    digitalWrite(3, HIGH); delay(1); digitalWrite(3, LOW); delay(1);
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 1: d1 = 32, d2 = 2, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break; case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 3, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break; case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break; case 7: d1 = 1, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }
  lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0); lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
  lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1); lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}

ISR(TIMER1_COMPA_vect) {
  sec++;
  if (sec &gt; 59) {
    sec = 0;
    min++;
  }
  if (min &gt; 59) {
    min = 0;
    hour++;
  }
  if (hour &gt; 23) {
    hour = 0;
  }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-17T18:23:10Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5443#p5443</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5442#p5442" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>liman324 пишет:</cite><blockquote><p>Тестируйте, схема без изменений</p></blockquote></div><p>Ну что сказать - я доволен, часы идут, код коррекции точности очень компактный, по сравнению с тем что придумал я.<br />Кстати можно ли подобным&nbsp; образом сделать коррекцию точности и в скетче из первого поста?</p><p>Пытался разобраться как получаются большие цифры, но дальше стартовых &quot;нулей&quot; дело не идет, т.е. каким образом формируются остальные цифры мне пока недоступно <img src="http://forum.rcl-radio.ru/img/smilies/sad.png" width="15" height="15" alt="sad" /></p><p>Сделал кое какие изменения в коде под свои капризы.</p><p>мой вариант скетча:<br /></p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;EEPROM.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7


byte v1[8] = {0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111};

byte v2[8] = {0b00111, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};
byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v4[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111, 0b11111};
byte v5[8] = {0b11100, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000, 0b11100, 0b11100};
byte v6[8] = {0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100};
byte v7[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b00111};
byte v8[8] = {0b11111, 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

unsigned long times, times0;
int sec, min, hour;
int min_alarm, hour_alarm;
int menu;
byte a[6], d1, d2, d3, d4, d5, d6, e1, e2, e3, x;
bool w, alarm;


void setup() {
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1); lcd.createChar(2, v2); lcd.createChar(3, v3); lcd.createChar(4, v4);
  lcd.createChar(5, v5); lcd.createChar(6, v6); lcd.createChar(7, v7); lcd.createChar(8, v8);
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  // (16000000/((15624+1)x1024))=1 Hz
  //OCR1A = 15624;       // корректировка точности часов
  //OCR1A = 15587; 
  OCR1A = 15570;
  TCCR1B |= (1 &lt;&lt; WGM12);
  // Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if (EEPROM.read(100) != 0) {
    for (int i = 0; i &lt; 101; i++) {
      EEPROM.update(i, 0); // очистка памяти при первом включении
    }
  }
  hour_alarm = EEPROM.read(0); min_alarm = EEPROM.read(1); alarm = EEPROM.read(2);
}

void loop() {
  if (millis() - times &lt; 500) {
    w = 1;
  }
  if (millis() - times &gt;= 500 &amp;&amp; millis() - times &lt; 600) {
    w = 0;
  }
  if (millis() - times &gt; 600) {
    times = millis();
  }
  if (digitalRead(6) == LOW) {
    menu++;
    lcd.clear();
    if (menu &gt; 4) {
      menu = 0;
    } delay(300);
  }

  if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {
      sec = 0;
    }


  }
  /////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
  if (menu == 0) {
    a[0] = hour / 10;
    a[1] = hour % 10;
    a[2] = min / 10;
    a[3] = min % 10;
    a[4] = sec / 10;
    a[5] = sec % 10;
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
    if (alarm == 0) {
      lcd.setCursor(13, 0);
      //lcd.print(&quot;off&quot;);
    }
    if (alarm == 1) {
      lcd.setCursor(13, 0);
      lcd.print(&quot; on&quot;);
    }
  }
  ///////////////////////////////////////////////////////////////////////////////////////////////
  ///// korr hour
  if (menu == 1) {
    if (digitalRead(5) == LOW) {
      hour++;
      if (hour &gt; 23) {
        hour = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour--;
      if (hour &lt; 0) {
        hour = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }
  ///// korr min
  if (menu == 2) {
    if (digitalRead(5) == LOW) {
      min++;
      if (min &gt; 59) {
        min = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min--;
      if (min &lt; 0) {
        min = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = min / 10;
      a[3] = min % 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    else {
      a[0] = hour / 10;
      a[1] = hour % 10;
      a[2] = 10;
      a[3] = 10;
      a[4] = sec / 10;
      a[5] = sec % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(14, 1); lcd.print(a[4]); lcd.setCursor(15, 1); lcd.print(a[5]);
  }

  ///// korr hour alarm
  if (menu == 3) {
    if (digitalRead(5) == LOW) {
      hour_alarm++;
      times = millis();
      w = 1;
      if (hour_alarm &gt; 23) {
        hour_alarm = 23;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      hour_alarm--;
      times = millis();
      w = 1;
      if (hour_alarm &lt; 0) {
        hour_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = 10;
      a[1] = 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }

  ///// korr min alarm
  if (menu == 4) {
    if (digitalRead(5) == LOW) {
      min_alarm++;
      times = millis();
      w = 1;
      if (min_alarm &gt; 59) {
        min_alarm = 59;
      } delay(100);
    }
    if (digitalRead(4) == LOW) {
      min_alarm--;
      times = millis();
      w = 1;
      if (min_alarm &lt; 0) {
        min_alarm = 0;
      } delay(100);
    }
    if (w == 1) {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = min_alarm / 10;
      a[3] = min_alarm % 10;
    }
    else {
      a[0] = hour_alarm / 10;
      a[1] = hour_alarm % 10;
      a[2] = 10;
      a[3] = 10;
    }
    for (x = 0; x &lt; 4; x++) {
      switch (x) {
        case 0: e1 = 0, e2 = 1, e3 = 2; break;
        case 1: e1 = 3, e2 = 4, e3 = 5; break;
        case 2: e1 = 7, e2 = 8, e3 = 9; break;
        case 3: e1 = 10, e2 = 11, e3 = 12; break;
      } digit();
    }
    lcd.setCursor(6, 0); lcd.print(&quot;.&quot;); lcd.setCursor(6, 1); lcd.print(&quot;.&quot;);
    lcd.setCursor(13, 0); lcd.print(&quot;KOR&quot;); lcd.setCursor(13, 1); lcd.print(&quot;ALR&quot;);
  }


  /// BUZZER
  if (alarm == 1 &amp;&amp; (hour * 100 + min == hour_alarm * 100 + min_alarm)) {
    buzzer();
  }

  if (millis() - times &gt; 10000 &amp;&amp; w == 1) {
    EEPROM.update(0, hour_alarm);
    EEPROM.update(1, min_alarm);
    EEPROM.update(2, alarm);
    menu = 0;
    w = 0;
  }
  delay(100);
}// loop

void buzzer() {
  for (int i = 0; i &lt; 200; i++) { // пищалка
    digitalWrite(3, HIGH); delay(1); digitalWrite(3, LOW); delay(1);
  }
}

void digit() {
  switch (a[x]) {
    case 0: d1 = 1, d2 = 8, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 1: d1 = 32, d2 = 2, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 2: d1 = 2, d2 = 8, d3 = 6, d4 = 1, d5 = 4, d6 = 5; break; case 3: d1 = 2, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 4: d1 = 1, d2 = 3, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break; case 5: d1 = 1, d2 = 4, d3 = 5, d4 = 7, d5 = 3, d6 = 6; break;
    case 6: d1 = 1, d2 = 4, d3 = 5, d4 = 1, d5 = 3, d6 = 6; break; case 7: d1 = 1, d2 = 8, d3 = 6, d4 = 32, d5 = 32, d6 = 6; break;
    case 8: d1 = 1, d2 = 4, d3 = 6, d4 = 1, d5 = 3, d6 = 6; break; case 9: d1 = 1, d2 = 4, d3 = 6, d4 = 7, d5 = 3, d6 = 6; break;
    case 10: d1 = 32, d2 = 32, d3 = 32, d4 = 32, d5 = 32, d6 = 32; break;
  }
  lcd.setCursor(e1, 0); lcd.write((uint8_t)d1); lcd.setCursor(e2, 0); lcd.write((uint8_t)d2); lcd.setCursor(e3, 0); lcd.write((uint8_t)d3);
  lcd.setCursor(e1, 1); lcd.write((uint8_t)d4); lcd.setCursor(e2, 1); lcd.write((uint8_t)d5); lcd.setCursor(e3, 1); lcd.write((uint8_t)d6);
}

ISR(TIMER1_COMPA_vect) {
  sec++;
  if (sec &gt; 59) {
    sec = 0;
    min++;
  }
  if (min &gt; 59) {
    min = 0;
    hour++;
  }
  if (hour &gt; 23) {
    hour = 0;
  }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-17T17:13:19Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5442#p5442</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5437#p5437" />
			<content type="html"><![CDATA[<p>проблему устранил<br />не возможно было корректировать часы и минуты, <br />кнопки &quot;+&quot; и &quot;-&quot; всегда работали как, вкл/выкл будильника.<br />также ввел обнуление секунд.<br />ну и удалил избыточные, на мой взгляд команды.<br />было<br /></p><div class="codebox"><pre><code>  if((digitalRead(5)==LOW||digitalRead(4)==LOW)&amp;&amp;digitalRead(6)==HIGH&amp;&amp;alarm==0){lcd.clear();alarm=1;times=millis();w=1;lcd.setCursor(0,0);lcd.print(&quot;   ALARM ON &quot;);delay(1500);}
  if((digitalRead(5)==LOW||digitalRead(4)==LOW)&amp;&amp;digitalRead(6)==HIGH&amp;&amp;alarm==1){lcd.clear();alarm=0;times=millis();w=1;lcd.setCursor(0,0);lcd.print(&quot;   ALARM OFF&quot;);delay(1500);}
  </code></pre></div><p>стало<br /></p><div class="codebox"><pre><code> if (menu == 0) {
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 0) {
      lcd.clear();
      alarm = 1;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM ON &quot;);
      delay(1000);
    }
    if (digitalRead(4) == LOW  &amp;&amp; alarm == 1) {
      lcd.clear();
      alarm = 0;
      times = millis();
      w = 1;
      lcd.setCursor(0, 0);
      lcd.print(&quot;   ALARM OFF&quot;);
      delay(1000);
    }
    if (digitalRead(5) == LOW) {
      sec = 0;
    }</code></pre></div><p>буду мучить дальше <img src="http://forum.rcl-radio.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-16T18:11:20Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5437#p5437</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5432#p5432" />
			<content type="html"><![CDATA[<p>благодарю <span class="bbu"><em><strong>liman324</strong></em></span><br />скетч грузится, цифры большие, но есть проблема<br />попробую сначала сам разобраться, если не получится буду просить помощи <img src="http://forum.rcl-radio.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-16T17:04:17Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5432#p5432</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5427#p5427" />
			<content type="html"><![CDATA[<p>Тестируйте, схема без изменений</p><p>Если не нажимать D6, то кнопки D4 D5 активируют и деактивируют будильник</p><p>При нажатии D6<br />1 нажатие&nbsp; - корр часов<br />2 - корр минут<br />3 корр часов буд<br />4 корр мин буд</p><p>Время будильника заносится в память</p><p>Часы работаю от таймера 1, он 16 -битный, если есть погрешность хода меняйте параметр регистра OCR1A:</p><p>// (16000000/((15624+1)x1024))=1 Hz<br />&nbsp; OCR1A = <strong>15624</strong>;</p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;EEPROM.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

byte v1[8] = {0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111,0b00111};
byte v2[8] = {0b00111,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000};      
byte v3[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v4[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b11111,0b11111};
byte v5[8] = {0b11100,0b11100,0b00000,0b00000,0b00000,0b00000,0b11100,0b11100};
byte v6[8] = {0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100,0b11100};
byte v7[8] = {0b00000,0b00000,0b00000,0b00000,0b00000,0b00000,0b00111,0b00111};
byte v8[8] = {0b11111,0b11111,0b00000,0b00000,0b00000,0b00000,0b00000,0b00000}; 

unsigned long times,times0;
int sec,min,hour;
int min_alarm,hour_alarm;
int menu;
byte a[6],d1,d2,d3,d4,d5,d6,e1,e2,e3,x;
bool w,alarm;


void setup() {
  lcd.begin(16, 2);// LCD 16X2
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
    cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
// (16000000/((15624+1)x1024))=1 Hz
  OCR1A = 15624;
  TCCR1B |= (1 &lt;&lt; WGM12);
// Prescaler 1024
  TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);
  TIMSK1 |= (1 &lt;&lt; OCIE1A);
  sei();
  if(EEPROM.read(100)!=0){for(int i=0;i&lt;101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  hour_alarm = EEPROM.read(0);min_alarm = EEPROM.read(1);alarm = EEPROM.read(2);
}

void loop(){
  if(millis()-times&lt;500){w=1;}
  if(millis()-times&gt;=500&amp;&amp;millis()-times&lt;600){w=0;}
  if(millis()-times&gt;600){times=millis();}
  if(digitalRead(6)==LOW){menu++;lcd.clear();if(menu&gt;4){menu=0;}delay(300);}
  if((digitalRead(5)==LOW||digitalRead(4)==LOW)&amp;&amp;menu==0&amp;&amp;alarm==0){lcd.clear();alarm=1;times=millis();w=1;lcd.setCursor(0,0);lcd.print(&quot;   ALARM ON &quot;);delay(1500);}
  if((digitalRead(5)==LOW||digitalRead(4)==LOW)&amp;&amp;menu==0&amp;&amp;alarm==1){lcd.clear();alarm=0;times=millis();w=1;lcd.setCursor(0,0);lcd.print(&quot;   ALARM OFF&quot;);delay(1500);}
  
/////////////////// ЧАСЫ ///////////////////////////////////////////////////////////////////
if(menu==0){
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=min/10;
     a[3]=min%10;
     a[4]=sec/10;
     a[5]=sec%10;
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
   lcd.setCursor(6,0);lcd.print(&quot;.&quot;);lcd.setCursor(6,1);lcd.print(&quot;.&quot;);
   lcd.setCursor(14,1);lcd.print(a[4]);lcd.setCursor(15,1);lcd.print(a[5]);  
  if(alarm==0){lcd.setCursor(13,0);lcd.print(&quot;OFF&quot;);}
  if(alarm==1){lcd.setCursor(13,0);lcd.print(&quot; ON&quot;);} 
} 
///////////////////////////////////////////////////////////////////////////////////////////////
///// korr hour
if(menu==1){
  if(digitalRead(5)==LOW){hour++;if(hour&gt;23){hour=23;}delay(500);}
  if(digitalRead(4)==LOW){hour--;if(hour&lt;0){hour=0;}delay(500);}
  if(w==1){
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=min/10;
     a[3]=min%10;
     a[4]=sec/10;
     a[5]=sec%10;
  }
  else{
     a[0]=10;
     a[1]=10;
     a[2]=min/10;
     a[3]=min%10;
     a[4]=sec/10;
     a[5]=sec%10;
    }
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
   lcd.setCursor(6,0);lcd.print(&quot;.&quot;);lcd.setCursor(6,1);lcd.print(&quot;.&quot;);
   lcd.setCursor(14,1);lcd.print(a[4]);lcd.setCursor(15,1);lcd.print(a[5]);
}
///// korr min
if(menu==2){
  if(digitalRead(5)==LOW){min++;if(min&gt;59){min=59;}delay(500);}
  if(digitalRead(4)==LOW){min--;if(min&lt;0){min=0;}delay(500);}
  if(w==1){
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=min/10;
     a[3]=min%10;
     a[4]=sec/10;
     a[5]=sec%10;
  }
  else{
     a[0]=hour/10;
     a[1]=hour%10;
     a[2]=10;
     a[3]=10;
     a[4]=sec/10;
     a[5]=sec%10;
    }
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
   lcd.setCursor(6,0);lcd.print(&quot;.&quot;);lcd.setCursor(6,1);lcd.print(&quot;.&quot;);
   lcd.setCursor(14,1);lcd.print(a[4]);lcd.setCursor(15,1);lcd.print(a[5]);
}

///// korr hour alarm
if(menu==3){
  if(digitalRead(5)==LOW){hour_alarm++;times=millis();w=1;if(hour_alarm&gt;23){hour_alarm=23;}delay(500);}
  if(digitalRead(4)==LOW){hour_alarm--;times=millis();w=1;if(hour_alarm&lt;0){hour_alarm=0;}delay(500);}
  if(w==1){
     a[0]=hour_alarm/10;
     a[1]=hour_alarm%10;
     a[2]=min_alarm/10;
     a[3]=min_alarm%10;
  }
  else{
     a[0]=10;
     a[1]=10;
     a[2]=min_alarm/10;
     a[3]=min_alarm%10;
    }
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
   lcd.setCursor(6,0);lcd.print(&quot;.&quot;);lcd.setCursor(6,1);lcd.print(&quot;.&quot;);
   lcd.setCursor(13,0);lcd.print(&quot;KOR&quot;);lcd.setCursor(13,1);lcd.print(&quot;ALR&quot;);
}

///// korr min alarm
if(menu==4){
  if(digitalRead(5)==LOW){min_alarm++;times=millis();w=1;if(min_alarm&gt;59){min_alarm=59;}delay(500);}
  if(digitalRead(4)==LOW){min_alarm--;times=millis();w=1;if(min_alarm&lt;0){min_alarm=0;}delay(500);}
  if(w==1){
     a[0]=hour_alarm/10;
     a[1]=hour_alarm%10;
     a[2]=min_alarm/10;
     a[3]=min_alarm%10;
  }
  else{
     a[0]=hour_alarm/10;
     a[1]=hour_alarm%10;
     a[2]=10;
     a[3]=10;
    }
   for(x=0;x&lt;4;x++){
    switch(x){
        case 0: e1=0,e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
   }digit();}
   lcd.setCursor(6,0);lcd.print(&quot;.&quot;);lcd.setCursor(6,1);lcd.print(&quot;.&quot;);
   lcd.setCursor(13,0);lcd.print(&quot;KOR&quot;);lcd.setCursor(13,1);lcd.print(&quot;ALR&quot;);
}


/// BUZZER
if(alarm==1 &amp;&amp; (hour*100+min==hour_alarm*100+min_alarm)){buzzer();}

if(millis()-times&gt;10000 &amp;&amp; w==1){EEPROM.update(0,hour_alarm);EEPROM.update(1,min_alarm);EEPROM.update(2,alarm);menu=0;w=0;} 
delay(100);
}// loop

void buzzer(){
      for (int i = 0; i &lt; 200; i++) { // пищалка
      digitalWrite(3, HIGH);delay(1);digitalWrite(3, LOW);delay(1);}
      }

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 10: d1=32,d2=32,d3=32,d4=32,d5=32,d6=32;break;
}
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

ISR(TIMER1_COMPA_vect){
  sec++;
  if(sec&gt;59){sec=0;min++;}
  if(min&gt;59){min=0;hour++;}
  if(hour&gt;23){hour=0;}
  }  </code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2022-02-16T14:10:02Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5427#p5427</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5424#p5424" />
			<content type="html"><![CDATA[<p>И так ходють ходики довольно точно, но...<br />Хочется большего, а именно больших циферок в режиме &quot; только часы&quot;, например таких, как здесь<br /><a href="http://rcl-radio.ru/?p=66530">http://rcl-radio.ru/?p=66530</a><br />тема форума<br /><a href="http://forum.rcl-radio.ru/viewtopic.php?id=66">http://forum.rcl-radio.ru/viewtopic.php?id=66</a></p><p>и тут я застрял, не хватает пока знаний в написании кода<br />Вариантов решения может быть 2<br />1. доработать скетч выше приведенный, наверно нужно будет добавить к 1602 модуль I2C для LCD на PCF8574<br />2. упростить схему из <a href="http://rcl-radio.ru/?p=66530">http://rcl-radio.ru/?p=66530</a><br />удалив модуль DS3231&nbsp; и запустить часы при помощи таймера</p><p>прошу помощи!</p>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-15T19:04:08Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5424#p5424</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Простые точные часы на  LCD 1602]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=5423#p5423" />
			<content type="html"><![CDATA[<p>Приветствую всех!<br />Люблю простые решения.<br />Мой девиз — «все гениальное просто, чем проще, тем надежнее».<br />на просторах нета наткнулся на эти часы<br /> <a href="http://rcl-radio.ru/?p=43068&amp;cpage=1#comment-5774">http://rcl-radio.ru/?p=43068&amp;cpage=1#comment-5774</a><br />решил их повторить и доработать(довести до ума), чтобы это были действительно ЧАСЫ, а не пародия на них(ни в коем случае&nbsp; не в обиду автору - замечательная заготовка для затравки <img src="http://forum.rcl-radio.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /> )<br />Для 1 варианта кода этих часов(мне не нужны лишние «навороты») ввел свои коррективы.<br />1. Чуть подправил схему, изменив под нее код, убрав резисторы и запитав кнопки от «земли»<br />2. ввел в программу обнуление секунд, нажатием двух кнопок.<br />3. внедрил программную коррекцию для компенсации погрешности кварца, добившись точности 1-2(в течении часа)-3(очень редко) секунды в течении суток, в целом за сутки отклонения пока не было.<br />4. при выключенном будильнике на дисплее только часы и ничего лишнего, отвлекающего внимание. И еще кое какие не существенные мелочи.</p><p>доработанная схема (у себя я еще убрал подстроечный резистор R1, соединив V0 с землей)</p><p><span class="postimg"><img src="http://forum.rcl-radio.ru/uploads/images/2022/02/a6a2912c7900b4f5540022f0e3526e3d.jpg" alt="http://forum.rcl-radio.ru/uploads/images/2022/02/a6a2912c7900b4f5540022f0e3526e3d.jpg" /></span></p><p>доработанный скетч</p><div class="codebox"><pre><code>#include &lt;LiquidCrystal.h&gt;
#include &lt;MsTimer2.h&gt;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7

unsigned long time0;
byte bud = 0, bud0 = 1, s, m, h, m1, h1, kn, kn1, kn2, korr;

void setup() {
  lcd.begin(16, 2);// LCD 16X2
  MsTimer2::set(1000, to_Timer); // задаем период 1с
  MsTimer2::start(); // старт таймера
  pinMode(6, INPUT_PULLUP); // кнопка коррекции
  pinMode(5, INPUT_PULLUP); // кнопка +
  pinMode(4, INPUT_PULLUP); // кнопка -
  pinMode(3, OUTPUT); // выход для пъезоизлучателя
}

void to_Timer() { //функция таймера
  ++s; // отсчет 1 с
}

void loop() {
  // читаем состояние входов
  kn = digitalRead(6);
  kn1 = digitalRead(5);
  kn2 = digitalRead(4);

  // коррекция времени, опрос кнопок

  if (kn1 == LOW &amp;&amp; kn2 == LOW) {  //коррекция секунд
    s = 0;
  }


  if (kn == LOW) {
    korr++;
    if (korr &gt;= 6) {
      korr = 0;
    }
  }
  if (kn1 == LOW &amp;&amp; korr == 1) {
    m++;
  }
  if (kn1 == LOW &amp;&amp; korr == 2) {
    h++;
  }
  if (kn2 == LOW &amp;&amp; korr == 1) {
    m--;
    if (m &gt; 60) {
      m = 0;
    }
  }
  if (kn2 == LOW &amp;&amp; korr == 2) {
    h--;
  }
  if (kn1 == LOW &amp;&amp; korr == 3) {
    m1++;
    if (m1 &gt; 59) {
      m1 = 0;
      h1++;
    }
  }
  if (kn1 == LOW &amp;&amp; korr == 4) {
    h1++;
    if (h1 &gt; 23) {
      h1 = 0;
    }
  }
  // коррекция будильника
  if (kn2 == LOW &amp;&amp; korr == 3) {
    m1--;
    if (m1 &gt; 60) {
      m1 = 0;
    }
  }
  if (kn2 == LOW &amp;&amp; korr == 4) {
    h1--;
    if (h1 &gt; 24) {
      h1 = 0;
    }
  }
  // активация и диактивация будильника
  if (kn1 == LOW &amp;&amp; korr == 5) {
    bud0 = 1;
  }
  if (kn2 == LOW &amp;&amp; korr == 5) {
    bud0 = 0;
  }

  // Отсчет времени часов
  if (s &gt; 59) {
    s = 0;
    ++m; // отсчет 1 мин
  }
  if (m &gt; 59) {
    m = 0;
    ++h; // отсчет 1 час
  }
  if (h &gt; 23) {
    h = 0;
  }
  // включение будильника
  if (m != m1) {
    bud = 0;
  };
  // запуск будильника
  if (m == m1 &amp;&amp; h == h1 &amp;&amp; bud == 0 &amp;&amp; bud0 == 1) {
    if (kn1 == LOW || kn2 == LOW) {
      bud = 1;
    }
    for (int i = 0; i &lt; 200; i++) { // пищалка
      digitalWrite(3, HIGH);
      delay(1);
      digitalWrite(3, LOW);
      delay(1);
    }
  }

  // вывод информации на экран 1 строка
  lcd.setCursor(2, 0);
  if (h &lt; 10) {
    lcd.print(&quot;0&quot;);
  }

  lcd.print(h); // часы
  lcd.print(&quot;:&quot;);
  if (m &lt; 10 ) {
    lcd.print(&quot;0&quot;);
  }

  lcd.print(m); // минуты
  lcd.print(&quot;:&quot;);
  if (s &lt; 10) {
    lcd.print(&quot;0&quot;);
  }
  lcd.print(s);// секунды
  // -------------------------------------------------- -
  //корректировка точности показаний секунд за сутки возможны варианты
  //зависит от точности кварца у меня отставание примерно 8.5 секунд за час
  //ПРИ целом количестве в час корректируемых секунд будет проще

  //коррекция плюс 2 сек каждые 15 мин

  if ( s == 10  &amp;&amp;  m == 59  )
  {
    s = s + 2;
  }

  if ( s == 10 &amp;&amp;  m == 15  )
  {
    s = s + 2;;
  }

  if ( s == 10 &amp;&amp;  m == 30  )
  {
    s = s + 2;
  }

  if ( s == 10 &amp;&amp;  m == 45  )
  {
    s = s + 2;
  }

  // коррекция плюс 3 секунды каждые 6 часов

  if ( s == 10  &amp;&amp;  m == 0  &amp;&amp;  h == 0 )
  {
    s = s + 3;
  }

  if ( s == 10  &amp;&amp;  m == 0  &amp;&amp;  h == 6 )
  {
    s = s + 3;
  }

  if ( s == 10  &amp;&amp;  m == 0  &amp;&amp;  h == 12 )
  {
    s = s + 3;
  }

  if ( s == 10  &amp;&amp;  m == 0  &amp;&amp;  h == 18 )
  {
    s = s + 3;
  }
  //---------------------------------------------------- -

  if (korr == 1) {
    lcd.print(&quot; set_m&quot;);
  }
  if (korr == 2) {
    lcd.print(&quot; set_h&quot;);
  }
  // вывод информации на экран 2 строка
  lcd.setCursor(0, 1);

  if ( bud0 == 1) {
    lcd.print(&quot; _&quot;);
    if (h1 &lt; 10) {
      lcd.print(&quot;0&quot;);
    }
    lcd.print(h1); // часы
    lcd.print(&quot;:&quot;);
    if (m1 &lt; 10 ) {
      lcd.print(&quot;0&quot;);
    }
    lcd.print(m1); // минуты
    lcd.print(&quot;_&quot;);
  }

  if ( bud0 == 0) {
    // lcd.print(&quot;&quot;);
  }
  if ( bud0 == 1 &amp;&amp; korr == 5) {
    lcd.print(&quot;al on/of&quot;);
  }
  if ( bud0 == 0 &amp;&amp; korr == 5) {
    lcd.print(&quot; set alarm on &quot;);

  }
  if (korr == 3) {
    lcd.print(&quot;set al min&quot;);
  }
  if (korr == 4) {
    lcd.print(&quot;set al h-r&quot;);
  }
  delay(200);
  lcd.clear();
} </code></pre></div>]]></content>
			<author>
				<name><![CDATA[v1ct0r]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=1681</uri>
			</author>
			<updated>2022-02-15T18:33:22Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=5423#p5423</id>
		</entry>
</feed>
