Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2020/10/28 01:26:07

MixJuice GET URL : kidspod.club/mj/1032

STM32G031J6M6 クリスマス 表示器

秋月で120円で売っている8ピンの
マイコンを使った7セグの表示器

出力用に3ピンしか取れなかったので
秋月のシリアル7セグ(200円)を使用した。

リセット端子で苦労した。
起動直後は、なぜか有効のためプルアップした。

その二は、低価格とswdclkとswdioを使ったバージョン
手間を考えたら秋月のシリアル7セグ200円を使った方が安い。
74hc164シフトレジスターを使って直接に7セグをドライブする。
swdclkとswdioをgpioとして使っているため3秒の起動ウエイトを
削除すると書き換えできなくなる可能性がある。
次の液晶開発する為に必要だった為に開発した。

  • 1
  • 2
  • 1
  • 2

SOURCE CODE

arduino用

#include <Arduino.h>

#define sdi1 PA8
#define sck1 PA12
#define latch1 PA0
#define DW   digitalWrite
#define in7 PB7

char seg[32][8] = {
 { 1,1,1,1,1,1,1,1 }, //0 @ -> ' '
 { 0,0,0,0,0,1,0,1 }, //1 A  o
 { 1,1,0,0,0,0,0,1 }, //2 B      combined use "6"
 { 0,1,0,1,0,0,1,1 }, //3 C
 { 1,0,1,0,0,0,0,1 }, //4 D
 { 0,1,0,0,0,0,1,1 }, //5 E  o
 { 0,1,0,0,0,1,1,1 }, //6 F
 { 0,1,0,1,0,0,0,1 }, //7 G
 
 { 1,0,0,0,0,1,0,1 }, //8 H  o
 { 1,0,1,1,1,1,0,1 }, //9 I     combined use "1"
 { 1,0,1,1,0,0,0,1 }, //10 J
 { 0,1,0,0,0,1,0,1 }, //11 K 
 { 1,1,0,1,0,0,1,1 }, //12 L  o
 { 0,1,1,1,0,1,0,1 }, //13 M
 { 0,0,0,1,0,1,0,1 }, //14 N  o
 { 0,0,0,1,0,0,0,1 }, //15 O  o combined use "0"
 
 { 0,0,0,0,0,1,1,1 }, //16 P
 { 0,0,0,0,1,1,0,1 }, //17 Q combined use "9"
 { 1,1,1,0,0,1,1,1 }, //18 R
 { 0,1,0,0,1,0,0,1 }, //19 S combined use "5"
 { 1,1,0,0,0,0,1,1 }, //20 T
 { 1,0,0,1,0,0,0,1 }, //21 U
 { 1,1,1,1,0,0,0,1 }, //22 V
 { 1,0,0,1,1,0,1,1 }, //23 W  o
 { 1,1,0,0,1,1,0,1 }, //24 X
 
 { 1,0,0,0,1,0,0,1 }, //25 Y
 { 0,0,1,0,0,0,1,1 }, //26 Z combined use "2"
 { 0,0,1,0,1,0,0,1 }, //27 [  --> "3"
 { 1,0,0,0,1,1,0,1 }, //28 \  --> "4"
 { 0,0,0,1,1,1,0,1 }, //29 ]  --> "7"
 { 0,0,0,0,0,0,0,1 }, //26 ^  --> "8"
 { 1,1,1,1,1,0,1,1 }  //31 _
};

void setup() {

    pinMode(sdi1,OUTPUT);
    pinMode(sck1,OUTPUT);
    pinMode(in7,INPUT_PULLUP);

    DW(sdi1,0);
    for(int i=0;i<10;i++){
        DW(sck1,1);
        delay(15);
        DW(sck1,0);
        delay(15);
    }

    pinMode(latch1,OUTPUT);
    delay(15);
    DW(latch1,0);
    delay(15);
    DW(latch1,1);
    delay(15);
    DW(latch1,0);
    delay(15);
}

int a;
int b;
int c;
int d;
//int e;
int f;

