часы светодиодная лента
- Войдите на сайт для отправки комментариев
Сб, 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 abcdefg
005
//d11 d12 key hour min
006
//a3 a2 a1 a0 digit hr10 hr1 mn10 mn1