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 初版公開
ライブラリのインポート
解説
printfやputcが使えるように、streamを継承して作成。
通常の利用は
#include "spioled96x64.h" SPIOLED96x64 oled(p14, p16, p15, p11, p12, p13); //cs res dc mosi miso sck
サンプルソース
// 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); } }
定数
関数
- コントロールコマンド
void RegWrite(unsigned char Command);コントロールICにコマンドを発行します。void DataWrite(unsigned char c);コントロールICにデータを1バイト発行します。(8bit)void DataWrite_to(unsigned int Dat);コントロールICにデータを2バイト発行します。(16bit) - キャラクタ関連
void SetFontSize(int);フォントの倍率をしています。(CS_NORMAL/CS_WIDE/CS_HIGH/CS_WH/CS_WHx36)void CS_Conv(int *lpx, int *lpy);最後にセットされたフォントのX/Yの倍率を返します。 - 色関連
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変換ルーチンといえます。
- グラフィック
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
You need to log in to post a comment
おお、ブログ訪問ありがとうございます。
ライブラリも完成度が高く、すばらしいです。