Очередные простейшие часы на семисегментных индикаторах (АЛС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);
}
На сколь точно идут? Сколько за сутки убегают?
Честно говоря не наблюдал за этим - не было такой потребности.