Skip to content

OLED_SH1106

朝日薫 edited this page Feb 4, 2023 · 1 revision

OLED_SH1106 クラスリファレンス

SH1106コントローラを用いたOLEDパネル(I2C)制御用の疑似コンソールクラス。 現状は 0.96インチ 128x64ピクセル 単色OLEDパネル用を横向きで使用する機能と 初期化インスタンスのみ提供されている。

疑似コンソールなのでピクセル直接描画は出来ない。ASCIIキャラクタ描画専用。

SSH1107コントローラ用の実装は [OLEDディスプレイ(U119)キャラクタコンソール実演] を参照のこと。

SH1106は内部的に132x64ピクセルぶんのGDDRAMを持っているが、 ここでは128x64ピクセルパネルを使用し両端2ピクセルが存在しない品種を対象にしている。

用例

#include <OLED_SH1106_128x64.h>
OLED_SH1106_Class OLED = {Wire, moderndos_8x16_vh};

Wire.initiate(TWI_SM, false);

OLED.clear();

OLED.println(F("Hello World!"));

I2C通信速度はTWI_SM(100kbps)が標準だが TWI_FM(400kbps)も選択可能。 低速対応も可能。

<OLED_SH1106_128x64.h>

依存性:<api/TWIM.h> <FontSets.h>

class OLED_SH1106_Class を定義する。

クラスインスタンス

OLED_SH1106_Class OLED = {Wire, moderndos_8x16_vh};

初期化子の第1引数には<api/TWIM.h>TWIMクラスインスタンスを、 第2引数には 8x16 ピクセルかつビットマップ方向が縦向きのモノクロフォントセットを指定する。

既定フォントセットはキャラクタコード0x200x7Fのグリフ集合と見做され、 1キャラクタ=16Bytesで、計1536Byte長が使用される。

スクロール表示

既定では単にOLEDへプリントしていけば、それはスクロールコンソール表示になる。 \rで仮想カーソル位置が行頭に復帰、 \nで新規改行、 16文字毎に行頭折返しで自動的にスクロールが進む。

OLED.println(F("Hello World!"));

絶対位置表示

clear(false)メソッドで画面消去すると、以後は絶対位置表示モードになる。 仮想カーソルが画面表示外に移動しても自動スクロールはされない。 仮想カーソル位置は左上原点としてsetPosition(X,Y)で自由に設定できる。

OLED.clear(false);
OLED.setPosition(0, 0).print(F("1st line"));
OLED.setPosition(0, 1).print(F("2nd line"));

4行分の画面があるので、仮想カーソルのY3まで指定可能。 上下方向の表示開始位置はsetScroll(Z)メソッドで変更することができる。 Zには0から63が指定でき、ピクセル単位で調整できる。 これを使うと1ピクセル単位のスムーズスクロールができる。(画面上下はリング状に繋がっている)

OLED.setPosition(0, 0).print(F("top view"));
OLED.setPosition(0, 3).print(F("end view"));

OLED.setScroll(0);  /* "top view" is top */
OLED.setScroll(48); /* "end view" is top */

128x32ピクセルパネルの場合、2行だけが表示されるが 内部的には4行分のメモリが保持されている。

特定の行だけをクリアするにはnewLine(Y)メソッドを使用する。

OLDE.newLine(1);

絶対位置表示を止めてスクロール表示に戻すにはclear(true)メソッドを実行する。

デバイス制御

OLED_SH1106_Class& disable (void)

OLEDパネルを消灯し、スリープ状態にする。 メソッドチェーン可能。 disable状態から復帰するには clearまたは setContrastを使用する。 スリープ中も通電されている限り表示RAM内容は保持される。

OLED.disable();

画面スリープ中でも描画命令は反映される。

OLED_SH1106_Class& clear (bool console_mode = true)

OLEDパネルを初期化し、表示内容をクリアする。 仮想カーソル位置は左上原点(0,0)に置かれる。 メソッドチェーン可能。 電源断状態からOLEDパネルを使用開始するには 最初にこのメソッドが使用されなければならない。

引数にtrue(省略時既定値)が指定されるとスクロール表示モードとなる。

引数にfalseが指定されると絶対位置表示モードになる。

OLED.clear();

OLED_SH1106_Class& setFlip (bool flip_mode = true)

OLEDパネルの表示向きを変更する。 引数がfalse(既定値)で正位置、trueで180度逆位置になる。 メソッドチェーン可能。 90度回転することは出来ない。 左右反転(鏡像)表示は支援されない。

OLED.setFlip(true);

OLED_SH1106_Class& setRevesible (bool reverse_mode = true)

OLEDパネルの表示状態を変更する。 引数がfalse(既定値)で黒地に白(点灯)、trueで白地に黒(消灯)となる。 メソッドチェーン可能。

点灯ドットが多いほど消費電力は増加する。

OLED.setRevesible(true);

OLED_SH1106_Class& setContrast (uint8_t _contrast)

