STM32F767とDS1307で時計 秋月シリアル7セグに出力 (GPIO)(Arduino)


x時間合わせは、別

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![gpio_7seg_ds1307_767_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a7dda880-597f-1341-4e83-e6b383122300.jpeg)


H 0-23>22
M 0-59>41
22:41:00
22:41:00
22:41:01
22:41:02
22:41:03
22:41:04
22:41:05



```c++

#include <Arduino.h>
#include <Wire.h> //I2C library

//ds1307のアドレス
#define ADDR    0x68  // 2進数 1101000

//*          *****  *****  
//*         *       *    * 
//*         ******  *    *
//*         *       *    *
//*         *       *    *
//********   *****  *****

#define DW   digitalWrite

//031
// //#define swdclk   PA14 // 8pin
// //#define swdio    PA13 // 7pin
// #define swdclk   PA12 // 6pin
// #define swdio    PA11 // 5pin
// //#define t_led1   PA12 // 6pin
// //#define t_led2   PA11 // 5pin
// #define en       PA0  // 4pin
// #define in7      PB7  // 1pin

//767
#define swdclk   13 // 
#define swdio    11 // 
#define en       10 // 

char seg[32] = {
   0x00 , //0 @ -> ' '
   0x77 , //1 A  o
   0x7c , //2 B     　combined use "6"
   0x39 , //3 C
   0x5e , //4 D
   0x79 , //5 E  o
   0x71 , //6 F
   0x3d , //7 G

   0x76 , //8 H  o
   0x06 , //9 I    　combined use "1"
   0x1e , //10 J
   0x75 , //11 K 
   0x38 , //12 L  o
   0x15 , //13 M
   0x37 , //14 N  o
   0x3f , //15 O  o　combined use "0"

   0x73  , //16 P
   0x67  , //17 Q　combined use "9"
   0x50  , //18 R
   0x6d  , //19 S　combined use "5"
   0x78  , //20 T
   0x3e  , //21 U
   0x1c  , //22 V
   0x2a  , //23 W  o
   0x64  , //24 X

   0x6e  , //25 Y
   0x5b  , //26 Z　combined use "2"
   0x4f  , //27 [  --> "3"
   0x66  , //28 \  --> "4"
   0x27  , //29 ]  --> "7"
   0x7f  , //26 ^  --> "8"
   0x08    //31 _
};

//             12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

void seg1(char v)
{
    for(int jj=0;jj<8;jj++){
        if( (v & b8[jj]) == 0 ){
                DW(swdio,0); //ビットが0
        } else {
                DW(swdio,1); //ビットが1
        }//endif
        DW(swdclk,1);
        DW(swdclk,0);
    }//for
    DW(en,1);
    DW(en,0);
}//seg1

char nn[]={'O','I','Z','[','\\','S','B', ']','^','Q'};

int comma1=0; // コンマ(小数点)の有効フラグ　1で有効　0無効

//7segの一文字出力 nana_seg
int ns_putc(char ch) {

    if(ch == ' ') {
        ch = '@';
    } else if(ch == '.') {
        return(0);
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0'];
    }

    if( comma1 != 0 ) { comma1 = (0x80); }
    seg1(seg[ch-64] | comma1  );
    comma1 = 0;

    //戻り値
    return(0);
}//ns_putc

//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //コンマの処理
        comma1=0;
        if( (*(str1+1) ) == '.' ) { comma1=1; }

        //一文字出力
        ns_putc(*str1 ++);

    } //while

    //戻り値
    return(0);
}//ns_printf

//初期化
void setup() {

  delay(3000); //not Delete

  //7セグの初期化
  pinMode(swdclk,OUTPUT);
  pinMode(swdio,OUTPUT);
  pinMode(en,OUTPUT);
  DW(en,0);
  DW(swdclk,0);

  //i2cの初期化
  Wire.begin(); //uno

  ns_printf("STAR");delay(1000); //debug

  //Serial.begin( 9600 );//debug

}//setup

int  ii;           //ループカウンター
char data_read[8]; //バッファー
char h,m;          //時分

//ループ
void loop() {

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();
  delay(2);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }//for

  //Serial.println(data_read[2],HEX); //h debug
  //Serial.println(data_read[1],HEX); //m debug
  //Serial.println(data_read[0],HEX); //s debug

  //data_read[2]=0x12; //debug
  //data_read[1]=0x34; //debug

  h = data_read[2]; //時
  m = data_read[1]; //分

  //画面に表示
  data_read[0] = '0' + (h >> 4);
  data_read[1] = '0' + (h & 0xf);
  data_read[2] = '.';
  data_read[3] = '0' + (m >> 4);
  data_read[4] = '0' + (m & 0xf);
  data_read[5] = 0;
  ns_printf(data_read);
  //1秒待つ
  delay(1000);

}//loop




```

