Arduino UNOと74HC595で遊ぶ


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


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


その1


![o_con357.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/69e5a0cb-45bd-0b34-e14f-603c77eab679.jpeg)









![o_con352.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9b70f599-7d7c-d4c2-e747-7f09e9a7b30d.jpeg)


その2


![o_con355.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/311cdd66-eaab-3602-6495-69acf1552e7d.jpeg)




LCD

![o_con356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f919cc50-9854-81e5-08b1-d9381f0ab7e6.jpeg)




![o_con353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e99e329b-ccea-e74e-b1ce-d1c796a64736.jpeg)



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


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



```c++


#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


```

いつものバージョン


```c++




#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バイト使うことができます。





```c++


#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バイト使うことができます。


```c++


#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バイト使うことができます。




```c++




#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



```