OLEDパネルの輝度を変更する。 0255が指定可能。 メソッドチェーン可能。 初期値は128(50%)

輝度が高いほど消費電力は増加する可能性がある。 またこのメソッドはOLEDパネルのスリープ状態を解除する。

OLED.setContrast(128);

OLED_SH1106_Class& setScroll (uint8_t _offset)

OLEDパネルの表示開始位置を変更する。 064が指定可能。 メソッドチェーン可能。

OLED.setScroll(32);

このメソッドは絶対位置表示モードにて機能し、 スクロール表示モードでは意図した結果とならない。

OLED_SH1106_Class& setPosition (uint8_t _x, uint8_t _y)

仮想カーソル位置を指定位置に変更する。 メソッドチェーン可能。

OLED.setPosition(0, 0).print(F("1st line"));

OLED_SH1106_Class& drawTestPattern (uint8_t _offset = 0)

OLEDパネル全面にテストパターンを表示する。 メソッドチェーン可能。

OLED.drawTestPattern();

フォント制御

OLED_SH1106_Class& setFontSet (const uint8_t* _ptr)

使用する既定フォントセット(キャラクタコード0x200x7Fの範囲:1536Bytes)を変更する。 指定するポインタはPGMEMを指していなければならない。 メソッドチェーン可能。

OLED.setFontSet(moderndos_8x16_vh);

OLED_SH1106_Class& setExtTableInROM (const uint8_t* _ptr)

上位拡張フォントセット(キャラクタコード0x800xFFの範囲:2048Bytes)を変更する。 指定するポインタはPGMEMを指していなければならない。 メソッドチェーン可能。

OLED.setExtTableInROM(moderndos_8x16_vh);

キャラクタコード0x000x0Fのグリフはこの範囲の後方に追加できる。

OLED_SH1106_Class& setExtTableInRAM (void* _ptr)

外字フォントセット(キャラクタコード0x100x1Fの範囲:256Bytes)を変更する。 指定するポインタはデータメモリ(RAM)を指していなければならない。 メソッドチェーン可能。

/* Global value */
static uint8_t extra_table[256] = {};

OLED.setExtTableInRAM(extra_table);

日本語漢字表示を行うには、漢字ROMからグリフを読み出し、RAMに書き、外部フォントセットとして描画する。 横倍角描画も同様。 縦倍角描画は2行に分けてこれを行う。

OLED_SH1106_Class& setExtFont (uint8_t* _ram_table, uint8_t _c, uint8_t _logic = OLED_SET)

グリフ合成ユーティリティ。 主に外字フォントセット領域へのグリフ合成に使用する。 メソッドチェーン可能。

for (int i = 0; i < 16; i++) {
  OLED
    .setExtFont(&extra_table[i << 4], '@' + i, OLED_SET) /* Load ROM Font */
    .setExtFont(&extra_table[i << 4], '\x0', OLED_XOR)   /* Exor Mask */
  ;
}

第1引数には書き出されるデータメモリ(RAM)ポインタを渡す。 第2引数には読み出されるフォントセットのキャラクタコードを指定する。 ただし0x20未満はキャラクタではなく塗りつぶしと見做される。 第3引数には RAMに対する合成論理を指定する。

合成指定 説明
OLED_SET RAMにグリフをコピーする(既定値)
OLED_OR RAMにグリフをOR合成する
OLED_AND RAMにグリフをAND合成する
OLED_XOR RAMにグリフをXOR合成する

描画制御

OLED_SH1106_Class& drawChar (uint8_t _ax, uint8_t _ay, uint8_t _c);

指定カーソル絶対位置に直接指定キャラクタを描画する。 メソッドチェーン可能。 制御文字は解釈されないのでキャラクタコード0x000x0F範囲も描画できる。

OLED_SH1106_Class& newLine (uint8_t _ay, bool _scroll = false)

第1引数に指定した行の描画を消去する。 第2引数がtrueならそれを画面最下行になるようスクロールする。 メソッドチェーン可能。

size_t write (const uint8_t _c)

size_t write (const char* _buffer, size_t _length)

仮想カーソル位置に指定キャラクタを描画する。 描画したキャラクタ数を返す。メソッドチェーン不可。 以下の制御文字が解釈される。

制御文字 説明
\b 仮想カーソルを左に1文字戻す。ただし画面左端から前行には戻らない。
\r 仮想カーソルを画面左端の行頭に戻す。表示行中の描画は消されない。
\n 仮想カーソルを次行に(真下に)移動する。移動先の行の描画は消去される。
\f 現在の画面を消去し、仮想カーソルを左上原点に移動する。
\t 仮想カーソルを次の水平タブ位置(4カラム単位)まで右に進める。移動範囲の描画は消されない。

OLED_SH1106_Class& send (const uint8_t _c)

OLED_SH1106_Class& send (const char* _buffer, size_t _length)

writeに同じだがメソッドチェーン可能。

Print& print (...)

print文とその派生メソッドは<api/Print.h>を参照のこと。

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally