Очередные простейшие часы на семисегментных индикаторах (АЛС318Г)
- Войдите на сайт для отправки комментариев
Сб, 23/03/2013 - 01:58
Очередные простейшие часы на семисегментных индикаторах, без RTC
Код написан по дубовому, но новичкам чтоб разобраться думаю будет самое то.
Работает по принципу - подали питание начался отсчёт, досчитали до 23:59:59 - обнулились, начали отсчёт заново.
По хорошему надо хотя бы кнопку прописать для сброса счётчика в ноль, чтоб по шестому сигналу ...
Схему не знаю в чём по проще нарисовать, так что пока объясню на пальцах :)
Arduino самодельное на Atmega8A + кварц 16Мег + два конденсатора 22пика + по питанию два
конденсатора в параллель: 100мкф электролитический и 0.1мкф керамический
Индикатор древний советский АЛС318Г (валялся дома)
Чтоб уменьшить количество соединений arduino -> алс318, применён дешифратор К555ИД10
на К555ИД10 приходят три адресных провода которые дешифруются в 8 катодных выводов на индикаторе.
между контролером и сегментами индикатора включены резисторы 220 Ом
#define A 5 #define B 6 #define C 7 #define D 8 #define E 9 #define f 10 #define H 11 #define a0 2 #define a1 3 #define a2 4 long previousMillis = 0; long interval = 1000; int sl=0; int sh=0; int ml=0; int mh=0; int hl=0; int hh=0; int num=0; int adr=0; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(f, OUTPUT); pinMode(H, OUTPUT); pinMode(a0, OUTPUT); pinMode(a1, OUTPUT); pinMode(a2, OUTPUT); } void out_num(int n) { if (n == 0) { //0 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(f, HIGH); digitalWrite(H, LOW); } if (n == 1) { //1 digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(f, LOW); digitalWrite(H, LOW); } if (n == 2) { //2 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(f, LOW); digitalWrite(H, HIGH); } if (n == 3) { //3 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(f, LOW); digitalWrite(H, HIGH); } if (n == 4) { //4 digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(f, HIGH); digitalWrite(H, HIGH); } if (n == 5) { //5 digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(f, HIGH); digitalWrite(H, HIGH); } if (n == 6) { //6 digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(f, HIGH); digitalWrite(H, HIGH); } if (n == 7) { //7 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(f, LOW); digitalWrite(H, LOW); } if (n == 8) { //8 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(f, HIGH); digitalWrite(H, HIGH); } if (n == 9) { //9 digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); digitalWrite(E, LOW); digitalWrite(f, HIGH); digitalWrite(H, HIGH); } } void out_adr(int a) { if (a == 0) { digitalWrite(a0, LOW); digitalWrite(a1, LOW); digitalWrite(a2, LOW); } if (a == 1) { digitalWrite(a0, HIGH); digitalWrite(a1, LOW); digitalWrite(a2, LOW); } if (a == 2) { digitalWrite(a0, LOW); digitalWrite(a1, HIGH); digitalWrite(a2, LOW); } if (a == 3) { digitalWrite(a0, HIGH); digitalWrite(a1, HIGH); digitalWrite(a2, LOW); } if (a == 4) { digitalWrite(a0, LOW); digitalWrite(a1, LOW); digitalWrite(a2, HIGH); } if (a == 5) { digitalWrite(a0, HIGH); digitalWrite(a1, LOW); digitalWrite(a2, HIGH); } if (a == 6) { digitalWrite(a0, LOW); digitalWrite(a1, HIGH); digitalWrite(a2, HIGH); } if (a == 7) { digitalWrite(a0, HIGH); digitalWrite(a1, HIGH); digitalWrite(a2, HIGH); } } void vivod (int sl, int sh, int ml, int mh, int hl, int hh) { out_adr(7); out_num(sl); delay(4); out_adr(6); out_num(sh); delay(4); out_adr(4); out_num(ml); delay(4); out_adr(3); out_num(mh); delay(4); out_adr(1); out_num(hl); delay(4); out_adr(0); out_num(hh); delay(4); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; sl++; if (sl>9) { sl=0; sh++; } if (sh>5) { sh=0; ml++; } if (ml>9) { ml=0; mh++; } if (mh>5) { mh=0; hl++; } if (hl>9 || hl>3 && hh==2 || hl>9 && hh==1) { hl=0; hh++; } if (hh>2) { hh=0; } } vivod(sl, sh, ml, mh, hl, hh); }
На сколь точно идут? Сколько за сутки убегают?
Честно говоря не наблюдал за этим - не было такой потребности.