マイコンArduinoを使って電光掲示板を作る。
続き
今回は、スクロール表示に改造していきます。
改造と言ってもこれまた前モジュールのプログラムを流用していきます。
前回の固定表示との違いは太字文字の部分のみ
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 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() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
else
digitalWrite(9,LOW); // RED 赤データ // データのセット
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > 20) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32) // - 32は前の2文字分
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
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] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
前モジュールに比べてあまりにも簡単です。
今回のモジュールでの新しい部分、次回は3色カラー表示に改造していきます。
では、また。