マイコンArduinoを使って電光掲示板を作る。

マイコンArduinoを使って電光掲示板を作る。

 

続き

前回持ち越した横スクロールに挑戦します。

 

前回のプログラムのloop()の中にある

if ((data_hex[31 - num + scroll] & 0x8000 >> i) != 0) // カラムA用

if ((data_hex[15 - num + scroll] & 0x8000 >> i) != 0) // カラムB用

を徹底的に見ていきます。

最初に31,15の違いについて、カラムAは右の文字を担当なので常にdata_hex[16]分ずらして表示。そもそも「15 - num」自体がまともに見せる為の姑息な方法。プログラムをややこしくしているが、いまさら後戻りできないのでこのまま行きます。

 

縦スクロールの原因、scrollを増してスクロールさせていますがdata_hex自体が横ラインのデータなのでどう頑張ってもこの方法では 無理

 

そこで考え付いたのがさらに姑息な方法。

横データを縦データに変換してからデータを読み込む方法。

プログラム

int num = 0;
int scroll = 0;
int count = 0;

short data_hex = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0200, 0x0200, 0x3ff8, 0x0200, 0x0220, 0x03f0, 0x0628,
                    0x1a44, 0x1244, 0x2284, 0x2304, 0x260c, 0x3d18, 0x0070, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x2010, 0x2018, 0x2008, 0x200c, 0x2004,
                    0x3004, 0x3004, 0x1186, 0x1106, 0x1b00, 0x0e00, 0x0400, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
                    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
                    
void setup() {
  // put your setup code here, to run once:
  pinMode(3,OUTPUT); // デジタルピンのD3を出力に設定する
  pinMode(4,OUTPUT); // デジタルピンのD4を出力に設定する
  pinMode(5,OUTPUT); // デジタルピンのD5を出力に設定する
  pinMode(6,OUTPUT); // デジタルピンのD6を出力に設定する
  pinMode(7,OUTPUT); // デジタルピンのD7を出力に設定する
  pinMode(8,OUTPUT); // デジタルピンのD8を出力に設定する
  cls();
  change(); // ここで変換
 }

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0;i < 16;i++) {
    if (i == num)
      digitalWrite(3,HIGH); // コモン
    else
      digitalWrite(3,LOW); // コモン
    if ((data_hex[i + scroll + 16] & 0x8000 >> num) != 0)  // 縦データ用に変更
      digitalWrite(4,HIGH); // カラムA
    else
      digitalWrite(4,LOW); // カラムA
      
    if ((data_hex[i + scroll] & 0x8000 >> num) != 0)            // 縦データ用に変更
      digitalWrite(5,HIGH); // カラムB
    else
      digitalWrite(5,LOW); // カラムB
    clock();
  }
  digitalWrite(7,HIGH); // ラッチ
  digitalWrite(8,LOW); // イネーブル
  digitalWrite(7,LOW); // ラッチ

//  delay(100);
  num++;
  if(15 < num) {
    num = 0;
    count++;
    if (count > 10) { // 10を書き替えるとスクロール速度が変る
      count = 0;
      scroll++;
      if (scroll > 16 * 4)
        scroll = 0;
    }
  }
}

void cls() {
  digitalWrite(3,LOW); // コモン
  digitalWrite(4,LOW); // カラムA
  digitalWrite(5,LOW); // カラムB
  clock();clock();clock();clock();clock();clock();clock();clock();
  clock();clock();clock();clock();clock();clock();clock();clock();
  digitalWrite(7,HIGH); // ラッチ
  digitalWrite(7,LOW);  // ラッチ
}

void clock() {
  digitalWrite(6,HIGH); // クロック
  digitalWrite(6,LOW);  // クロック
}

void change() {
  short local_hex[16 * 4];          // 4は移動文字数

  // データをクリア
  for (int n = 0;n < 16 * 4;n++) {  // 16はデータ数
    local_hex[n] = 0;               // ビット数は不要 0で16ビット全て0
  }

  for (int i = 0;i < 4;i++) {       // 4は移動文字数
    for (int j = 0;j < 16;j++) {    // 16はデータ数
      for (int k = 0;k < 16;k++) {  // 16はビット数
        if ((data_hex[j + i * 16] & 0x8000 >> k) != 0)  // 横データを
          local_hex[k + i * 16] |= 0x0001 << j;         // 縦データに
      }
    }
  }
  
  for (int n = 0;n < 16 * 4;n++) {
    data_hex[n] = local_hex[n];     // 元に戻す
  }
}

悪いプログラムの見本みたいなプログラム。どんどんどつぼに嵌まる。

 

しかし上手く行っているので良しとします。

スクロールの様子


www.youtube.com

 

change()無しの場合


www.youtube.com

 

次回は表示データを手入力ではない方法を模索していきます。

 

では、また。

 

mckeechan.hatenadiary.com