STM32G031で秋月シリアル7セグに出力(ライブラリー化)



1.CLK,DATA,Eを接続
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


![o_con308.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d2ea9e7f-5829-0a1c-4f47-0006e46837d7.jpeg)





プログラム



```c++


//NANA_SEG_NS_UNO_1


#include <Arduino.h>


#include "NANA_SEG_UNO_1.h"


//初期化
void setup() {

  lcd.begin(16, 2);//初期化　引数は、無意味

  lcd.clear();  //クリア
  delay(500); //500秒の待ち

}//setup


//カウンター
unsigned char LL = 0;

//ループ
void loop() {

  //文字列の表示
  lcd.print("HELL");
  delay(2000); //2秒の待ち
  lcd.print("O");
  delay(1000); //1秒の待ち

  //文字列の表示
  lcd.print("WORL");
  delay(2000); //2秒の待ち
  lcd.print("D");
  delay(1000); //1秒の待ち

  //4桁の値の表示
  lcd.print(  (int)(LL++)  );
  //lcd.print(  (int)(LL++) , 0 ); //固定小数点
  delay(2000); //2秒の待ち

} //loop





```


NANA_SEG_UNO_1.hのプログラム



```c++



#define DW   digitalWrite

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


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 _
   0x40    //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


//LCD初期化関数
void lcd_int1()
{
    delay(3000); //not Delete

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

    //debug
    seg1(  seg[19] ); 
    seg1(  seg[20] );
    seg1(  seg[1] );
    seg1(  seg[18] );
    delay(3000);

}//lcd_int1


//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{
    ch_hex_a_b[4] = 0;

    if       ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
    } else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
    } else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
    } else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
    } else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
    } else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
    } else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
    } else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
    } else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
    } else                 {              ch_hex_a_b[0] = '0';
    }//if

    ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
    x = DIV10(x);                                     // 12 <= 123 / 10
    ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
    ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

    return(ch_hex_a_b);
} //ch_hex_a


//クラスの定義
struct _lcd {
    void begin(int col, int rows);     //メソッドの宣言
    void clear();                      //メソッドの宣言
    int  write(char ch);               //メソッドの宣言
    int  print(char *str1);            //メソッドの宣言
    int  print(int num);               //メソッドの宣言 オーバーロード
    int  print(int num,int n0);         //メソッドの宣言 オーバーロード
};


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::begin(int col, int rows)
{
    lcd_int1();
}//begin


//ポートをhiにする 初期化
//メソッドの定義
void _lcd::clear()
{
    //画面クリア
    seg1(  0  ); 
    seg1(  0  );
    seg1(  0  );
    seg1(  0  );
}//begin


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

//液晶への一文字出力
//メソッドの定義
int _lcd::write(char ch)
{
    char kk = 0;
    if(ch >= 0x80) { kk = 0x80; ch = ch - 0x80;}
    
    if(ch == ' ') {
        ch = '@';
    } else if(ch == '-') {
        ch = '_';
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0'];
    }
    
    seg1( seg[ch-64] | kk );
    
    return(0);
}//write


//文字列の表示
//メソッドの定義
int _lcd::print(char *str1)
{
    //文字の中身がゼロか
    while(*str1) {

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

    } //while

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


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _lcd::print(int num)
{
    char *str1;
    
    //マイナスの処理
    if(num < 0) {
        write('-');
        num = 0 - num;
        str1 = ch_hex_a(num)+1;
    } else {
        str1 = ch_hex_a(num);
    }
    
    //文字の中身がゼロか
    while(*str1) {

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

    } //while

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


//文字列の表示 オーバーロード 4桁 固定小数点
//メソッドの定義
int _lcd::print(int num , int n0)
{
    char *str1;
    
    //マイナスの処理
    if(num < 0) {
        write('-');
        num = 0 - num;
        str1 = ch_hex_a(num)+1;
    } else {
        str1 = ch_hex_a(num);
    }
    
    
    //固定小数点の処理
    //  3  2  1  0
    // [0][1][2][3]
    if( n0 >= 0 ) { str1[ 3 - n0  ] =  str1[ 3 - n0  ] | 0x80; }
    
    //文字の中身がゼロか
    while(*str1) {

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

    } //while

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


//実体の作成
_lcd lcd;





```