часы светодиодная лента
- Войдите на сайт для отправки комментариев
Сб, 13/03/2021 - 10:02
#include <MsTimer2.h>
const char now[] = __TIME__;
// d0,d2-d7 uln2003 7segm abcdefg
//d11 d12 key hour min
//a3 a2 a1 a0 digit hr10 hr1 mn10 mn1
// динамическая индикация 2000мкс
// регулируем яркость
#define t_light_no4 150 // светит = ночью
#define t_light_day 500//=1/16 днем
#define t_dark_no4 1850 // темно = до 2000 заполнение паузы
#define t_dark_day 1500
byte dg[10] = {0x7F, 0x0E, 0xb7, 0x9f, 0xce, 0xdb, 0xfb, 0xf, 0xff, 0xdf};
byte tt1, tt2 = 0;
byte hr, mn, mnf, hr10, hr1, mn10, mn1;
bool no4 = LOW; // ночь табло темнее
void setup() {
MsTimer2::set(60083, flash); // коррекция хода часов каждую минуту = 83 миллисекунды задержка.
//за 7ч:40м =460минут убежали на 38000 миллиsec вперед = 82.6мс
MsTimer2::start();
// put your setup code here, to run once:
DDRD = B11111111;
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
hr = atoi(&now[0]);
mn = atoi(&now[3]);
mnf = mn;
hrmn();
//seconds = atoi(&now[6]);
}
void flash()
{
mnf++;
}
void hrmn() {
// расчет единиц и десятков
hr10 = int(hr / 10);
hr1 = hr - 10 * hr10;
mn10 = int(mn / 10);
mn1 = mn - 10 * mn10;
if ((hr < 7) or (hr > 20)) no4 = HIGH; else no4 = LOW;
}
void tik()
{ // 1 минута
if (mnf != mn) { // прошла минута
mn = mnf;
if (mnf == 60)
{ // 1 час
mnf = 0;
mn = 0;
hr++;
if (hr == 24) hr = 0;
}
hrmn(); // коррекция индикации
}
}
void key_k() {
if (digitalRead(11) == 0) tt1++ ; else tt1 = 0;
if (digitalRead(12) == 0) tt2++ ; else tt2 = 0;
// 1 цикл опроса 8 ms * 50 = 400мс
if (tt1 > 50) {
hr++;
tt1 = 0;
if (hr > 23)hr = 0;
hrmn();
}
if (tt2 > 50) {
mnf++;
tt2 = 0;
if (mnf > 59) mnf = 0;
mn=mnf;
hrmn();
}
}
void loop()
{
tik(); // контроль хода часов
dyn_ind(); // индикация
key_k(); // контроль кнопок
}
void light()
{ // время свечения цифры
if (no4) delayMicroseconds(t_light_no4); else delayMicroseconds(t_light_day);
}
void dark()
{ // время не свечения между цифрами
if (no4) delayMicroseconds(t_dark_no4); else delayMicroseconds(t_dark_day);
}
void dyn_ind()
{
// индикация динамическая 8 мс цикл
// яркая =каждая цифра 2 мс 1/4
// ночь = каждая цифра светит 500 мкс, затем темнота 1500 микросекунд
PORTD = dg[hr10];
digitalWrite(A3, HIGH);
light();
digitalWrite(A3, LOW);
dark();
PORTD = dg[hr1];
digitalWrite(A2, HIGH);
light();
digitalWrite(A2, LOW);
dark();
PORTD = dg[mn10];
digitalWrite(A1, HIGH);
light();
digitalWrite(A1, LOW);
dark();
PORTD = dg[mn1];
digitalWrite(A0, HIGH);
light();
digitalWrite(A0, LOW);
dark();
}
004// d0,d2-d7 uln2003 7segm abcdefg005//d11 d12 key hour min006//a3 a2 a1 a0 digit hr10 hr1 mn10 mn1