AM2321 ATmega64、ATTINY2313 を使用する

時計や温度はATmega64でコントロールして、
ATTINY2313で大型LEDを表示させている 

夜中に時計を見る時、市販のLCDは暗い
7SEG LEDで作ることにしたが、眼鏡が無いと、小さい時計では見えない

大型7SEG LEDは 共立エレショップで購入した
額縁 50cm×30cm に入れた

さすがに大きいので、遠くからでも見える
温度、湿度は小さいLEDを使用したので、見えない

発光色:純緑
●文字高:127mm(5インチ)
●コモン:アノード
●順方向電圧:19.7V(実測値)
●順方向電流:5mA(実測値)
※DPのみ実測値で順方向電圧:8.9V 順方向電流:5mA
●外形:約W105×H140×D16mmアノードコモンを使用する


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  



  回路図

24vスイッチング電源から5vを作っている、電流が多いので発熱を考えて、3端子レギュレータではなく
スイッチングタイプのLM7626 DCDCコンバータ ICを使用した



このICの使用上の注意は 入力の 0.47uF を忘れない事である

これには、面白い逸話がある。
電機会社で 生産した製品でこのICを使った。
しかし、20台に2〜3台程度、 5vの電圧が出ないで、5Vマイコンが誤動作する製品が発生した。
設計部門では、品質保証部に対し、ICのロット不良なので、半導体メーカーにクレームするようにと指示が出た。

品保が 不良ICを入手して、メーカーに提出するのを きわどく食い止めたのは言うまでもない。
電機会社の技術力の無さを公開するようなものだからだ、
大企業の敵は 社外では無く、内部なのだ、若い設計者に納得させるのに苦労したが、若い設計者が知識が無くなっているのは、
時代の流れだろう。



------------------------------------------------------------------------------
時計と温度と大型の7SEGLEDをダイナミック点灯するためには、プログラムが大変なので、
というよりも、
ダイナミック点灯は、高速でLEDを点灯させるため、数が多いと暗くなってしまう
明るくするには、ちらつきが発生する
電流を流せばよいのだが、限界もある

湿度、温度を取り込む時、一瞬 LEDは消えてしまう。

7SEG表示はATTINY2313でダイナミック点灯させることにした。、
データーを1分おきに、ATmega64が送って対応しよう

温度、湿度は ATmega64で表示させている



プログラムーーーーーーーーーーーーーーーーーーー
今回も C言語で書いる
ーーーーーーーーーーー
// 大型7セグ 時計 温度表示
// CLOCK7-* 2016-7-20
//
// ATmega64A
// -------------------------------------------------
// 動作クロック : CLOCK=10MHz
// ヒューズビット L=FF H=D9 EX=FF
//
// PA0-PA7 OUT 7SEG big
// PC0-PC7 =OUT 7SEG min
// PF0-PF3 =out week
// PD2-PD7 =out TR 0xFC
// PB6,7 =out 0xC0
//
// PD0 = SCL PD1=SDA
// PF6,PF7 = DOT
// PF5= 11月、12月
//----------------------------------------------------


#include <avr/io.h>
#define F_CPU 10000000UL //10M
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>

// 擬似命令




#define TR1_off PORTB |= _BV(PB6) //ONDO
#define TR1_on PORTB &=~_BV(PB6)
#define TR2_off PORTB |= _BV(PB7)
#define TR2_on PORTB &=~_BV(PB7)
#define TR3_off PORTD |= _BV(PD2)
#define TR3_on PORTD &=~_BV(PD2)
#define TR4_off PORTD |= _BV(PD3) //湿度
#define TR4_on PORTD &=~_BV(PD3)
#define TR5_off PORTD |= _BV(PD4)
#define TR5_on PORTD &=~_BV(PD4)
#define TR6_off PORTD |= _BV(PD5) //気圧H
#define TR6_on PORTD &=~_BV(PD5)
#define TR7_off PORTD |= _BV(PD6)
#define TR7_on PORTD &=~_BV(PD6)
#define TR8_off PORTD |= _BV(PD7) //気圧L
#define TR8_on PORTD &=~_BV(PD7)



