読者です 読者をやめる 読者になる 読者になる

arduinoでグラフィック液晶SG12864を制御

http://q61.org/chibimo/build/ こちらのサイトを参考に配線を組み,プログラムの方は
自分で頑張って書いてみました.言語はc++ですが,arduinoのライブラリっぽい形にしたか
ったからというだけで特に深い意味はありません.ただ,書き上げたあとにarduinoのライブラリが
arduino.cc のplaygroundにあるということを知りました...

この後は,PC側から画面をキャプチャしてシリアルで転送するプログラムを作って,サブ液晶っぽくしたいです.
ちょっと,(プログラム側からの)画面キャプチャの方法がわからないんですけどね.

class GraphicLcd{
public:
  struct Status {
    int busy;
    int on_off;
    int reset;
  } 
  status;

  GraphicLcd(int di, int rw, int e, int res, int cs1, int cs2,
  int db0, int db1, int db2, int db3,
  int db4, int db5, int db6, int db7);
  void displayOnOFF(int on_off);
  void displayStartLine(int line);
  void setPageAddress(int page);
  void setColumnAddress(int column);
  void setChip(int chip);
  void statusRead(void);
  void writeDisplay(int data);
  int  readDisplay(void);
private :
  int di_pin;
  int rw_pin;
  int e_pin;
  int res_pin;
  int cs1_pin;
  int cs2_pin;

  int _data_pins[8];
  int _data;
	int di;
	int rw;
  int chip;

  void enable(void);
  void setData(void);
  void getData(void);
  int strToData(const char *string);
};

GraphicLcd::GraphicLcd(int di_pin,  int rw_pin,  int e_pin, int res_pin,
int cs1_pin, int cs2_pin, int db0, int db1, int db2, int db3, int db4, int db5,
int db6, int db7)
{
  this->di_pin = di_pin;
  this->rw_pin = rw_pin;
  this->e_pin  = e_pin;
  this->res_pin = res_pin;
  this->cs1_pin = cs1_pin;
  this->cs2_pin = cs2_pin;
  _data_pins[0] = db0;
  _data_pins[1] = db1;
  _data_pins[2] = db2;
  _data_pins[3] = db3;
  _data_pins[4] = db4;
  _data_pins[5] = db5;
  _data_pins[6] = db6;
  _data_pins[7] = db7;
  pinMode(di_pin,  OUTPUT);
  pinMode(rw_pin,  OUTPUT);
  pinMode(e_pin,   OUTPUT);
  pinMode(res_pin, OUTPUT);
  pinMode(cs1_pin, OUTPUT);
  pinMode(cs2_pin, OUTPUT);
  for(int i = 0; i < 8; i++){
    pinMode(_data_pins[i], OUTPUT);
    digitalWrite(_data_pins[i], HIGH);
  }
  digitalWrite(e_pin,    LOW);
  digitalWrite(di_pin,   LOW);
  digitalWrite(rw_pin,   LOW);
  digitalWrite(res_pin,  HIGH);
  digitalWrite(cs1_pin,  LOW);
  digitalWrite(cs2_pin,  LOW);
}

void GraphicLcd::enable(void)
{
  digitalWrite(di_pin, di);
  digitalWrite(rw_pin, rw);
  if(chip%2 == 0){
    digitalWrite(cs1_pin, LOW);
    digitalWrite(cs2_pin, HIGH);
  }
  else{
    digitalWrite(cs1_pin, HIGH);
    digitalWrite(cs2_pin, LOW);
  }
  setData();
  digitalWrite(e_pin, HIGH);
  digitalWrite(e_pin, LOW);
}

void GraphicLcd::setData(void)
{
  for(int i = 0; i < 8; i++){
    digitalWrite(_data_pins[i], (_data>>i)&1);
  }
}

void GraphicLcd::getData(void)
{
  _data = 0;
  for(int i = 0; i < 8; i++){
    _data |= (digitalRead(_data_pins[i])<<i);
  }
}

int GraphicLcd::strToData(const char *string)
{
  int data = 0;
  for(int i = 0; i < 8; i++){
    data <<= 1;
    data += string[i]=='1'?1:0;
  }
  return data;
}

void GraphicLcd::displayOnOFF(int on_off)
{
  di = LOW;
  rw = LOW;
  _data = strToData("00111110");
  _data |= on_off;
  enable();
}

void GraphicLcd::displayStartLine(int line)
{
  di = LOW;
  rw = LOW;
  _data = strToData("11000000");
  _data |= line;
  enable();
}

void GraphicLcd::setPageAddress(int page)
{
  di = LOW;
  rw = LOW;
  _data = strToData("10111000");
  _data |= page;
  enable();
}

void GraphicLcd::setColumnAddress(int column)
{
  di = LOW;
  rw = LOW;
  _data = strToData("01000000");
  _data |= column;

  enable();
}

void GraphicLcd::statusRead(void)
{
  di = LOW;
  rw = HIGH;
  _data = strToData("00000000");
  enable();
  getData();
  status.busy   = (_data>>7)&1;
  status.on_off = (_data>>5)&1;
  status.reset  = (_data>>4)&1;
}

void GraphicLcd::writeDisplay(int data)
{
  di = HIGH;
  rw = LOW;
  _data = data;
  enable();
}

int GraphicLcd::readDisplay()
{
  di = HIGH;
  rw = HIGH;
  enable();
  getData();

  return _data;
}

void GraphicLcd::setChip(int chip)
{
  this->chip = chip;
}

GraphicLcd glcd(17, 18, 19, 13, 11, 12,
2, 3, 4, 5,
6, 7, 8, 9);

void setup(void)
{
	delay(100);
}

void loop(void)
{
	for(int chip = 0; chip < 2; chip++){
		glcd.setChip(chip);
		for(int page= 0; page < 8; page++){
			glcd.setPageAddress(page);
			for(int col = 0; col < 64; col++){
				glcd.displayOnOFF(1);
				glcd.setColumnAddress(col);
				glcd.writeDisplay(0xFF);
			}
		}
	}
	for(int chip = 0; chip < 2; chip++){
		glcd.setChip(chip);
		for(int page= 0; page < 8; page++){
			glcd.setPageAddress(page);
			for(int col = 0; col < 64; col++){
				glcd.displayOnOFF(1);
				glcd.setColumnAddress(col);
				glcd.writeDisplay(0x00);
			}
		}
	}
}