void loop() {

    DW(latch1,1);delay(500);DW(latch1,0);delay(500);
    DW(latch1,1);delay(500);DW(latch1,0);delay(500);
    DW(latch1,1);delay(500);DW(latch1,0);delay(500);

    //int i = 0;
    int s = 3;

    DW(sdi1,!(seg[s][7]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][3]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][2]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][4]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][5]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][6]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][1]));DW(sck1,1);DW(sck1,0);
    DW(sdi1,!(seg[s][0]));DW(sck1,1);DW(sck1,0);
    DW(latch1,1);DW(latch1,0);



    while(1) {

        while( digitalRead(in7) == 1 ) {}
        delay(35);
        a=!(digitalRead(in7));
        delay(35);
        b=!(digitalRead(in7));
        delay(35);
        c=!(digitalRead(in7));
        delay(35);
        d=!(digitalRead(in7));
        delay(35);

        //e=!(digitalRead(in7)); // 5 bit
        delay(35);
        f=!(digitalRead(in7));   // 6 bit
        delay(35);

        s=f*16+d*8+c*4+b*2+a;
        
        DW(sdi1,!(seg[s][7]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][3]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][2]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][4]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][5]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][6]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][1]));DW(sck1,1);DW(sck1,0);
        DW(sdi1,!(seg[s][0]));DW(sck1,1);DW(sck1,0);
        DW(latch1,1);DW(latch1,0);

        //delay(1000);

    } //while

}

ichigojam用

10 'START 0.5 DATA 6BIT SOTP 1
20 OUT 12,1:WAIT 15
30 [0]=ASC("C")
40 [1]=ASC("H")
50 [2]=ASC("R")
60 [3]=ASC("I")
70 [4]=ASC("S")
80 [5]=ASC("T")
90 [6]=ASC("M")
100 [7]=ASC("A")
110 [8]=ASC("S")
160 FOR I=0 TO 8
170 R=[I]:GOSUB 200:WAIT 60
180 NEXT
190 GOTO 160
200 '
210 R=R-64:OUT 11,0:WAIT 1
220 FOR S=0 TO 3+1
230 OUT 11,!( (R >> S)&1 )
240 WAIT 2
250 NEXT:WAIT 2:'6BIT
260 OUT 11,1
270 WAIT 2
280 RETURN


その2 低コスト(7hc164)とswdclk,sdwioを使用
技術検証用 参考ていどにしてください
!!!書き込みになんあり、マイコンを壊す可能性あり注意。!!!
起動3秒のウエイトは、消さないでください。
st-linkは、3秒以内に接続してください。

#include <Arduino.h>

//#define led1   PA8
//#define led2   PA12
//#define led3   PA0
#define swdclk PA14
#define swdio  PA13

#define DW   digitalWrite

    //#define swdclk PA8
    //#define swdio  PA12

#define in7 PB7

char seg[32][8] = {
 { 1,1,1,1,1,1,1,1 }, //0 @ -> ' '
 { 0,0,0,0,0,1,0,1 }, //1 A  o
 { 1,1,0,0,0,0,0,1 }, //2 B      combined use "6"
 { 0,1,0,1,0,0,1,1 }, //3 C
 { 1,0,1,0,0,0,0,1 }, //4 D
 { 0,1,0,0,0,0,1,1 }, //5 E  o
 { 0,1,0,0,0,1,1,1 }, //6 F
 { 0,1,0,1,0,0,0,1 }, //7 G
 
 { 1,0,0,0,0,1,0,1 }, //8 H  o
 { 1,0,1,1,1,1,0,1 }, //9 I     combined use "1"
 { 1,0,1,1,0,0,0,1 }, //10 J
 { 0,1,0,0,0,1,0,1 }, //11 K 
 { 1,1,0,1,0,0,1,1 }, //12 L  o
 { 0,1,1,1,0,1,0,1 }, //13 M
 { 0,0,0,1,0,1,0,1 }, //14 N  o
 { 0,0,0,1,0,0,0,1 }, //15 O  o combined use "0"
 
 { 0,0,0,0,0,1,1,1 }, //16 P
 { 0,0,0,0,1,1,0,1 }, //17 Q combined use "9"
 { 1,1,1,0,0,1,1,1 }, //18 R
 { 0,1,0,0,1,0,0,1 }, //19 S combined use "5"
 { 1,1,0,0,0,0,1,1 }, //20 T
 { 1,0,0,1,0,0,0,1 }, //21 U
 { 1,1,1,1,0,0,0,1 }, //22 V
 { 1,0,0,1,1,0,1,1 }, //23 W  o
 { 1,1,0,0,1,1,0,1 }, //24 X
 
 { 1,0,0,0,1,0,0,1 }, //25 Y
 { 0,0,1,0,0,0,1,1 }, //26 Z combined use "2"
 { 0,0,1,0,1,0,0,1 }, //27 [  --> "3"
 { 1,0,0,0,1,1,0,1 }, //28 \  --> "4"
 { 0,0,0,1,1,1,0,1 }, //29 ]  --> "7"
 { 0,0,0,0,0,0,0,1 }, //26 ^  --> "8"
 { 1,1,1,1,1,0,1,1 }  //31 _
// b c d e g f a     
//{1,1,1,1,1,1,1,1 }
// a b f g e d c
// 0 1 2 3 4 5 6
};



void setup() {

    // !!! swdclk(PA8) or swdio(PA12) not erase 3seconds !!!
    delay(3000);

    pinMode(swdclk,OUTPUT);
    pinMode(swdio,OUTPUT);
    pinMode(in7,INPUT_PULLUP);

    DW(swdio,0);
    for(int i=0;i<10;i++){
        DW(swdclk,1);
        delay(15);
        DW(swdclk,0);
        delay(15);
    }
}

int a;
int b;
int c;
int d;
//int e;
int f;

int s;

void loop() {

    s = 6;
    DW(swdio,(seg[s][7]));DW(swdclk,1);DW(swdclk,0); //dp //
    DW(swdio,(seg[s][6]));DW(swdclk,1);DW(swdclk,0); //c //
    DW(swdio,(seg[s][5]));DW(swdclk,1);DW(swdclk,0); //d //
    DW(swdio,(seg[s][4]));DW(swdclk,1);DW(swdclk,0); //e //
    DW(swdio,(seg[s][3]));DW(swdclk,1);DW(swdclk,0); //g //
    DW(swdio,(seg[s][2]));DW(swdclk,1);DW(swdclk,0); //f //
    DW(swdio,(seg[s][0]));DW(swdclk,1);DW(swdclk,0); //a //
    DW(swdio,(seg[s][1]));DW(swdclk,1);DW(swdclk,0); //b //

    delay(4000); 

    while(1){

        while( digitalRead(in7) == 1 ) {}
        delay(35);
        a=!(digitalRead(in7));
        delay(35);
        b=!(digitalRead(in7));
        delay(35);
        c=!(digitalRead(in7));
        delay(35);
        d=!(digitalRead(in7));
        delay(35);

        //e=!(digitalRead(in7)); // 5 bit
        delay(35);
        f=!(digitalRead(in7));   // 6 bit
        delay(35);

        s=f*16+d*8+c*4+b*2+a;

        DW(swdio,(seg[s][7]));DW(swdclk,1);DW(swdclk,0); //dp //
        DW(swdio,(seg[s][6]));DW(swdclk,1);DW(swdclk,0); //c //
        DW(swdio,(seg[s][5]));DW(swdclk,1);DW(swdclk,0); //d //
        DW(swdio,(seg[s][4]));DW(swdclk,1);DW(swdclk,0); //e //
        DW(swdio,(seg[s][3]));DW(swdclk,1);DW(swdclk,0); //g //
        DW(swdio,(seg[s][2]));DW(swdclk,1);DW(swdclk,0); //f //
        DW(swdio,(seg[s][0]));DW(swdclk,1);DW(swdclk,0); //a //
        DW(swdio,(seg[s][1]));DW(swdclk,1);DW(swdclk,0); //b //
    
    } //end whil
} //end loop

COMMENT

Kidspod運営チーム
Kidspod運営チーム2020/11/02 13:05:11

7セグでCHRISTMASを表示するプログラムでしょうか。IchigoJamでイルミネーションを制御するのはよくありますが、その中にこういう文字表示も組み込めると楽しそうです。