#define we1_on PORTF |= _BV(PF0) //H
#define we1_off PORTF &=~_BV(PF0) //L
#define we2_on PORTF |= _BV(PF1) //H
#define we2_off PORTF &=~_BV(PF1) //L
#define we3_on PORTF |= _BV(PF2) //H
#define we3_off PORTF &=~_BV(PF2) //L

#define dot1_on PORTF |= _BV(PF6) //H
#define dot1_off PORTF &=~_BV(PF6) //L
#define dot2_on PORTF |= _BV(PF7) //H
#define dot2_off PORTF &=~_BV(PF7) //L

#define monthH_off PORTF |= _BV(PF5) //H
#define monthH_on PORTF &=~_BV(PF5) //L



#define KEY_R bit_is_clear (PINB,PB2)
#define KEY_A bit_is_clear (PINB,PB3)
#define KEY_B bit_is_clear (PINB,PB4)
#define KEY_C bit_is_clear (PINB,PB5)

#define KEY_AOFF bit_is_set (PINB,PB3)
#define KEY_BOFF bit_is_set (PINB,PB4)
#define KEY_COFF bit_is_set (PINB,PB5)



uint8_t sidx[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; // 初期化 sidx[0]=0,sidx[1]=0,sidx[2]=0,sidx[3]=0
uint8_t sidy[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; // 初期化 sidx[0]=0,sidx[1]=0,sidx[2]=0,sidx[3]=0

uint8_t n_on1;
uint8_t n_on2;
uint8_t n_s1;
uint8_t n_s2;
uint8_t n_k1;
uint8_t n_k2;
uint8_t n_k3;
uint8_t n_k4;

volatile uint8_t o_data[12]; //温度データ
volatile uint8_t r_data[12]; //読込データ
volatile uint8_t vram[10];
volatile uint8_t rtc_wdat[10]; //書込データ
volatile uint8_t rtc_rdat[10]; //読込データ
volatile uint8_t t_data[200];
volatile uint8_t dat[10];

uint8_t ans;
uint16_t count;
uint16_t count1;
uint16_t count2;
uint16_t count3;

uint8_t com;
uint8_t dat16;
uint8_t dat10;
uint8_t wdat;


uint8_t dat1;
uint8_t dsec;
uint8_t secH;
uint8_t secL;
int8_t sec;
uint8_t dmin;
uint8_t minH;
uint8_t minL;
int8_t min;
uint8_t dhour;
uint8_t hourH;
uint8_t hourL;
int8_t hour;
uint8_t dday;
uint8_t dayH;
uint8_t dayL;
int8_t day;
uint8_t dmonth;
uint8_t monthH;
uint8_t monthL;
int8_t month;
uint8_t dweek;
uint8_t weekH;
int8_t week;

uint8_t s_dsec;
uint8_t ssecH;
uint8_t ssecL;
uint8_t s_dmin;
uint8_t sminH;
uint8_t sminL;
uint8_t s_dhour;
uint8_t shourH;
uint8_t shourL;
uint8_t s_dday;
uint8_t sdayH;
uint8_t sdayL;
uint8_t s_dmonth;
uint8_t smonthH;
uint8_t smonthL;

uint8_t s_dyear;
uint8_t syearH;
uint8_t syearL;
uint8_t s_dweek;
int8_t sweek;

uint8_t ny=0;
uint16_t cnt=0;
uint8_t tset_flg=0; //1=month 2=day
uint8_t tset_sw=0; //key_が押されたフラグ
uint8_t Lcou=1;
uint8_t henkou_flg=0; //変更許可


//ondo 湿度----------------
uint8_t R1;
uint8_t R2;
uint8_t R3;
uint8_t R4;
uint8_t R5;
uint8_t R6;
uint8_t R7;
uint8_t R8;
uint8_t R9;
uint16_t situdo10;
uint16_t ondo10;

uint8_t ondoH;
uint8_t ondoL;
uint8_t situdoH;
uint8_t situdoL;




//------------------------------------------------
// 7セグ用LEDテーブル --------------------------
unsigned char SEGCHAR[]=
{
// 0b0GFEDCBA
0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00100111, //7
0b01111111, //8
0b01101111, //9
0b00000000, //null=10
// 0b0GFEDCBA
0b00110111, //M('U'の逆さで)
0b01011100, //o
0b01010100, //n
0b00110001, //T('「'の形で)
0b00011100, //u
0b01111011, //e
0b01111110, //W('A'の逆さで)
0b01011110, //d
0b01110100, //h
0b01110001, //F
0b01010000, //r
0b00010000, //i
0b01101101, //S('5'と同じだが構わない)
0b01011111, //a
0b01111000, //t

// 0b0GFEDCBA
0b00100000, //AMのドット
0b00010000, //PMのドット
0b00000001, //A
0b01000000, //- =25(i)

};


enum _SIDX
{
SIDX_NULL = 10,
SIDX_M,
SIDX_o,
SIDX_n,
SIDX_T,
SIDX_u,
SIDX_e,
SIDX_W,
SIDX_d,
SIDX_h,
SIDX_F,
SIDX_r,
SIDX_i,
SIDX_S,
SIDX_a,
SIDX_t,
SIDX_AM,
SIDX_PM,
SIDX_A,
SIDX_B,
};
enum _SIDY
{
SIDY_NULL = 10,
SIDY_M,
SIDY_o,
SIDY_n,
SIDY_T,
SIDY_u,
SIDY_e,
SIDY_W,
SIDY_d,
SIDY_h,
SIDY_F,
SIDY_r,
SIDY_i,
SIDY_S,
SIDY_a,
SIDY_t,
SIDY_AM,
SIDY_PM,
SIDY_A,
SIDY_B,
};
//*---------------timer-----------------------------

void wait_ms(uint16_t m ) //1=1ms
{
while(m--) _delay_ms(1);
}
//-----
void wait_us(uint16_t m ) //1=1us
{
while(m--) _delay_us(1);
}





//------センサーを休止状態から呼び起こす-------------------------------------
void ONDO_ST(void)
{

/* 開始条件送出*/
TWCR = (1<<TWSTA)|(1<<TWINT) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_W 書込アドレス送出 */


TWDR=0b10111000; //B8
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*DATA RTCアドレス送出 0x00 */

// NACK を受け取る 0x20 返す

wait_ms(2);

/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN); //stop
wait_ms(1);

}

//-------読出し命令送信----------------------
void ONDO_RS(void)
{

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 08を返すので*SLA_W 書込アドレス送出

TWDR=0b10111000; //B8
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 18 ACK を受け取る

/*DATA 機能コード送出 0x03 */
TWDR=0x03;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//03データが送られたので 28 を返す

/*SLA_R 読込アドレス送出 */
TWDR=0x00; //00
TWCR = (1<<TWINT) | (1<<TWEN); //Nack
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//00が贈られたので 28を返す

/*SLA_R 読込アドレス送出 */
TWDR=0x04; //00
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//04が送られたので 28を返す


/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);
wait_ms(10);

//終了したので TWSRは 0xF8を返す

}