時間合わせ


```c++


#include <Wire.h>

// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000

int u_key;      // 受信データを格納するchar型の変数
int ch_in_key() {

  // 受信データがあった時だけ、処理を行う
  while(!Serial.available()) {}       // 受信データがあるか？
  u_key = Serial.read();            // 1文字だけ読み込む
  
  return(u_key);
}

int  ch_i;      //文字列のループカウンター
char ch_b[8+1]; //文字列のバッファー
int  ch_y;      //一文字分の一時バッファー

void ch_input()
{
    ch_i=0;
    while(1) {
        ch_y = ch_in_key();
        if(ch_y == 13){ch_b[ch_i]=0;Serial.println();break;}
        ch_b[ch_i]=ch_y;ch_i++;
        Serial.write( ch_y );
        if(ch_i >= 8){ch_b[ch_i]=0;Serial.println();break;}     
    } //while
} //ch_input

char ch_hex_b[3];
char *ch_hex(int l_num)
{
    ch_hex_b[0] = '0' + (l_num >> 4);
    ch_hex_b[1] = '0' + (l_num & 0xf);
    ch_hex_b[2] = 0;
    return(ch_hex_b);
}

void setup() {
  Serial.begin( 9600 );     // シリアル通信を初期化する。通信速度は9600bps

  // マスタとしてI2Cバスに接続する
  Wire.begin();

}

int h;
int m;
int a;
int b;

int p_val;
char data_read[16];
char cmd[2]={0,0};
int ii;     //ループカウンタ

void loop() {

///*INIT start *********  

    Serial.println( "" );  //改行

    Serial.print("H 0-23>");
    ch_input();         //文字列の入力
    h=atoi(ch_b);

    Serial.print("M 0-59>");
    ch_input();         //文字列の入力
    m=atoi(ch_b);

    a=(m/10)*16+(m%10);
    b=(h/10)*16+(h%10);

      // I2Cスレーブに対して送信処理を開始する
  Wire.beginTransmission(ADDR);
 
    // レジスタのアドレスを指定する(0-63の内、先頭から)
    Wire.write(0x00);
  
    // ---------------------------------
    //  タイマーキーパーレジスタ
    // ---------------------------------
    // 2進化10進数(BCD)で指定します。(03以外)
  
    // [00]Seconds(45秒)
    Wire.write(0);
    // [01]Minutes(59分)
    Wire.write(a);
    // [02]Hours(23時)
    Wire.write(b);
    // [03]Day(月)
    // 1:日 2:月 3:火 4:水 5:木 6:金 7:土
    Wire.write(3);
    // [04]Date(31日)
    Wire.write(1);
    // [05]Month(12月)
    Wire.write(1);
    // [06]Years(2017年)
    Wire.write(0x20);
 
  // I2Cスレーブへの送信完了
  Wire.endTransmission();

//*/  //INIT end *********

while(1){

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);
 
  // 8byteのデータを取得する
  for (ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  }


        ii=2;
        while(1){
            Serial.print(ch_hex(data_read[ii]));
            ii--;
            if(ii==-1){break;}else{Serial.print(":");}
        }
        Serial.println("");

 
  delay(1000);

}//while

} //loop


```


![h_con28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fbdc31b0-debb-eccf-e023-7d907b47e39b.jpeg)