マイコン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]; // 元に戻す
}
}
悪いプログラムの見本みたいなプログラム。どんどんどつぼに嵌まる。
しかし上手く行っているので良しとします。
スクロールの様子
change()無しの場合
次回は表示データを手入力ではない方法を模索していきます。
では、また。