//---- 読み取りREAD ondo -------------
void ONDO_READ(void)
{
int i;


/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
//08を返すので、*SLA_W 書込アドレス送出

TWDR=0b10111001; //B9
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
// 18 ACK を受け取る

wait_us(30); //30us


ans=TWDR; //データ取得 03H
o_data[1]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK

while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 04H
o_data[2]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 S_MSB
o_data[3]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 S_LSB
o_data[4]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機


ans=TWDR; //データ取得 O_MSB
o_data[5]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 O-LSB
o_data[6]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 CRC_MSB
o_data[7]=ans;
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

ans=TWDR; //データ取得 CRC_LSB
o_data[8]=ans;
//TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
TWCR = (1<<TWINT) | (1<<TWEN); //NACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機



/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN); //stop
wait_ms(100);


}

// 測定ルーチン -------------------------------
void sokutei(void)
{
ONDO_ST();
ONDO_RS();

ONDO_READ();

R1=o_data[1];
R2=o_data[2];
R3=o_data[3];
R4=o_data[4];
R5=o_data[5];
R6=o_data[6];
R7=o_data[7];
R8=o_data[8];




situdo10=(256*R4)+R5;
ondo10=(R6*256)+R7;

//situdo10=450;
//ondo10=250;

n_on2=ondo10/100;
n_on1=(ondo10-(n_on2*100))/10;
n_s2=situdo10/100;
n_s1=(situdo10-(n_s2*100))/10;


ondoL = n_on1;
ondoH = n_on2;
situdoL = n_s1;
situdoH = n_s2;

}

