スポンサーサイト

0

    一定期間更新がないため広告を表示しています

    • 2019.03.16 Saturday
    • -
    • -
    • -
    • by スポンサードリンク

    4連の7セグメントLEDをシフトレジスタで制御してピン数を節約する

    0
      JUGEMテーマ:Arduino

      前回の記事は7セグLEDドライバーの記事だったのですが、
      直接Arduinoに7セグLEDを接続した場合の11本の信号線から8本に削減することが出来ました。
      http://miha.jugem.cc/?eid=99

      今回はシフトレジスタを使用してもっと節約してみたいと思います。

      ぐるぐる

      カウンタ

      上は、完成の映像ですが、
      Arduinoに直接接続した場合と区別がつきません。
      7セグメントLEDドライバーと違い数字以外の出力も可能です。

      シフトレジスタの動作
      シフトレジスタはシリアルの情報をマイコンのクロックに合わせてレジスターに取り込んでいきます。
      74LC595ひとつで8ビットのデータを取り扱う事が出来ます。
      動作
       1.LATCHPIN(RCK)をLOWにしてデータ書込み開始する。
       2.DATAPIN(SI)にデータをセットする。ここではデータは1ビットでHIGH(5V)またはLOW(0V)のどちらかをセットする。
       3.CLOCKPIN(SCK)にHIGHをセットする。
       →74HC595はSCKがHIGHになったときのSIの信号を取り込む。
       4.CLOCKPIN(SCK)にLOWをセットする。
       5.上記の2.〜4.を必要なビット数分繰り返す。
       6.LATCHPIN(RCK)をHIGHにしてデータ書込み終了する。
       →74HC595はRCKがHIGHなると、取り込んだデータを出力側(QA〜QH)に反映する。
       (下のプログラムを見ると判りやすいかもしれません。)
      9ビット以上のデータを取り扱う場合は74HC959の9番ピン(QH*)を次の74HC959のSIに接続すると16ビットのデータを扱う事が可能になります。
      他のピンは1段目の74HC595と同じでかまいません。
      データシートが英語で判りにくかったのでhttp://www.wdic.org/w/SCI/74595が参考になると思います。

      今回は1桁のセグメント出力で8ビット使用して、桁数の指定で4ビット必要になりますので2個の74HC595をカスケード接続しています。

      回路図

      回路図を見てください。Arduinoとの信号線の接続はなんと、3本だけになりました。
      当初が11本だったのに比べると3本ってすごいと思いませんか?

      ぐるぐるのプログラム
      //7セグLEDぐるぐるシフトレジスタ75HC595N

      #define DATAPIN  (2)  // 74LC595の(14)SIへ
      #define LATCHPIN (3)  // 74LC595の(12)RCKへ
      #define CLOCKPIN (4)  // 74LC595の(11)SCKへ

      struct PTN{
        int nOut;
      };
      struct PTN ptn[7]
      {
        B00000001,
        B00000010,
        B00000100,
        B00001000,
        B00010000,
        B00100000,
        B01000000
      };

      void setup() {
        // put your setup code here, to run once:
        pinMode(DATAPIN, OUTPUT);
        pinMode(LATCHPIN, OUTPUT);
        pinMode(CLOCKPIN, OUTPUT);
      }

      int nKai = 0;
      void loop() {
       
        for(int i=0;i<6;i++){
          Out(3-nKai, i);
          delay(100);
        }
       
        nKai++;
        if(nKai>=4){
          nKai = 0;
        }
      }

      void Out(int nKeta, int nValue)
      {

        digitalWrite(LATCHPIN, LOW);
        ShiftOut8( DATAPIN, CLOCKPIN, ~(B00000001 << nKeta));
        ShiftOut8( DATAPIN, CLOCKPIN, ptn[nValue].nOut);
        digitalWrite(LATCHPIN, HIGH);
        delay(1);
      }

      void ShiftOut8( int dataPin, int clockPin, unsigned long val )
      {
        for( int i = 7; i >= 0; i-- ){
          digitalWrite(dataPin, !!(val & (1L << i)));
          digitalWrite(clockPin, HIGH);
          digitalWrite(clockPin, LOW);
        }
      }

      カウンターのプログラム
      //7セグLEDカウンタ-シフトレジスタ75HC595N

      #define DATAPIN  (2)  // 74LC595の(14)SIへ
      #define LATCHPIN (3)  // 74LC595の(12)RCKへ
      #define CLOCKPIN (4)  // 74LC595の(11)SCKへ

      struct PTN{
        int nOut;
      };
      struct PTN ptn[10]
      {
        B00111111, //0
        B00000110, //1
        B01011011, //2
        B01001111, //3
        B01100110, //4
        B01101101, //5
        B01111101, //6
        B00000111, //7
        B01111111, //8
        B01100111  //9
      };

      void setup() {
        // put your setup code here, to run once:
        pinMode(DATAPIN, OUTPUT);
        pinMode(LATCHPIN, OUTPUT);
        pinMode(CLOCKPIN, OUTPUT);
      }

      int nCount = 0;
      int nKai = 0;
      void loop() {
        Out4Digit(nCount);
        nCount++;
        if(nCount>=10000){
          nCount=0;
        }
      }

      void Out4Digit(int nValue)
      {
        for(int i=0;i<4;i++){
          int amari = nValue %10;
          Out(i, amari);
          nValue = nValue / 10;
        }
      }

      void Out(int nKeta, int nValue)
      {

        digitalWrite(LATCHPIN, LOW);
        ShiftOut8( DATAPIN, CLOCKPIN, ~(B00000001 << nKeta));
        ShiftOut8( DATAPIN, CLOCKPIN, ptn[nValue].nOut);
        digitalWrite(LATCHPIN, HIGH);
        delay(1);
      }

      void ShiftOut8( int dataPin, int clockPin, unsigned long val )
      {
        for( int i = 7; i >= 0; i-- ){
          digitalWrite(dataPin, !!(val & (1L << i)));
          digitalWrite(clockPin, HIGH);
          digitalWrite(clockPin, LOW);
        }
      }

      写真

      奥の黒いのが74HC595です。


      スポンサーサイト

      0
        • 2019.03.16 Saturday
        • -
        • 14:47
        • -
        • -
        • by スポンサードリンク


        PR

        calendar

        S M T W T F S
         123456
        78910111213
        14151617181920
        21222324252627
        282930    
        << April 2019 >>

        selected entries

        categories

        archives

        recent comment

        recent trackback

        profile

        search this site.

        others

        mobile

        qrcode

        powered

        無料ブログ作成サービス JUGEM