12chアッテネータ2検討(製作編23)

製作編23

OLEDパネルの表示プログラミングを行う為に、説明書に掲載されたプログラム例を理解します。

秋月電子プログラム例

ソースの最初の「#include 」は、I2Cインターフェース制御用のライブラリを使用する事を宣言します。その時の出力ポートは「SCL」と「SDA」です。このライブラリの使い方は以下のとおりです。

Wire.beginTransmission(OLED_ADRS);

Wire.write(0xXX);

Wire.endTransmission();

OLED_ADRSは、OLEDパネルのSAL=0なので0x3Cです。「0xXX」は送信データです。「Wire.write(0xXX);」の行を増やすと、転送データを増やす事ができます。OLEDパネルのWriteモード時のシリアルデータ仕様は以下のとおりです。

上記のソース3行でslave addresと0wordsまでが発信されます。次はコマンドの送信です。例として下記の「ClearDisplay」コマンドを考えてみます。

byte command = 0x01;

wirteCommand(command);

 

void writeCommand(byte command) {

Wire.beginTransmission(OLED_ADRS);

Wire.write(0x00);

Wire.write(command);

Wire.endTransmission();

}

最初の0x00はコマンド発信を明示し、次の0x01がClearDisplayコマンドです。同様にデータ発信を考えてみます。対応する仕様は以下のとおりです。

byte = 0xXX;

wirteData(byte);

 

void wirteData(byte data) {

Wire.beginTransmission(OLED_ADRS);

Wire.write(0x40);

Wire.write(data);

Wire.endTransmission();

}

コマンド発信との違いは、最初の転送バイトが0x40となっている点です。D/Cビットを1としてデータ発信を明示しています。最後にSet Contrast Controlコマンドを発信してみます。対応する仕様は以下のとおりです。

このコマンドは2バイト構成となっていて、最初に0x81を発信し、次に1byteのコントラスト情報を発信します。このコマンドを発信するためには、事前にREとSDを1にしておく必要があります。ビット操作に使用するコマンドは以下のとおりです。

writeCommand(0x2a); //RE=1

writeCommand(0x79); //SD=1

wirteCommand(0x81); //Set Contrast Controlコマンド

writeCommand(0xD0); //コントラストD0セット

wirteCommand(0x78); //SD=0

wirteCommand(0x28); //RE=0

なんでこんな面倒な仕様となっているかと言うと、このコマンドはOLEDコマンドセット中の1つで、後から拡張されたと考えられます。以前のLSIの上位互換をとるためにこのような仕様になっていると思われます。これでプログラム例の理解ができたので、次回は必要な表示操作のプログラムを作成してみます。

 

つづく(製作編24)