// ------ 時計COMMand --------------
// com ---> TWDR (0x02=sec, 0x03=min,0x04=hour,,,)
// TWDR ---> ans
//----------リード初期値-------------------
void RTC_RS(void)
{

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_W 書込アドレス送出 */
TWDR=0b10100010; //A2
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*DATA RTCアドレス送出 0x02 */
TWDR=0x02;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_R 読込アドレス送出 */
TWDR=0b10100011; //A3
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
}
//-----------リード連続----------
void RTC_RE(void)
{
/*DATA データ読込 */
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //データを取得

}
//----------リードライトストップ--------------
void RTC_STOP(void)
{
/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);
wait_us(100);
}
//---- READ TIME -------------
void READ_TIME(void)
{
int i;

RTC_RS();
for(i=2;i<9;i++){
RTC_RE();
rtc_rdat[i]=ans;
}
RTC_STOP();

dsec=rtc_rdat[2] & 0x7F;
dmin=rtc_rdat[3] & 0x7F;
dhour=rtc_rdat[4] & 0x3F;
dday=rtc_rdat[5] & 0x3F;
dweek=rtc_rdat[6] & 0x07;
dmonth=rtc_rdat[7]& 0x1F;

}
//----- READ データ領域 -------------
void RTC_R_DAT(void)
{

rtc_rdat[0] =0x20; //CNT0
rtc_rdat[1] =0x00; //CNT2
rtc_rdat[2] =0x00; //sec
rtc_rdat[3] =0x00; //min
rtc_rdat[4] =0x00; //hour
rtc_rdat[5] =0x00; //day
rtc_rdat[6] =0x00; //Wday
rtc_rdat[7] =0x00; //month
rtc_rdat[8] =0x00; //year
}


//----------書込み 初期-------------------------------------------------
void RTC_WS(void)
{
/* 開始条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*SLA_W 書込アドレス送出 */
TWDR=0b10100010; //A2
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/*DATA RTCアドレス送出 0x02 */
TWDR=0x00;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

}
//-----  書込み 連続
void RTC_WE(void)
{
/*data 書込み*/
TWDR=wdat; //A3
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
}

//---- 書込み初期設定 TIME -------------
void RTC_INIT(void)
{
int i;

RTC_WS();
for(i=0;i<9;i++){
wdat=rtc_wdat[i];
RTC_WE();
}
RTC_STOP();

com=0x00;
wdat=0b00000000; //start
RTC_WS();
RTC_WE();
RTC_STOP();

tset_flg == 0;
}
//----- WRITE データ領域E -------------
void RTC_W_DAT(void)
{

rtc_wdat[0] =0x20; //CNT0
rtc_wdat[1] =0x00; //CNT2
rtc_wdat[2] =0x00; //sec
rtc_wdat[3] =0x10; //min
rtc_wdat[4] =0x20; //hour
rtc_wdat[5] =0x17; //day
rtc_wdat[6] =0x06; //Wday
rtc_wdat[7] =0x08; //month
rtc_wdat[8] =0x13; //year
}
//---- CRT time --------------
// 10進 −−−>H,L
void CRT_TIME10(void)
{
secH =dsec >> 4;
secL =dsec & 0x0F;
minH =dmin >> 4;
minL =dmin & 0x0F;
hourH =dhour >> 4;
if(hourH == 0){hourH=10;}
hourL =dhour & 0x0F;
dayH =dday >> 4;
dayL =dday & 0x0F;

weekH = dweek & 0x07;
monthH =dmonth >> 4;
if (monthH == 0){monthH_off;}
if (monthH == 1){monthH_on;}

monthL =dmonth & 0x0F;




}


