/* Use for VFD Number display Cool Clock Ver 1.0 of 2013/03/19 make of Kyohritsu Electric CO. LTD. http://keic.jp/ */ #include #include #include #define Adj_SPC_VAL 201 //Clock Adjust spceal vaule #define LDCP 12 #define PW_SW 11 #define S1 10 #define S2 9 const uint16_t seg[]={ 0b00111111, //0 0b00000110, //1 0b01011011, //2 0b01001111, //3 0b01100110, //4 0b01101101, //5 0b01111101, //6 0b00100111, //7 0b01111111, //8 0b01101111, //9 0b01001110111, //A, 0b00001011110, //d 0b00000011110, //j 0b01001110011, //P, 0b01110110, //H 0 //BLANK }; #define CHR_A 10 #define CHR_d 11 #define CHR_j 12 #define CHR_P 13 #define CHR_H 14 #define BLANK 15 volatile uint16_t seg_data[10]; volatile uint8_t int_ct; volatile uint8_t timer1=200; uint8_t track; bool d_ampm=true; volatile uint16_t adj_delta; #define AMPM_EEPROM 0 //display mode #define ADJ_EEPROM 2 //clock adjust data void edit_time(uint8_t *hh,uint8_t *mm); void set_adj_val(void); uint8_t div10(uint8_t v,uint8_t *mod); void setup() { char s[20]; uint8_t i; Serial.begin(9600); pinMode(LDCP, OUTPUT); digitalWrite(LDCP,1); //L,D,CP pinMode(PW_SW, OUTPUT); digitalWrite(PW_SW,0); //HV電源 pinMode(S1, INPUT); digitalWrite(S1,1); //PULL UP ON pinMode(S2, INPUT); digitalWrite(S2,1); //PULL UP ON Timer1.initialize(50); //20KHz Timer1.attachInterrupt( timerIsr ); // attach the service routine here delay(10); for(i=0;i<10;i++)seg_data[i]=seg[BLANK]; if((digitalRead(S1)==0) && (digitalRead(S2)==0))set_adj_val(); adj_delta=(uint16_t)EEPROM.read(ADJ_EEPROM+1)<<8 | EEPROM.read(ADJ_EEPROM); if(adj_delta>32767)adj_delta=3000; if(digitalRead(S1)==0){ seg_data[0]=seg[2]; seg_data[1]=seg[4]; EEPROM.write(AMPM_EEPROM, false); //24H mode } if(digitalRead(S2)==0){ seg_data[0]=seg[1]; seg_data[1]=seg[2]; EEPROM.write(AMPM_EEPROM, true); //AM/PM mode } seg_data[2]=seg[CHR_H]; d_ampm=false; while((digitalRead(S1)==0) || (digitalRead(S2)==0)); seg_data[0]=seg[BLANK]; d_ampm=EEPROM.read(AMPM_EEPROM); track=int_ct; } void loop() { static uint8_t m_hh=11,m_mm=59,m_ss=30,m_ss100=0; static bool harf=false; uint8_t tmp; if(int_ct != track){ //digitalWrite(4,0); //debug check track++; m_ss100++; if(m_ss100>99){ m_ss100=0; m_ss++; if(m_ss>59){ m_ss=0; m_mm++; if(m_mm>59){ m_mm=0; m_hh++; if(m_hh>23)m_hh=0; } } } if(digitalRead(S2)==0){//reset 1/100 & secnd digit if(m_ss>=30){ m_mm++; if(m_mm>59){ m_mm=0; m_hh++; if(m_hh>23)m_hh=0; } } m_ss=0; m_ss100=0; } if(digitalRead(S1)!=0)timer1=200; if(timer1==0)edit_time(&m_hh,&m_mm); /* seg_data[1]=seg[div10(m_hh,&mod)]; seg_data[2]=seg[mod]; seg_data[3]=seg[div10(m_mm,&mod)]; seg_data[4]=seg[mod]; seg_data[5]=seg[div10(m_ss,&mod)]; seg_data[6]=seg[mod]; seg_data[7]=seg[div10(m_ss100,&mod)]; seg_data[8]=seg[mod]; */ tmp=m_hh; if(d_ampm){ if(tmp>11){ seg_data[0]=seg[CHR_P]; tmp -= 12; } else { seg_data[0]=seg[CHR_A]; } if(tmp>9)seg_data[1]=seg[1]; else seg_data[1]=seg[BLANK]; } else { seg_data[1]=seg[tmp / 10]; } seg_data[2]=seg[tmp % 10] + 0x80; seg_data[3]=seg[m_mm / 10]; seg_data[4]=seg[m_mm % 10] + 0x80; seg_data[5]=seg[m_ss / 10]; seg_data[6]=seg[m_ss % 10] + 0x80; seg_data[7]=seg[m_ss100 / 10]; seg_data[8]=seg[m_ss100 % 10]; } } void timerIsr() { static char state=0,digit=0; static uint16_t SSR; static uint8_t sub_count=10; static bool sw=false; static uint16_t ADJ_acc=0; digitalWrite(PW_SW,0); digitalWrite(PW_SW,0); digitalWrite(PW_SW,1); if((state != 0) && (state<=16)){ digitalWrite(LDCP,1); //DCP=L digitalWrite(LDCP,0); //DCP=H clockを作る } if(state==0){ SSR=(seg_data[digit] & 0x0fff) | ((uint16_t)digit<<12); if(digit>=9)digit=0; else digit++; } if(state<16){ if(SSR & 0x8000)digitalWrite(LDCP,0); else digitalWrite(LDCP,1); SSR <<= 1; state++; } else { state++; } if(state>=25){ state=0; } if(--sub_count==0){ //make 10mS ADJ_acc += adj_delta; if(ADJ_acc>32768){ ADJ_acc &= 0x7fff; sub_count=Adj_SPC_VAL; } else { sub_count=200; } if(timer1)timer1--; int_ct++; } } void edit_time(uint8_t *hh,uint8_t *mm){ uint8_t old_int_ct,tmp; bool winc=true; bool SW1_ege=true; bool SW2_ege=false; bool nextf=false; old_int_ct=int_ct; timer1=0; while(1){ if(timer1==0){ timer1=40; if(winc){ winc=false; tmp=*hh; if(d_ampm){ if(tmp>11){ seg_data[0]=seg[CHR_P]; tmp -= 12; } else { seg_data[0]=seg[CHR_A]; } if(tmp>9)seg_data[1]=seg[1]; else seg_data[1]=seg[BLANK]; } else { seg_data[1]=seg[tmp / 10]; } seg_data[2]=seg[tmp % 10] + 0x80; } else { winc=true; seg_data[0]=seg[BLANK]; seg_data[1]=seg[BLANK]; seg_data[2]=seg[BLANK]; } } if(nextf)break;//next editing point if(int_ct != old_int_ct){ old_int_ct=int_ct; if(digitalRead(S2)==0){ if(SW2_ege==false){ SW2_ege=true; *hh = *hh+1; if(*hh>23)*hh=0; winc=true; timer1=0; } } else { SW2_ege=false; } if(digitalRead(S1)==0){ if(SW1_ege==false){ SW1_ege=true; timer1=0; winc=true; nextf=true; //goto next flag whith rewriting } } else { SW1_ege=false; } } } timer1=0; winc=true; while(1){ if(timer1==0){ timer1=40; if(winc){ winc=false; seg_data[3]=seg[*mm / 10]; seg_data[4]=seg[*mm % 10] + 0x80; } else { winc=true; seg_data[3]=seg[BLANK]; seg_data[4]=seg[BLANK]; } } if(int_ct != old_int_ct){ old_int_ct=int_ct; if(digitalRead(S2)==0){ if(SW2_ege==false){ SW2_ege=true; *mm = *mm+1; if(*mm>59)*mm=0; winc=true; timer1=0; } } else { SW2_ege=false; } if(digitalRead(S1)==0){ if(SW1_ege==false){ SW1_ege=true; timer1=200; return; //editing finish } } else { SW1_ege=false; } } } } void set_adj_val(void){ uint16_t tmp; uint8_t old_int_ct,i,exit_ct; uint8_t rept_c1=100;//repaet start 1sec uint8_t rept_c2=100;//repaet start 1sec char s[10]; bool winc=true; bool SW1_ege=false; bool SW2_ege=false; #define EXIT_TIME 40 //0.4s*40=16sec seg_data[0]=seg[CHR_A]; seg_data[1]=seg[CHR_d]; seg_data[2]=seg[CHR_j]; //noInterrupts(); tmp=(uint16_t)EEPROM.read(ADJ_EEPROM+1)<<8 | EEPROM.read(ADJ_EEPROM); //interrupts(); //tmp=3000; //force init if(tmp>32767){//if EEPROM is erased tmp=3000; //clock adjust inital value EEPROM.write(ADJ_EEPROM+1,tmp>>8); EEPROM.write(ADJ_EEPROM,tmp & 255); } while((digitalRead(S1)==0) || (digitalRead(S2)==0)); old_int_ct=int_ct; timer1=0; exit_ct=EXIT_TIME; while(1){ if(timer1==0){ timer1=40; if(--exit_ct==0){ EEPROM.write(ADJ_EEPROM+1,tmp>>8); EEPROM.write(ADJ_EEPROM,tmp & 255); return; } if(winc){ winc=false; sprintf(s,"%5u",tmp); for(i=0;i<5;i++){ if((s[i]>='0') && (s[i]<='9')) seg_data[i+3]=seg[s[i]-'0']; else seg_data[i+3]=seg[BLANK]; } } else { winc=true; for(i=0;i<5;i++){ seg_data[i+3]=seg[BLANK]; } } } if(int_ct != old_int_ct){ old_int_ct=int_ct; if(digitalRead(S2)==0){ exit_ct=EXIT_TIME; if(SW2_ege==false){ SW2_ege=true; tmp++; if(tmp>32767)tmp=32767; winc=true; timer1=0; } else { if(--rept_c2==0){ rept_c2=5; //auto repeat time SW2_ege=false; } } } else { SW2_ege=false; rept_c2=100;//auto repeat start time } if(digitalRead(S1)==0){ exit_ct=EXIT_TIME; if(SW1_ege==false){ SW1_ege=true; if(tmp>0)tmp--; timer1=0; winc=true; } else { if(--rept_c1==0){ rept_c1=5; //auto repeat time SW1_ege=false; } } } else { SW1_ege=false; rept_c1=100;//auto repeat start time } } } } uint8_t div10(uint8_t v,uint8_t *mod){ uint8_t i=0; while(v >=10){ v -= 10; i++; } *mod=v; return i; }