Очередные простейшие часы на семисегментных индикаторах (АЛС318Г)

lintech
Offline
Зарегистрирован: 18.03.2013

 

Очередные простейшие часы на семисегментных индикаторах, без 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);

} 

 

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

На сколь точно идут? Сколько за сутки убегают?

lintech
Offline
Зарегистрирован: 18.03.2013

Честно говоря не наблюдал за этим - не было такой потребности.