//---- CRT time --------------
// 現在の時間を 変更領域に移動
void SET_IDOU(void)
{
s_dsec=dsec;
s_dmin=dmin;
s_dhour=dhour;
s_dday=dday;
s_dweek=dweek;
s_dmonth=dmonth;

}



//
// 変更した データ s_dmonth を smonthH,smonthLに入れる
//
void SET_TIME10(void)
{
secH =s_dsec >> 4;
secL =s_dsec & 0x0F;
minH =s_dmin >> 4;
minL =s_dmin & 0x0F;
hourH =s_dhour >> 4;
if(hourH == 0){hourH=10;} //表示を消す
hourL =s_dhour & 0x0F;
dayH =s_dday >> 4;
dayL =s_dday & 0x0F;

weekH = s_dweek & 0x07;
monthH =s_dmonth >> 4;
if (monthH == 0){monthH_off;}
if (monthH == 1){monthH_on;}

monthL =s_dmonth & 0x0F;


}


//---- CRT time --------------
// 10進 −−−>16
void CRT_TIME(void)
{
sec =((dsec >> 4) & 0x07)*10 + (dsec & 0x0F);
min =((dmin >> 4) & 0x07)*10 + (dmin & 0x0F);
hour =((dhour >> 4) & 0x03)*10 + (dhour & 0x0F);
day =((dday >> 4) & 0x03)*10 + (dday & 0x0F);

week = dweek & 0x07;
month =((dmonth >> 4) & 0x01)*10 + (dmonth & 0x0F);



}
//------- TIME SET ---------------------------
void TIME_SET(void)
{
if(tset_flg == 1){ //月
if(KEY_B){s_dmonth++;
if(s_dmonth == 0x0A){s_dmonth=0x10;}
if(s_dmonth == 0x13){s_dmonth=0x01;}
wait_ms(300);
SET_TIME10(); // hyouzi
}
if(KEY_C){s_dmonth--;
if(s_dmonth == 0x00){s_dmonth=0x13;}
if(s_dmonth == 0x10){s_dmonth=0x0A;}
wait_ms(300);
SET_TIME10(); // hyouzi
}

}

if(tset_flg == 2){ //日
if(KEY_B){s_dday++;
if(s_dday == 0x0A){s_dday=0x10;}
if(s_dday == 0x1A){s_dday=0x20;}
if(s_dday == 0x2A){s_dday=0x30;}
if(s_dday == 0x32){s_dday=0x01;}
wait_ms(300);
SET_TIME10(); // hyouzi
}
if(KEY_C){s_dday--;
if(s_dday == 0x00){s_dday=0x32;}
if(s_dday == 0x30){s_dday=0x2A;}
if(s_dday == 0x20){s_dday=0x1A;}
if(s_dday == 0x10){s_dday=0x0A;}
wait_ms(300);
SET_TIME10(); // hyouzi
}



}

if(tset_flg == 3){ //時
if(KEY_B){s_dhour++;
if(s_dhour == 0x0A){s_dhour=0x10;}
if(s_dhour >> 0x13){s_dhour=0x01;}
// if(s_dhour == 0x2A){s_dhour=0x01;}
wait_ms(300);
SET_TIME10(); // hyouzi
}
if(KEY_C){s_dhour--;
if(s_dhour == 0x00){s_dhour=0x12;}
if(s_dhour == 0x10){s_dhour=0x0A;}
// if(s_dhour == 0x2A){s_dhour=0x01;}
wait_ms(300);
SET_TIME10(); // hyouzi
}


}

if(tset_flg == 4){ //分
if(KEY_B){s_dmin++;
if(s_dmin == 0x0A){s_dmin=0x10;}
if(s_dmin == 0x1A){s_dmin=0x20;}
if(s_dmin == 0x2A){s_dmin=0x30;}
if(s_dmin == 0x3A){s_dmin=0x40;}
if(s_dmin == 0x4A){s_dmin=0x50;}
if(s_dmin == 0x5A){s_dmin=0x01;}
wait_ms(300);
SET_TIME10(); // hyouzi
}
if(KEY_C){s_dmin--;
if(s_dmin == 0x00){s_dmin=0x59;}
if(s_dmin == 0x50){s_dmin=0x4A;}
if(s_dmin == 0x40){s_dmin=0x3A;}
if(s_dmin == 0x30){s_dmin=0x2A;}
if(s_dmin == 0x20){s_dmin=0x1A;}
if(s_dmin == 0x10){s_dmin=0x0A;}
wait_ms(300);
SET_TIME10(); // hyouzi
}

}


if(tset_flg == 5){ //週
if(KEY_B){s_dweek++;
if(s_dweek == 0x07){s_dweek=0x00;}
wait_ms(300);
SET_TIME10(); // hyouzi
}
}


}

