JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 鉄道部品制御のすすめ > 【鉄道部品】表示器の制御プログラムの関数化(楽に表示させる)

【鉄道部品】表示器の制御プログラムの関数化(楽に表示させる)

最終更新日さいしゅうこうしんび:2023-08-10

 表示器の制御では、スクロールさせたい場合、文字数に応じて 3 種類のスクロールを使い分ける必要がありました。しかし、これでは面倒です。そこで表示プログラムを関数化し、1 行で表示が行えるようにする方法を示します。

お知らせ
ここに示すプログラムは ESP32 用です。Arduino UNO ではスピードやメモリが不足する可能性があります。

スクロールの関数化(DUG の場合)

 02 系の車内表示器等 DUG 用のスクロールの関数です。まず、表示器の横幅 WIDTH をマクロ定義してください。

#define WIDTH 16*11

 この関数を使えば、次の 1 行でスクロールが可能です。横幅は sizeof(data)/16 で取得し、表示データのポインタを関数に渡しています。

scroll(*data, sizeof(data)/16);

 以下に関数を示します。なお、ESP32 用です。

void scroll(const unsigned char *data, unsigned long len) {
  unsigned long i,j,scr;
  unsigned char scrmode;
  if(WIDTH < len) {
    scrmode = 0;
  } else if(WIDTH == len) {
    scrmode = 1;
  } else {
    scrmode = 2;
  }
  switch(scrmode) {
    case 0:
      for(scr=0; scr<WIDTH; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=0; j<WIDTH-scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<scr; j++) {
            setColor(data[i*len+j]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      for(scr=0; scr<len-WIDTH; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=0; j<WIDTH; j++) {
            setColor(data[i*len+j+scr]);
            digitalWrite(CLOCK, LOW);
            delayMicroseconds(1);
            digitalWrite(CLOCK, HIGH);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      for(scr=0; scr<WIDTH; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=scr; j<WIDTH; j++) {
            setColor(data[i*len+j+(len-WIDTH)]);
            digitalWrite(CLOCK, LOW);
            delayMicroseconds(1);
            digitalWrite(CLOCK, HIGH);
          }
          for(j=0; j<scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, LOW);
            delayMicroseconds(1);
            digitalWrite(CLOCK, HIGH);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      break;
    case 1:
    for(scr=0; scr<WIDTH; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=0; j<WIDTH-scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<scr; j++) {
            setColor(data[i*len+j]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      for(scr=0; scr<WIDTH; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=scr; j<WIDTH; j++) {
            setColor(data[i*len+j+(len-WIDTH)]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      break;
    case 2:
      for(scr=0; scr<len; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=0; j<WIDTH-scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<scr; j++) {
            setColor(data[i*len+j]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      for(scr=0; scr<WIDTH-len; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=0; j<WIDTH-len-scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<len; j++) {
            setColor(data[i*len+j]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<scr; j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      for(scr=0; scr<len; scr++) {
        digitalWrite(RESET, LOW);
        delayMicroseconds(1);
        digitalWrite(RESET, HIGH);
        for(i=0; i<16; i++) {
          for(j=scr; j<len; j++) {
            setColor(data[i*len+j]);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          for(j=0; j<WIDTH-(len-scr); j++) {
            setColor(0);
            digitalWrite(CLOCK, HIGH);
            delayMicroseconds(1);
            digitalWrite(CLOCK, LOW);
          }
          digitalWrite(LATCH, LOW);
          delayMicroseconds(1);
          digitalWrite(LATCH, HIGH);
          delayMicroseconds(550);
        }
      }
      break;
  }
}

解説

 if 文で表示器の横幅 WIDTH と表示データの横幅 len を比較し、モードを決めます。そしてモードに応じて異なったスクロールプログラムを実行させています。

 静止表示や LUM でも同様の方法で関数化ができます(静止表示では横幅に応じて処理を変える必要はないですね)。要望があれば書きます。


戻る

広告

右メニュー

【表示がおかしい・崩れる場合】PC では Shift と F5 を同時押し。スマホではキャッシュを削除してみてください。



とうサイトでは Cookieくっきー使用しようします。くわしくは上記じょうきの「プライバシーポリシー・免責事項等めんせきじこうとう」もご確認かくにんください。



上へ戻る