ATtiny85で128×64グラフィック描画を再挑戦してみた。

前回は途中でめげてしまい中断してしまったが気を取り直して再挑戦。とりあえずコードを最小化し機能追加して見た。

ちなみに、ATtiny85で128×64グラフィックス対応というのは私が知ってる限りたぶん世界で初めてかもしれない。普通の人はフレームバッファとなるRAMが足りないということですんなり諦めてしまうところだが考え方次第ではどうにでもなるという見本にして頂けたら幸いである。もちろん、得る物あれば失う物もあるのは当然のこと...今回は性能を犠牲にしているがそれでも平均的に30FPS以上は出ると思われるので表示性能的にはほとんど問題にはならないはず。

【グラフィック描画のサンプル動画】


【描画関数】
void beginPaint();
bool endPaint();
bool pixel(int x, int y);
void moveto(int x, int y);
void lineto(int x, int y);
void rect(int x, int y, int w, int h);
void fillRect(int x, int y, int w, int h);
void drawImage(int x, int y, int w, int h, uint8_t *image, uint8_t opt = 0);
void drawText(int x, int y, char *str);

まぁ、こんだけあればなんかに使えるだろう...たぶん。

基本的なロジックは前回と同じく画面領域を分割し少しずつ描画していく方法。今回のコードでは32分割しているのでendPaint()ループが32回ることになる。従って、注意点としてはグラフィック描画が完了するまで描画内容を変更してはいけない。

【アップデート】
2018-08-11
大中サイズの数字グリフをオリジナルな7セグLED風に変更&時計表示用に便利そうな関数を追加。
使い方はサンプルスケッチのClock()を参考にしてほしい。
void drawDigitAnimation(int x, int y, uint8_t num1, uint8_t num2, uint8_t anime, uint8_t size)
void drawDigit(int x, int y, uint8_t num, uint8_t size)
void drawcColon(int x, int y, uint8_t size)

2018-08-02
下記修正&機能追加を行った。この結果、コードサイズが超過してしまったためサンプルスケッチからグラフィック文字列描画をコメントアウトした。
・文字出力関数(printChar/printStr/printInt)実行後のカーソル位置が次行先頭に移動後の次文字列出力が誤動作するバグを修正。
・文字出力関数に制御文字処理(‘\b’,’\r’,’\n’)を追加。
・文字出力関数が最下位行から改行した時にスクロールする機能を追加。
・関数追加
void scroll();
void newline();
void circle(int x, int y, int radius);

【コンパイル情報】
最大6012バイトのフラッシュメモリのうち、スケッチが5944バイト(98%)を使っています。
グローバル変数は133バイトのRAMを使用しています。

【サンプルスケッチ】

【ライブラリ】