void henkou(void)
{

while(1){
hyouzi();

PORTA = SEGCHAR[sidx[0]];
PORTC = SEGCHAR[sidy[0]];
TR1_on;
wait_ms(2);
TR1_off;

if(tset_flg ==3){count2++; //時 点滅ルーチン
if(count2 >> 3){sidx[1]=10;}
if(count2 == 20){count2=0;}
}
PORTA = SEGCHAR[sidx[1]];
PORTC = SEGCHAR[sidy[1]];
TR2_on;
wait_ms(2);
TR2_off;

PORTA = SEGCHAR[sidx[2]];

if(tset_flg ==1){count2++; //月 点滅ルーチン
if(count2 >> 3){sidy[2]=10;}
if(count2 == 20){count2=0;}
}
PORTC = SEGCHAR[sidy[2]];
TR3_on;
wait_ms(2);
TR3_off;
if(tset_flg ==4){count2++; //分 点滅ルーチン
if(count2 >> 3){sidx[3]=10;}
if(count2 == 20){count2=0;}
}
PORTA = SEGCHAR[sidx[3]];
PORTC = SEGCHAR[sidy[3]];
TR4_on;
wait_ms(2);
TR4_off;
PORTA = SEGCHAR[sidx[4]];

if(tset_flg ==2){count2++; //日 点滅ルーチン
if(count2 >> 3){sidy[4]=10;}
if(count2 == 20){count2=0;}
}
PORTC = SEGCHAR[sidy[4]];
TR5_on;
wait_ms(2);
TR5_off;
PORTA = SEGCHAR[sidx[5]];
PORTC = SEGCHAR[sidy[5]];
TR6_on;
wait_ms(2);
TR6_off;

PORTC = SEGCHAR[sidy[6]];
TR7_on;
wait_ms(2);
TR7_off;

if(KEY_A){tset_sw=1;}
if(tset_sw == 1){
if(KEY_AOFF){tset_sw=2;}
}
if(tset_sw == 2){tset_flg++;tset_sw=0;
if(tset_flg == 6){tset_flg=1;}
}

TIME_SET();
if(KEY_R){rtc_wdat[7] =s_dmonth;
rtc_wdat[5] =s_dday;
rtc_wdat[4] =s_dhour;
rtc_wdat[3] =s_dmin;
rtc_wdat[6] =s_dweek;

tset_flg=0;
RTC_INIT();
break;
}

}//while(1) end

} //henkou(void)end











//---- 16進ーー>10進変換---------
// dat16 のデータを 10進に変換し dat10 に戻す。
void henkan10(void)
{
dat10 = ((dat16 / 10) << 4) | (dat16 % 10);

}





void week_led(void)
{


if(weekH == 0){we1_off;we2_off;we3_off;}
if(weekH == 1){we1_on;we2_off;we3_off;}
if(weekH == 2){we1_off;we2_on;we3_off;}
if(weekH == 3){we1_on;we2_on;we3_off;}
if(weekH == 4){we1_off;we2_off;we3_on;}
if(weekH == 5){we1_on;we2_off;we3_on;}
if(weekH == 6){we1_off;we2_on;we3_on;}
if(weekH == 7){we1_on;we2_on;we3_on;}





}
void hyouzi(void)
{



sidx[0] = hourH;
sidx[1] = hourL;
sidx[2] = minH;
sidx[3] = minL;
sidx[4] = secH;
sidx[5] = secL;


sidy[0] = ondoH;
sidy[1] = situdoL;
sidy[2] = monthL;
sidy[3] = dayH;
sidy[4] = dayL;
sidy[5] = situdoH;
sidy[6] = ondoL;

week_led();

}


//-----------------------------------------------------------

int main () {


DDRB = 0xC0; // 0b1100-0000
DDRC = 0xFF; // OUT
DDRD = 0xFC; // 0b1111-1100
DDRA = 0xFF; //out
DDRF = 0xFF; //out

PORTA = 0x00; // H 出力
PORTD = 0xFF; // L 出力
PORTC = 0x00; // H 出力
PORTF = 0xC0; // DOT を消すには H 0=sun
PORTB = 0xFF;

//---------------------------------------------
// SCL=10M/(16+ 2*100*1)=50kHz
TWBR=100; //92
TWSR=0x00; //ビット速度値
TWCR=0b00000100; // TWI SCL/SDA で使用する
//---------------------

READ_TIME(); // RTC 時刻読取 --->dyear-dsec
CRT_TIME10();
// SET_IDOU();
// nx=2;


// 温度 ----------------------------

wait_ms(600); // AM2321はすぐに立ち上がらないため

sokutei();

count=0;
count1=0;
count2=0;
count3=0;
tset_flg=0;
tset_sw=0;
henkou_flg=0;
TR1_off;
TR2_off;
TR3_off;
TR4_off;
TR5_off;
TR6_off;
TR7_off;
TR8_off;





while(1){
if(tset_flg == 0){
READ_TIME(); // RTC 時刻読取 --->dyear-dsec
CRT_TIME10();
}
hyouzi();

PORTA = SEGCHAR[sidx[0]];
PORTC = SEGCHAR[sidy[0]];
TR1_on;
wait_ms(2);
TR1_off;

PORTA = SEGCHAR[sidx[1]];
PORTC = SEGCHAR[sidy[1]];
TR2_on;
wait_ms(2);
TR2_off;

PORTA = SEGCHAR[sidx[2]];
PORTC = SEGCHAR[sidy[2]];
TR3_on;
wait_ms(2);
TR3_off;
PORTA = SEGCHAR[sidx[3]];
PORTC = SEGCHAR[sidy[3]];
TR4_on;
wait_ms(2);
TR4_off;
PORTA = SEGCHAR[sidx[4]];
PORTC = SEGCHAR[sidy[4]];
TR5_on;
wait_ms(2);
TR5_off;
PORTA = SEGCHAR[sidx[5]];
PORTC = SEGCHAR[sidy[5]];
TR6_on;
wait_ms(2);
TR6_off;

PORTC = SEGCHAR[sidy[6]];
TR7_on;
wait_ms(2);
TR7_off;


count=count+1;
if (count == 40){dot1_off;dot2_off;}
if (count == 160){dot1_on;dot2_on;count=0;}
count1=count1+1;
if (count1 == 2000) {sokutei();count1=0; }

if(KEY_A){tset_sw=1;}
if(tset_sw == 1){
if(KEY_AOFF){tset_sw=2;}
}
if(tset_sw == 2){tset_flg=1;tset_sw=0;
SET_IDOU();
wait_ms(500);
henkou();
}




} //while(1)終了

return 0;

}


本文へジャンプ 2018年1月  
7SEG 大型時計