実はM5StickCのライブラリには組み込みの漢字フォントが入っています。
※現時点の情報ですので、最新情報はM5StickC非公式日本語リファレンスを確認してください。
注意
実際に漢字などのフォントを利用する場合には、以下のページがおすすめです。
フォントデータについて
PROGMEM指定されているので、利用するときにはRAMではなくて、FLASHに保存されていて、プログラムからの参照がなければ、実際には転送されないみたいです。
#include <M5StickC.h> void setup() { Serial.println( sizeof( HZK16 ) ); } void loop() { }
ちなみに上記コードだと267616って返ってきますが、実際のフォントデータはありません。
#include <M5StickC.h> void setup() { for( int i = 0 ; i < 3 ; i++ ){ Serial.println( HZK16[i] ); } } void loop() { }
上のコートでもスケッチのサイズが増えていないので、データはありません。
#include <M5StickC.h> void setup() { for( int i = 0 ; i < 4 ; i++ ){ Serial.println( HZK16[i] ); } } void loop() { }
for文のループ回数を4回以上にすると、スケッチサイズが増えてフォントがFLASH領域に転送されます。
これはコンパイラの最適化とかの関係なのかな?
ちなみにfor文じゃなくて中身の行を並べても、スケッチサイズは増えませんでしたので、フォントは転送されていません。
M5.Lcd.loadHzk16();
正規のフォントロード関数を呼び出すと、実際に転送されるので使うときにはちゃんとロード関数を呼びましょう。呼び出していないときには、メモリ上少しだけ無駄になっていますが、大きなフォントデータが読み込まれていることはないと思います。
サンプルプログラム
#include <M5StickC.h> void setup() { // 表示文字列セット char* AscStr="ASCII: \nABCDEFG12"; char GbkStr[11] = { 0xB4, 0xF3, // 大 0xD0, 0xDC, // 熊 0xC3, 0xA8, // 猫 0xB4, 0xF3, // 大 0xBA, 0xC3, // 好 0x00 }; M5.begin(); // フォントデータロード M5.Lcd.loadHzk16(); // 文字色白、背景色黒に設定 M5.Lcd.setTextColor(WHITE, BLACK); // ハイライトカラーを赤に設定 M5.Lcd.setHighlightColor(RED); // Hzk Font1(16ピクセル)でサイズ等倍、カーソル左上でASCII文字列表示 M5.Lcd.setTextSize(1); M5.Lcd.setCursor(0,0,1); M5.Lcd.writeHzk(AscStr); // ハイライトして同じものを表示 M5.Lcd.highlight(true); M5.Lcd.setCursor(0,32); M5.Lcd.writeHzk(AscStr); // 通常Font2(16ピクセル)でASCII文字列表示 M5.Lcd.setTextSize(1); M5.Lcd.setCursor(0,64,2); M5.Lcd.print(AscStr); M5.Lcd.setTextFont(1); // ハイライトオフで漢字表示 M5.Lcd.highlight(false); M5.Lcd.setCursor(0,102); M5.Lcd.writeHzk(GbkStr); // ハイライトオンで漢字表示 M5.Lcd.highlight(true); M5.Lcd.setCursor(0,122); M5.Lcd.writeHzk(GbkStr); } void loop() { }
サンプルのHZK16を少しだけ改造してあります。HZKフォントは等角フォントなので、標準のプロポーショナルフォントとはASCII文字でも表示が異なります。
実行結果

表示されていますね。ただし、これってGBK文字コードで、フォントも中国語しかないので、まあ使えません。
仕組み的には同じ方法で、日本語フォントもプログラム内蔵できるので今度チャレンジしてみたいと思います。
コメント