R8/4/17:新規
LCD1602上のBigFontLCDで3行分のBig_Fontを表示
20桁×4行のI2c_LCDを入手し、以前に作成した2行のBig_Fontを表示させてみました。以前のLCDは16桁×2行ですから、別の2行がその他の表示に利用できて有用なのですが、折角LCDが大型化したので、文字も大きくならないかと思いました。
2行3桁を使ったBig_Fontは、web上にいろいろ紹介されていますが、3行の物は見つかりませんでした。
Big_Fontの仕組みは何とか理解出来ましたので、3行のBig_Fontを自分で作って見ることにしました。当面必要なのは数字とコロン(:)だけですから、短時間で私流にでっち上げてみました。
LCD2004上の3行BigFont<使用部品について:>
- ◎PIC : 12F683:汎用性の高い手持ちのものを使いました。
- ◎LCD : Youmile I2C 20x4LCD:20文字4行のバックライト付きです。(97x40mm)裏側にPCF8574T シリアルインターフェースモジュールが付いています。
- ◎回路はブレッドボード上に配線しました。
![]()
<テスト回路について>
- 開発環境は、MPLAB IDE v8.84 HI-TECH C v9.83です。
- 動作テスト用ですから、LCDにはカウントアップする数字(分:秒)が表示されるだけです。(画像参照)
- 電源をOnすると、1行目に(LCD Test)の文字、2~4行目にBigFontで秒分がカウントアップされます。
- タクトスイッチ(GP1)を押すと、カウントアップが一時停止し、再び押すと再動作します。(9:59で0に戻ります。)
- GP2につながるLEDは、動作確認のためです。裏側のコントラスト用のVRを動かさないと文字が表示されていないように見えます。
<プログラムついて>==>ソース(Hi_tech_c)
- 20文字4行のLCDは20x4個の縦長の窓があり、元々はその1つずつに1文字を表示しますが、このBigFontは横3桁x縦3行で大きな文字1つを表示するものです。
- 1つの窓は横5×縦8個の点(ドット)で構成されています。
- LCDには0x00~0x07(窓8個分)の自作定義文字(CGRAM)の領域がありますので、その1つずつの窓を大文字の部品として定義し、組み合わせて大きな文字を表示します。
![]()
- 次の部分はCGRAMに格納するドットのデータです。1バイトデータのようですが、実際に格納されるのは下位5ビット(横5ドット分)です。最上部(0x00上3行)では、1~3行目までは(1F=11111)でドット有りで下の5行は(00)で空です。
- const char custom[][8] = {
{ 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 },// 0x00上3行
{ 0x18, 0x1C, 0x1E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F },// 0x01右上角空
{ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x07, 0x03 },// 0x02左下角空
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F },// 0x03下3行
{ 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1C, 0x18 },// 0x04右下角空
{ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x1F, 0x1F },// 0x05左上大空
{ 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00 },// 0x06中3行
{ 0x03, 0x07, 0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F } // 0x07左上角空
};- この0x00~0x07の部品と0x20(空白)と0xFF(塗りつぶし)を組み合わせて、BigFont(数字)を作ります。
- 次のデータは、右端に示す数字データの部品の並びです。左から3個ずつ3行(段)に並べます。11番目にはコロンを入れました。
- const char BigNum[11][9] = { // キャラクターのアドレス
{ 0x07, 0x00, 0x01, 0xFF, 0x20, 0xFF, 0x02, 0x03, 0x04 }, // 0
{ 0x00, 0x01, 0x20, 0x20, 0xFF, 0x20, 0x03, 0xFF, 0x03 }, // 1
{ 0x00, 0x00, 0x01, 0x03, 0x05, 0x04, 0xFF, 0x03, 0x03 }, // 2
{ 0x00, 0x00, 0x01, 0x20, 0x06, 0xFF, 0x03, 0x03, 0x04 }, // 3
{ 0xFF, 0x20, 0xFF, 0x02, 0x03, 0xFF, 0x20, 0x20, 0xFF }, // 4
{ 0xFF, 0x00, 0x00, 0x00, 0x06, 0x03, 0X03, 0X03, 0X04 }, // 5
{ 0x07, 0x00, 0x00, 0xFF, 0x06, 0x03, 0X02, 0X03, 0X04 }, // 6
{ 0x00, 0x00, 0x01, 0x20, 0x05, 0x04, 0X20, 0XFF, 0X20 }, // 7
{ 0x07, 0x00, 0x01, 0xFF, 0x06, 0xFF, 0X02, 0X03, 0X04 }, // 8
{ 0x07, 0x00, 0x01, 0x00, 0x06, 0xFF, 0X03, 0X03, 0X04 }, // 9
{ 0x20, 0x03, 0x20, 0X20, 0X20, 0X20, 0x20, 0x00, 0x20 } // :
};- Hyouji()では、先にTimeから分と秒に表示する数字を求め、後半にBigNum[11][9]からそのデータを呼び出して、3桁ずつ3段に表示しています。
- 表示文字が4桁ごとなのは、文字間を1桁空けるためです。
- 今回は大きな数字のテストなので、Timeのインクリメントは(タイマを使わず)delayによる1秒ごとです。
![]()
- コンパイルの結果は、プログラムスペース使用率が約60%ですから、まだまだ余裕はあります。
- ◎参照させていただいたページ
ありがとうございました。
- http://ja3rua.ddns.net/html2/pic/cgram.html
- https://woodsgood.ca/projects/2015/02/17/big-font-lcd-characters/
- http://arms22.blog91.fc2.com/blog-entry-439.html