OLED ALO-095BWNN-J9 のコントロールライブラリ

 

とりあえず、手習いにOLEDのライブラリをつくってみた。

基本の部分は

http://ecrafts.g.hatena.ne.jp/Lynx-EyED/20101105

このプログラム部分とaitendoのサンプルをそのままポーティング。

フォント系はオリジナル同様、misaki8x8フォントと5x7の半角フォントをそのまま流用。

(Ver1.01からは5x7のフォントを

フリーフォントの「6*8ドット日本語フォント「k6x8」」をpng->bmp形式に変換して、  ASCII部分だけを変換して使っています。

「6*8ドット日本語フォント「k6x8」」は、

りとりみ。(http://www.geocities.jp/littlimi/index.html)

にて公開されているフリーフォントです。

)

これを、stream継承でライブラリ化して、ごちゃごちゃした部分を再統合&関数名変更など

で基本ルーチンを再構成。

せっかくグラフィックがつかえるので、line/circle/boxを追加。

フォントが8x8なので小さすぎるとの指摘があったので、とりあえず、

縦倍角・横倍角・4倍角・36倍角ができるように修正。

といったところでしょうか。

 

ps.

Ver1.01からは任意サイズのグラフィックパターン描画に対応しています。(Pattern関数)

これにつかう配列要素をつくるサポートソフトを、当社のHPにあげてあります。

http://web.kyoto-inet.or.jp/people/mdr19944/index.html

から、「がらくた置き場」のページに飛んでください。

ページ最下段にBMP2DIMというソフトを公開しています。

24ビットカラーBMPを任意サイズの配列要素(RGB565形式)に生成できます。

フォント作成に関しては、BMP2FONTを利用してください。

 

 

 

<バージョン履歴>

Ver.104

フォントのY側ポジション計算がずれていたのを修正

描画のクリップ処理を見直す

 

Ver1.03

Box (GAC)コマンドの色指定値のバグ fix

 

Ver1.02

SSD1331/1332用 GACcommand対応   ただし現状ではRectangeしか機能しない模様

GAC有効コマンド GACEnalbe関数を追加

 

Ver1.01

フォントをk6x8フォントに変更。定義Hファイルも全角とは分離

フォント描画ルーチンが1ドットすくなく動くのを修正

任意カラーパターンを描画できるように修正

 

Ver1.00 初版公開

 

 

ライブラリのインポート

OledLib

 

解説

printfやputcが使えるように、streamを継承して作成。

通常の利用は

#include "spioled96x64.h"

SPIOLED96x64 oled(p14, p16, p15, p11, p12, p13);    //cs res dc mosi miso sck
を宣言して利用します。
実際にはMISOはつかっていないのですが、定義上、設定してます。

 

サンプルソース

UTF8を使えばソース中にコメントを日本語でいれられるようです。
キー入力はできないので、外部エディタでつくった文字列をペーストして挿入しています。
サンプルをみてもらうと、だいたい利用のしかたがわかるとおもいます。
streamクラスを継承することで、printfがつかえるのがうれしいところでしょうか。
// ALO-095BWNN-J9 test program
// See also "http://www.aitendo.co.jp/product/2099"
// aitendo 96x64dot OLED�
#include "mbed.h"
#include "spioled96x64.h"

//Serial pc(USBTX, USBRX);
SPIOLED96x64 oled(p14, p16, p15, p11, p12, p13);    //cs res dc mosi miso sck
    
const char ng_str[] = {0x82,0x6d,0x82,0x66,0x00};   // 全角NG
const char ok_str[] = {0x82,0x6e,0x82,0x6a,0x00};   // 全角OK
    
const char Large_s[] = {0x82,0x60,0x82,0x61,0x82,0x62,0x00};   // ABC
int main() 
{
    int lpx,lpy, ly, i;
    char s[32] = { 0 };
   
    while(1){
        // 赤で全画面クリア
        oled.Fill_Screen(0x001f);    //full red color in OLED
        wait_ms( 100 );

        // 緑で全画面クリア
        oled.Fill_Screen(0x07e0);    //full green color in OLED
        wait_ms( 100 );

        // 青で全画面クリア
        oled.Fill_Screen(0xf800);    //full blue color in OLED
        wait_ms( 100 );

        // 箱形描画(枠のみ)
        oled.Box(10,10, 90,60,oled.ColorConv(0x1f,0x00,0x00) ,0);
        wait_ms( 1500 );

        // 箱形描画(塗りつぶし)
        oled.Box(10,10, 45,60,oled.ColorConv(0x00,0x1f,0x00) ,1);
        wait_ms( 1500 );
        
    
        ly=0; 
        oled.SetFontSize(CS_NORMAL);     // 8x8
        oled.ChangeFontColor(0x001f);    // font Red
        oled.locate(0, ly);
        oled.printf( "ABC%s1234", (char *)Large_s );    //printfもつかえます
        oled.CS_Conv(&lpx, &lpy);        // 最終カーソルの縦横倍率を取得 
        ly += (Y_Witch*lpy);             // Go Next Line
        
        sprintf( s, "ABC%s1234", (char *)Large_s );
        oled.SetFontSize(CS_HIGH);           // 8x16
        oled.ChangeFontColor(0x07e0);        // font Green
        oled.locate(0, ly);
        oled.puts(s);    
        oled.CS_Conv(&lpx, &lpy);        // 最終カーソルの縦横倍率を取得 
        ly += (Y_Witch*lpy);             // Go Next Line

        oled.SetFontSize(CS_WH);           // 16x16
        oled.locate(0, ly);
        oled.puts(s);    
        oled.CS_Conv(&lpx, &lpy);        // 最終カーソルの縦横倍率を取得 
        ly += (Y_Witch*lpy);             // Go Next Line

        wait_ms(2500);

        ly=0; 
        oled.Fill_Screen(oled.ColorConv(0x1f,0x1f,0x00));    //Yellow (R:1f G:1f B:0)
        oled.SetFontSize(CS_WHx36);         // 48x48
        oled.ChangeFontColor(0x001f);       // font Red
        oled.locate(0, ly);
        oled.puts((char*)ng_str);    
        oled.CS_Conv(&lpx, &lpy);
        ly += (Y_Witch*lpy);
        wait_ms(2500);

        ly=0; 
        oled.Fill_Screen(oled.ColorConv(0x00,0x00,0x1f));    //Yellow (R:1f G:1f B:0)
        oled.ChangeFontColor(0x07e0);        // All Green
        oled.locate(0, ly);
        oled.puts((char*)ok_str);    
        oled.CS_Conv(&lpx, &lpy);
        ly += (Y_Witch*lpy);
        wait_ms(2500);
        
        oled.circle (30, 40, 30 ,oled.ColorConv(0x0f,0x0f,0x00) , 1);
        oled.line( 0,  0, Dis_X_MAX, Dis_Y_MAX, oled.ColorConv(0x00,0x1f,0x1f) ,0  );
        oled.line( Dis_X_MAX,  0, 0, Dis_Y_MAX, oled.ColorConv(0x00,0x1f,0x1f) ,1  );
        wait_ms(2500);
        
    }
}

定数

これらが定義済みです。
#define Dis_X_MAX 96-1      // スクリーンのX幅
#define Dis_Y_MAX 64-1      // スクリーンのY幅
#define X_Witch 8              // 全角キャラクタのX幅(半角は5固定+1)
#define Y_Witch 8              // キャラクタのY幅(全角半角共通)
//SetFontSize関数に与える定数値
#define CS_NORMAL  0     // ノーマルサイズ
#define CS_WIDE    1        // 横倍角(横x2)
#define CS_HIGH    2        // 縦倍角(縦x2)
#define CS_WH      3        // 4倍角 (横x2,縦x2)
#define CS_WHx36   4      // 36倍角(横x6,縦x6)

関数

  1. コントロールコマンド
    void  RegWrite(unsigned char Command);
    コントロールICにコマンドを発行します。
    void  DataWrite(unsigned char c);
    コントロールICにデータを1バイト発行します。(8bit)
    void  DataWrite_to(unsigned int Dat);
    コントロールICにデータを2バイト発行します。(16bit)
  2. キャラクタ関連
    void SetFontSize(int);
    フォントの倍率をしています。(CS_NORMAL/CS_WIDE/CS_HIGH/CS_WH/CS_WHx36)
    void CS_Conv(int *lpx, int *lpy);
    最後にセットされたフォントのX/Yの倍率を返します。
  3. 色関連

    void ChangeFontColor(unsigned int color);

    フォントの色を16bit値で指定します。

    指定はRGB565で

     

    0x001f:赤(0x00~0x1f)

    0x07e0:緑(0x00~0x3f)

    0xf800:青(0x00~0x1f)

    となります。
    引数に後述ColorConv関数を使うことでわかりやすく指定できます

     

    void ChangeBGColor(unsigned int color);

     

    背景色を16bit値で指定します。

    指定はRGB565で

     

    0x001f:赤(0x00~0x1f)

    0x07e0:緑(0x00~0x3f)

    0xf800:青(0x00~0x1f)

    となります。
    引数に後述ColorConv関数を使うことでわかりやすく指定できます

     

     

    unsigned int ColorConv(unsigned int R,unsigned int G,unsigned int B);

    RGB555で個別指定することでRGB565値を指定する16bit値を返します。

    指定はRGB各色とも0x00~0x1Fまでを指定します。

    本来、Gについては、0x3Fまで指定できるのですが、ややこしくなるのを避けるため

    Gについても1Fまでの値を設定させ、ソフト上でシフト処理をおこなっています。

    つまりRGB555->RGB565変換ルーチンといえます。

  4. グラフィック

    void GACEnable(int enable);

    OLEDコントローラである

    SSD1331/1332用のグラフィックアクセラレータコマンドを使って描画

     

    できるようにします。

     

    現状ではBox関数とfil_screen関数が高速化されるのみです。

    (GACにラインもあるのですが、挙動不審ですし、Copyやスクロールも機能しませんでした。)

     

    引数 enable   0:無効(ソフトルーチンで描画をおこないます)

    1:有効(GACを使って高速描画を行います)

     

    void locate(int column, int row);

    プロットするX、Yの各座標を指定します。

    フォント描画の左上座標としても利用します。

     

    int column();

    現在指定されているX座標を返します。

     

    int row();

    現在指定されているY座標を返します。

     

     

    void Draw_Dot(int x,int y,unsigned int Color);

    指定する座標に指定色(RGB565)でドットを描画します。

     

    void Box(int x1,int y1, int x2, int y2, unsigned int Color, int fill);

    指定する座標領域(左上XYと右下XY)に指定色(RGB565)で矩形を描画します。

    引数 fill に 0を指定すると矩形描画、1を指定すると塗りつぶしを行います。

    予め、GACEnableコマンドでGACを有効にしておくと、非常に高速に描画できます。

    引数は

    x1,y1 : 左上座標

    x2,y2 : 右下座標

    fill     : 色,塗りつぶしの有無(0:なし  1:あり)

     

    void Fill_Screen(unsigned int Color);

    全画面を指定色(RGB565)で塗りつぶします。

    このとき、背景色もこの色に指定されます。

    予め、GACEnableコマンドでGACを有効にしておくと、非常に高速に描画できます。

     

    void line( int x0,int y0,int x1,int y1, unsigned int fore_col ,int pat  );

     

    指定する座標区間に指定色(RGB565)で直線を描画します。

    引数 pat に 0を指定すると実線、1を指定すると破線で描画します

     

    引数は

    x1,y1 : 始点座標

    x2,y2 : 終点座標

    pat    :  線種   0:実線  1:破線

     

    void circle (int radius, int x, int y , unsigned int col, int fill);

    指定する座標を中心として指定色(RGB565)で円を描画します。

    引数 fill に 0を指定すると円描画のみ、1を指定すると塗りつぶしを行います。

     

    引数は

    radius : 半径

    x,y : 中心座標

    fill     : 色,塗りつぶしの有無(0:なし  1:あり)

     

    void Pattern(int x,int y,int width, int height, unsigned int *p);

    任意パターンを表示します。

    パターン配列pはポインタか、もしくは

    const unsigned int patdata[x][y] = {...}

    のような、2次元配列でとってください。

    他のフォントなどと同様、左下から上へ→向きに描画していきます。

    各配列要素はRGB565の値を指定して下さい。

    以下、サンプル

     

    const unsigned int patdata[5][5] = {
    
           {0xffff,0xffff,0xffff,0xffff,0xfffff}     /* 0(0000) */ 
    
          ,{0xffff,0xffff,0xffff,0xffff,0xfffff}     /* 1(0001) */ 
    
          ,{0xffff,0xffff,0xffff,0xffff,0xfffff}     /* 2(0002) */ 
    
          ,{0xffff,0xffff,0xffff,0xffff,0xfffff}     /* 3(0003) */ 
    
          ,{0xffff,0xffff,0xffff,0xffff,0xfffff}     /* 4(0004) */ 
    
    };
    
    oled.Pattern(0,0,5, 5, (unsigned int *)patdata);
      

     

     

     

     

     

     

 

 


4 comments

12 Jan 2011

おお、ブログ訪問ありがとうございます。

ライブラリも完成度が高く、すばらしいです。

12 Jan 2011

あ!ご本家様!!
はじめまして。
え~っと、本来はパブリッシュ前に、確認にうかがいたかったのですが、
聞く方法がなくて、勝手に発表してしまいました。申し訳ございません。

さきほどのVer1.01aで任意パターンを表示できるように関数を強化しています。
手元のサンプルボードでは、ねぎみくがバタバタと表示されています。
画像データはネットから落としてきたので、こういう場になかなか発表できないのですが....

近々、BMPから配列情報に落とし込めるサンプルソフトを公開予定です。
むかしつくったサンプルを拡張したので、使い勝手はあんまりよくないかも、ですが。

また、今回のバージョンから、半角フォントをk6x8フォントからおとしたものに
変更しています。おりじなるよりすこし見やすくなっているとおもいます。

こんごともどうぞよろしくお願いします。
user lynxeyed atsu wrote:

おお、ブログ訪問ありがとうございます。

ライブラリも完成度が高く、すばらしいです。

12 Jan 2011

いえいえ。

ボクも色々なサイトから引っぱって来ておりますので(^ω^;;

今後ともよろしくお願い致します。

12 Jan 2015
Hello dear. Please, can somebody to help me use this libs. with Xadow_M0. Thanks.

You need to log in to post a comment