0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Arduino UNOと74HC595で遊ぶ

Last updated at Posted at 2022-04-27

目的
LEDを光らせる
LCDに応用予定

V Voltage 5V 電源
D Data データ 状態
C Clock クロック 周波
L Latch ラッチ 保持
G Ground グランド 接地

その1

o_con357.jpg

o_con352.jpg

その2

o_con355.jpg

LCD

o_con356.jpg

o_con353.jpg

RSを追加シフトを使用
8ビット系は、引数がcharで正解

最大32256バイトのフラッシュメモリのうち、スケッチが1102バイト(3%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。



#define DW   digitalWrite

//UNO
#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin

void seg1(char ch,char rs)
{

shiftOut(swdio, swdclk, MSBFIRST, ch);
digitalWrite(rs, HIGH);
digitalWrite(en, HIGH);delay(1);digitalWrite(en, LOW);

}

//初期化
void setup() {

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

}//setup


//ループ
void loop() {

    seg1(  0xff,0 ); delay(500); //500秒の待ち

    seg1(  0x01,0 ); delay(2000); //500秒の待ち

    seg1(  0xaa,0 ); delay(500); //500秒の待ち

    seg1(  0x00,0 ); delay(500); //500秒の待ち

}//loop


いつものバージョン





#define DW   digitalWrite

//UNO
#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin



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




//初期化
void setup() {

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

}//setup


//ループ
void loop() {

    seg1(  0xff,0 ); delay(500); //500秒の待ち

    seg1(  0x55,0 ); delay(500); //500秒の待ち

    seg1(  0xaa,0 ); delay(500); //500秒の待ち

    seg1(  0x00,0 ); delay(500); //500秒の待ち

}//loop




軽量コンパクトのオリジナル

最大32256バイトのフラッシュメモリのうち、スケッチが1098バイト(3%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が17バイト(0%)を使っていて、ローカル変数で2031バイト使うことができます。



#define DW   digitalWrite

//UNO
#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin


//シフトパターン
//              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


//初期化
void setup() {

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

}//setup


//ループ
void loop() {

    seg1(  0xff ); delay(500); //500秒の待ち

    seg1(  0x55 ); delay(500); //500秒の待ち

    seg1(  0xaa ); delay(500); //500秒の待ち

   seg1(  0x00 ); delay(500); //500秒の待ち

}//loop




shiftOutを使ったプログラム

最大32256バイトのフラッシュメモリのうち、スケッチが1104バイト(3%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。



#define DW   digitalWrite

//UNO
#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin





//初期化
void setup() {

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

}//setup


//ループ
void loop() {

shiftOut(swdio, swdclk, LSBFIRST, 0xff);
digitalWrite(en, HIGH);digitalWrite(en, LOW); delay(500); //500秒の待ち

shiftOut(swdio, swdclk, LSBFIRST, 0x55);
digitalWrite(en, HIGH);digitalWrite(en, LOW); delay(500); //500秒の待ち

shiftOut(swdio, swdclk, LSBFIRST, 0xaa);
digitalWrite(en, HIGH);digitalWrite(en, LOW); delay(500); //500秒の待ち

shiftOut(swdio, swdclk, LSBFIRST, 0x00);
digitalWrite(en, HIGH);digitalWrite(en, LOW); delay(500); //500秒の待ち

}//loop





無駄に高速化

最大32256バイトのフラッシュメモリのうち、スケッチが1240バイト(3%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。





#define DW   digitalWrite

//UNO
#define swdclk 4 // 4pin
#define swdio  3 // 3pin
#define en     2 // 2pin

#define  on1()   DW(swdio,0); //ビットが0
#define  off1()  DW(swdio,1); //ビットが1

void seg1(char v)
{

  if( v & 0b10000000){
    on1();  /*ビットが1*/  
  } else {
    off1(); /*ビットが0*/
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b01000000){
    on1();  /*ビットが1*/   
  } else {
    off1(); /*ビットが0*/
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b00100000){
    on1();  /*ビットが1*/   
  } else {
    off1(); /*ビットが0*/ 
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b00010000){
    on1();  /*ビットが1*/ 
  } else {
    off1(); /*ビットが0*/ 
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b00001000){
    on1();  /*ビットが1*/   
  } else {
    off1(); /*ビットが0*/ 
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b00000100){
    on1();  /*ビットが1*/  
  } else {
    off1(); /*ビットが0*/
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  if( v & 0b00000010){
    on1();  /*ビットが1*/   
  } else {
    off1(); /*ビットが0*/
  }//end if
  DW(swdclk,1);DW(swdclk,0);  

  if( v & 0b00000001){
    on1();  /*ビットが1*/   
  } else {
    off1(); /*ビットが0*/ 
  }//end if
  DW(swdclk,1);DW(swdclk,0);

  DW(en,1);
  DW(en,0);
}//seg1


//初期化
void setup() {

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

}//setup


//ループ
void loop() {

    seg1(  0xff ); delay(500); //500秒の待ち

    seg1(  0x55 ); delay(500); //500秒の待ち

    seg1(  0xaa ); delay(500); //500秒の待ち

    seg1(  0x00 ); delay(500); //500秒の待ち

}//loop



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?