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

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

 

続き

今回はEEPROMに書き込んでデータが記憶できるかに挑戦していきます。

 

前回のプログラムを基に作ったテスト用プログラム

#include <EEPROM.h>
byte address = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
short data_hex
= {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};
int pos = 0;
short inData = 0;
short value = 0;
boolean toggle = false;
boolean eep = false;
boolean completion = false;

void setup() {
  for (int i = 2; i < 13; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }
  pinMode(13,INPUT_PULLUP);
  pinMode(14,INPUT_PULLUP);

  digitalWrite(11,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(12,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で有効
  Serial.begin(19200);

  if (digitalRead(13) == 0) {
    eep = true;
  }
}

void loop() {
  if (Serial.available() > 0) {
    inData = Serial.read();
    if (!toggle) {
      value = inData * 256;
    }
    else {
      value |= inData;
      data_hex[pos++] = value;
    }
    toggle = !toggle;
  }

  if (pos == 32 && !completion) {
    for (int i = 0;i < pos;i++) {
      EEPROM.put(i * 2, data_hex[i]);
    }
    completion = true;
  }

  if (eep)
    eep_disp();
  else
    disp();
}

void eep_disp(){
  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++) {
      digitalWrite(9,LOW); // RED    赤データ
      if ((EEPROM.read(k * 2) + EEPROM.read(k * 2 + 1) * 256 & 0x1 << i) != 0) {
        digitalWrite(9,HIGH); // RED    赤データ
      }
      shift_clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void disp() {
  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] & 0x8000 >> i) != 0)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ              // データのセット
      shift_clock(); // クロック
    }
    
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
}

void shift_clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void write_ale_we() {
  digitalWrite(10,HIGH);// ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW);  // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

太字が追加部分

boolean eepはdigitalRead(13)が立ち上げ時に押されてるとeepromモードで表示

boolean completionは1回のみ書き込む為

eep_disp()のEEPROM.readで読み込み。バイト単位なので少しややこしい

 

テストの様子


www.youtube.com

上手く行きました。

再起動後にもeepromモードで「かき」と表示されます。

 

次回文字数を増やしてスクロール表示も出来るように改造していきます。

 

では、また。