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

 

 

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

 

続き

今回は文字データを表示して行きます。

 

プログラム

int num = 0;

//short data_bin[ ] = {B0000000000000000, 
//                    B0000001000000000, 
//                    B0000001000000000,
//                    B0011111111111000,
//                    B0000001000000000,
//                    B0000001000100000,
//                    B0000001111110000,
//                    B0000011000101000,
//                    B0001101001000100,
//                    B0001001001000100,
//                    B0010001010000100,
//                    B0010001100000100,
//                    B0010011000001100,
//                    B0011111000011000,
//                    B0000000001110000,
//                    B0000000000000000};
                    
short data_hex[ ] = {0x0000, 0x0200, 0x0200, 0x3ff8, 0x0200, 0x0220, 0x03f0, 0x0628,
                    0x1a44, 0x1244, 0x2284, 0x2304, 0x260c, 0x3d18, 0x0070, 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();
 }

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] & 0x8000 >> num) != 0) 
      digitalWrite(4,HIGH); // カラムA
    else
      digitalWrite(4,LOW); // カラムA
    clock();
  }
  digitalWrite(7,HIGH); // ラッチ
  digitalWrite(8,LOW); // イネーブル
  digitalWrite(7,LOW); // ラッチ

//  delay(100);
  num++;
  if(15 < num) {
    num = 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); // クロック
}

前回の横一線のラインが移動するプログラムとほとんど変わりません。

データの配列が追加されたのと if ((data_hex[i] & 0x8000 >> num) != 0) が増えた位です。あとdelay(100);をコメントアウトしています。

 

初めはコメントアウトの2進数の表記でデータを作ったのですが、16ビットではエラーが出てしまい16進数で配列を作り直しました。(中身は同じです。)

次のプログラム

if ((data_hex[i] & 0x8000 >> num) != 0)の説明

0x8000 >> numですが16進数0x8000を2進数で見ると1000000000000000となります。

>>はシフト命令でnum個分右に移ります。

例num=5なら0000010000000000でこれとdata_hex[i]のANDを取って0以外なら真になりカラムAをHIGHにセット、0ならLOWにセット。

data_hex配列のデータが16個 1個のデータに16ビット 16×16の256ドットこれを

loop()の中でセットして表示しています。

 

あらまぁ横向きになった。

自分の中では真っすぐに表示されると思い

マイコンボードに書き込むを押したのですが・・・

ロジックが間違っているのかなぁ

 

次回までに、修正とカラムBにも表示出来る様にして行きます。

 

では、また。

 

mckeechan.hatenadiary.com